code_challange vs OAuth 中的状态参数?有什么不同?

code_challange vs state parameter in OAuth? What is the difference?

我试图从 OAuth 2.0 授权代码流 + PKCE 中了解 code_challangestate 参数之间的区别。

我知道 state 参数是针对 CSRF 攻击的验证,在客户端(例如 Angular SPA)生成(并保存在本地存储中)- 需要从授权返回成功登录后回调中的应用程序,并与之前保存在本地存储中的 state 值进行比较。

code_challange 是基于 code_verifier 生成并保存在 localstorage 中。那么用法上的区别在哪里呢?

我还注意到了一件奇怪的事情——我复制了生成的身份验证 url,它是: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没有任何错误呢?我觉得应该是登录不成功,还是漏了什么?

使用 PKCE,检查 code_challenge 是否正确是在身份验证 server-side 和有效 状态检查 在 client-side.

上完成

有些情况下客户端没有正确检查 state/nonce(或根本不检查),我们添加了 PKCE 让 auth-server 代替检查。认证服务器可以force/require所有客户端都遵循PKCE概念。

我们一起得到了非常强大的保护。

下图展示了PKCE的工作原理