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

DiP*_*Pix 5 oauth-2.0 openid-connect azure-ad-b2c pkce

我试图了解OAuth 2.0 授权代码流 + PKCEcode_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

我在不同的浏览器中使用了该网址。我能够成功登录。我只在控制台中遇到错误:No matching state found in storage。这是有道理的,因为新浏览器中的本地存储是空的。

但为什么没有任何错误呢code_challange?我想它应该无法登录成功,或者我错过了什么?

And*_*ndy 10

使用 PKCE, code_challenge是否正确的检查是在身份验证服务器端完成的,而有效状态的检查是在客户端完成的。

\n

在某些情况下,客户端没有正确检查状态/随机数(或根本没有),我们添加了 PKCE 来让身份验证服务器代替进行检查。身份验证服务器可以强制/要求所有客户端遵循 PKCE 概念。

\n

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

\n

下图展示了PKCE的工作原理

\n

在此输入图像描述

\n

我最近在博客中发表了有关状态参数的文章:

\n\n