OAuth 2.0:在授权代码流中,谁最终将访问令牌交给我的网络浏览器?

OAuth 2.0: In the authorization code flow, who eventually hands the access token to my web browser?

我正在学习 OAuth 2.0。

在 OAuth 2.0 中,术语“授权类型”是指应用程序获取访问令牌的方式。

在隐式流程中,授权服务器会将浏览器重定向回应用程序指定的 redirect_uri,并向 URL 的片段部分添加令牌和状态。所以我认为最终用户的网络浏览器将获得 access_token 值。

但是在代码流中,Auth 服务器似乎会向我的网络浏览器提供一个临时代码,然后我的网络浏览器会向附加了此代码的应用程序发送 http 请求。然后应用程序调用 Auth 服务器的 /oauth/token 端点以将临时代码与访问令牌交换,因此它最终从 auth 服务器获取访问令牌。

那么故事就这样结束了吗?

应用程序是否进一步向我的网络浏览器提供访问令牌?

我一直假设我能够与应用程序交互(在我使用应用程序时向它发送越来越多的 HTTP 请求),每个 http 请求都会附加一个访问令牌,这样请求对命中应用程序的端点有效。

但是在代码流中,我作为最终用户,在完成 OAuth 代码流并开始与应用程序交互后,浏览器中似乎没有访问令牌?

应用程序如何知道我确实是当时的我?

浏览器不需要访问令牌,因为它不能用它做任何事情。浏览器无法像理解和处理 cookie 那样理解或处理访问令牌。

在隐式流程中,令牌被发送到浏览器,但假设您在浏览器中有自己的应用程序 运行(通常是单页应用程序),它将读取令牌并附加它对任何后续请求。或者,如果您使用 OpenID Connect 和 ID 令牌对用户进行身份验证,则使用该令牌的内容。

当浏览器向您的应用程序发送授权代码并且您的应用程序将其交换为访问令牌时,您的应用程序应在该浏览器中为用户建立会话。然后,当同一用户向您的应用发出请求时,您可以使用分配给该用户会话的访问令牌。

通常,您的应用会使用此访问令牌来调用其他一些 API,但如果您只需要该访问令牌来识别用户并让用户访问您的应用,那么您真正需要的很可能是旧的会话,而不是 OAuth。