我试图理解OAuth 2.0授权代码流+ PKCE中code_challange
和state
参数之间的区别。
我知道state
参数是针对CSRF攻击的验证,并且在客户端(例如Angular SPA)上生成(并保存在本地存储中)-并且需要在成功登录后从回调中的授权应用程序返回,并与之前保存在本地存储中的state
值进行比较。
而code_challange
是基于code_verifier
生成的,也是在本地存储中生成和保存的。那么使用上的区别在哪里呢?
我也注意到奇怪的事情-我复制生成的认证网址是:https://APP_ADDRESS.b2clogin.com/APP_ADDRESS.onmicrosoft.com/b2c_signupsignin/oauth2/v2.0/authorize?client_id=f9d2b[...]&redirect_uri=http%3A%2F%2Flocalhost%3A4200%2Fauth-callback&response_type=code&scope=f9d2b[...]%20openid&state=31caa207[...]&code_challenge=-MefGRhOo[...]&code_challenge_method=S256&response_mode=query
我在不同的浏览器中使用了该URL。我能够成功登录。我只在控制台中出现了一个错误:No matching state found in storage
。这是有意义的,因为新浏览器中的本地存储为空。
但是为什么code_challange
没有任何错误呢?我想应该是登录不成功,或者我错过了什么吧?
1条答案
按热度按时间v8wbuo2f1#
使用PKCE,检查code_challenge是否正确是在认证服务器端完成的,检查有效的state是在客户端完成的。
有时客户端没有正确检查状态/随机数(或者根本没有检查),我们添加PKCE来让auth服务器进行检查。auth服务器可以强制/要求所有客户端遵循PKCE概念。
我们一起得到了非常强大的保护。
下图显示了PKCE的工作原理
x1c 0d1x的数据
我最近在这里写了一篇关于state参数的博客: