根据PKCE spec,OAuth提供者使用code_verifier来避免中间人攻击。我的理解是,这是基于JavaScript的单页应用程序(SPA)将OAuth代码交换为令牌的最佳选择。
当我尝试使用Google API时,它说“缺少client_secret”。
这是HTTP请求和响应。
ID:1 地址:https://oauth2.googleapis.com/token Http方法:POST 内容类型:application / x-www-form-urlencoded 标头:{Content-Type = [应用程序/ x-www-form-urlencoded],Accept = [ / ]} 有效载荷:grant_type = authorization_code&代码= 4%2F1AH3Ubnm550IoT8AZ_e_eqLYDn3-JyXVo22LOcAlsWPnxTV_o0tV2N1YMNFtqhvFm65n4tuZmHfK5tkKLOsbnRw&范围=的OpenID +轮廓+电子邮件&REDIRECT_URI = HTTPS%3A%2F%2Flocalhost%3A8443%2Fdemo&CLIENT_ID = myclientid.apps.googleusercontent.com&code_verifier = iv8n89-Dh3QD1uroYm6e6jcpZwxff60m-RYYlmLYArun6KF8o0z%7Ee3EjyVyYUp.4XxSbyI47QQSCMrY542sLWSUnxAG8e0a%7ETjmF_UFioJMA_ctB2jz6qbcYtu9uUOKp < / p>
ID:1 响应码:400 编码:UTF-8 内容类型:application / json;字符集= 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”; ma = 2592000; v =“ 46,43”],Cache-Control = [私有],content-type = [应用程序/ json; charset = utf-8],日期= [2020年6月22日星期一,格林尼治标准时间],服务器= [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,还是我在请求中错过了其他一些参数?请帮忙。
答案 0 :(得分:1)
我尝试使用最新的Single Page App Standards时遇到了同样的问题。查看Google文档,其实现似乎仍基于implicit flow。
我确认您可以发送 response_type ='token id_token'并成功获取令牌,尽管我也希望使用授权码流(PKCE)。