PKCE:重定向端点如何知道 code_verifier?

PKCE: How does the redirection endpoint know the code_verifier?

我有一个关于 PKCE (RFC 7636) 的问题。使用授权代码授权的 OAuth 客户端有两个组件:(1) 资源所有者设备上发起授权请求的部分和 (2) 服务器上可以接受和发送 HTTPS 消息的重定向端点。

OAuth 的 PKCE 扩展让客户端这样做:

  1. 生成一个名为 code_verifier 的加密随机字符串。
  2. 创建 code_verifier 的 SHA-256 摘要并对其进行 Base64 编码。 将其与授权请求一起发送。
  3. 当客户端获取到授权码并发送到token 访问令牌的端点,包括原始 code_verifier 值。

第 2 步发生在资源所有者的设备上。资源所有者批准请求后,his/her 浏览器将重定向到客户端的重定向端点。第 3 步发生在重定向端点。

那么问题来了,重定向端点是怎么知道code_verifier这个值的呢?它是在资源所有者的设备上生成的。

So the question is, how does the redirection endpoint know the code_verifier value? It was generated on the resource owner's device.

因为重定向端点有效地路由到调用授权端点的同一设备上的端点。

它可能被注册为环回重定向、app-claimed 重定向或自定义 URL 方案,但设备会将重定向路由到适当的应用程序或应用程序将监听适当的环回端口。

OAuth clients that use the authorization code grant have two components: (1) the portion on the resource owner's device that initiates the authorization request and (2) a redirection endpoint on a server that can accept and send HTTPS messages.

机密客户端在服务器上有一个重定向端点,可以接受和发送 HTTPS 消息。

Public 客户端没有 - 使用 PKCE 的本机客户端是 still public clients.

基于所提供的信息,PKCE 旨在确保重定向 URI 路由回请求应用程序,而不是通过授权代码拦截攻击路由回恶意应用程序。在这种情况下,合法应用会知道验证者,但恶意应用不会知道验证者。

PKCE 合法应用流程

合法的应用程序流程如下所示,其中授权令牌请求被重定向回 SystemBrowser,然后返回到原始 NativeApp。

授权码拦截攻击

可以将恶意应用程序引入 OS。不管有没有PKCE,本机应用程序都可以收到授权码,但它不会知道验证者,因此无法完成令牌交换。