首页 > 解决方案 > 在 OpenID 连接授权代码流中使用 PKCE 时我们需要 client_secret 吗?

问题描述

根据PKCE 规范,OAuth 提供者使用 code_verifier 来避免中间人攻击。我的理解是,它是基于 JavaScript 的单页应用程序 (SPA) 将 OAuth 代码交换为令牌的最佳选择。

当我用 Google API 进行实验时,它说“client_secret is missing”。

这是 HTTP 请求和响应。

ID:1 地址:https : //oauth2.googleapis.com/token Http-Method:POST Content-Type:application/x-www-form-urlencoded Headers:{Content-Type=[application/x-www-form- urlencoded], Accept=[ / ]} Payload: grant_type=authorization_code&code=4%2F1AH3Ubnm550IoT8AZ_e_eqLYDn3-JyXVo22LOcAlsWPnxTV_o0tV2N1YMNFtqhvFm65n4tuZmHfK5tkKLOsbnRw&scope=openid+profile+email&redirect_uri=https%3A%2F%2Flocalhost%3A8443%2Fdemo&client_id=myclientid.apps.googleusercontent.com&code_verifier=iv8n89-Dh3QD1uroYm6e6jcpZwxff60m -RYYlmLYArun6KF8o0z%7Ee3EjyVyYUp.4XxSbyI47QQSCMrY542sLWSUnxAG8e0a%7ETjmF_UFioJMA_ctB2jz6qbcYtu9uUOKp

ID:1 响应代码:400 编码:UTF-8 内容类型:application/json;charset=utf-8 标头:{Accept-Ranges=[none], Alt-Svc=[h3-28=":443"; ma=2592000,h3-27=":443"; ma=2592000,h3-25=":443"; ma=2592000,h3-T050=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; 马=2592000;v="46,43"],缓存控制=[私有],内容类型=[应用程序/json;charset=utf-8], Date=[Mon, 22 Jun 2020 04:41:53 GMT], Server=[scaffolding on HTTPServer2], transfer-encoding=[chunked], Vary=[Origin,Accept-Encoding, Referer, X-Origin],X-Content-Type-Options=[nosniff],X-Frame-Options=[SAMEORIGIN],X-XSS-Protection=[0]} 有效载荷:{“错误”:“invalid_request”、“error_description”:“client_secret 丢失。” }

我的理解是“我们在传递 code_verifier 时不需要 client_secret”是错误的还是 Google 不支持 PKCE 或者我错过了请求中的其他参数?请帮忙。

标签: oauth-2.0google-apiopenid-connectpkce

解决方案


在尝试使用最新的Single Page App Standards时,我查看并遇到了同样的问题。查看 Google 文档,他们的实现似乎仍然基于隐式流程

我确认您可以发送response_type='token id_token'并成功获取令牌,但我也更喜欢使用授权代码流 (PKCE)。


推荐阅读