【发布时间】:2021-02-20 04:26:39
【问题描述】:
假设我在同一个域上有一个带有后端的 SPA。如果我必须连接到外部 OAuth 提供者(比如说 Google),授权代码流(没有 PKCE)是更安全的选择。这意味着:
- SPA 向授权服务器请求
code - 然后,它将
code发送到后端 - 后端与 AS 交换
code(和一个秘密)以获得tokens - 后端通过 SPA 设置 Session Cookie 以保持用户登录
此流程是最安全的,因为 SPA 从不会看到单个令牌。它不使用它们。如果我必须使用访问令牌向 API 发出请求,SPA 将向后端发出请求,后端将使用访问令牌来获取资源。并且后端还负责使用 Refresh Token。到目前为止一切顺利。
现在,如果后端在成功交换后(一旦获得令牌)将令牌发送回浏览器会怎样?这样,客户端就可以自行访问 API 的端点。
理论上,如果我没记错的话,应该避免这种情况。将代币还给前端有点违背授权代码授予的目的,您不妨使用带 PKCE 的授权代码直接在前端获取代币,对吧?使用 Code Grant,获得身份验证的是后端,而不是 SPA。
但我在想:这就是 Firebase 的作用,不是吗?据我所知,Firebase 使用授权代码(没有 PKCE),重定向到 Firebase 应用程序的后端 (__auth/handler),然后 它仍然将令牌提供给前端- end(id 令牌、访问令牌、刷新令牌)。
我错过了什么吗?还是在授权码授予结束的时候把token给前端就可以了?
PS。显然,在 Firebase 的情况下,后端实际上不会使用这些令牌,它依赖于我想象的每个请求中发送的浏览器令牌。在我提到的情况下,后端存储这些令牌,所以理论上我将有两组令牌:后端通过代码交换接收的令牌,以及发送到浏览器的令牌(最初它们是相同的,但在第一次刷新后它们是不同的)。后端是否应该完全丢弃令牌并依赖浏览器的令牌?我认为应该是这样,因为如果启用了 Refresh Token Rotation,则在浏览器第一次刷新后后端将有一个无效的 Refresh Token。这种情况快把我逼疯了。我的观点是令牌应该保留在后端,但我试图弄清楚 Firebase 方法如何安全。
【问题讨论】:
标签: firebase oauth-2.0 firebase-authentication openid-connect