我们有一个REST API(Python + Flask),可通过Google云功能向外部用户公开。我们还有一个Web应用程序(React),该应用程序使用此API在网络上显示结果。因此,我们有两个功能接口:REST API和Web。
现在,根据新要求,我们正在网站上实施用户注册/登录模块(使用电子邮件和密码),以便只有注册/登录的用户才能在网站上看到结果。
我们计划使用Firebase。直接将Firebase Client SDK集成到我们的网站中(添加了一个新的登录页面,以便用户可以登录,并且一旦登录,他们将保持登录状态,直到清除浏览器Cookie)。
我们也希望对REST API的用户进行类似的身份验证。 API用户将首先在我们的网站上注册。我们将再公开一个REST API SignIn
,他将在其中传递注册的电子邮件和密码,我们将使用Firebase SignInWithPassword
(Firebase Admin SDK / Firebase REST API)对其进行验证,并返回ID令牌/刷新令牌。 。现在,在使用任何其他公开的API时,用户需要发送这些令牌IDToken / RefreshToken,我们将使用VerifiyIDToken()
进行验证。
问题在于ID令牌存在时间短(有效期为1小时),之后VerifyIdToken
将失败。现在,我们不希望API用户再次调用SignIn
API以获得新的ID令牌/ RefreshToken或访问我们的网站以获取任何此类令牌。
有什么方法可以刷新API的用户ID令牌,而无需让他再次登录?
答案 0 :(得分:2)
网站客户代码可以调用User.getIdToken(forceRefresh?: boolean):
返回当前令牌(如果尚未过期)。否则,这将刷新令牌并返回一个新令牌。
每次将令牌发送到服务器时都需要调用此方法。
或者,可以通过会话cookie管理用户会话。
Firebase Auth为依赖会话cookie的传统网站提供服务器端会话cookie管理。与客户端短暂的ID令牌相比,此解决方案具有多个优点,后者可能每次需要使用重定向机制来在到期时更新会话cookie:
- 通过基于JWT的会话令牌(只能使用授权的服务帐户生成)来提高安全性。
- 无状态会话cookie,它具有使用JWT进行身份验证的所有好处。会话cookie具有与ID令牌相同的声明(包括自定义声明),从而使对会话cookie可执行相同的权限检查。
- 能够创建自定义有效期为5分钟到2周的会话cookie。
- 根据应用程序要求(域,路径,安全性,
httpOnly
等)强制执行cookie策略的灵活性。- 当怀疑使用现有的刷新令牌吊销API盗窃令牌时,可以撤销会话cookie。
- 能够检测到主要帐户更改后的会话撤销。