Firebase:在不要求用户再次登录的情况下管理与服务器的用户会话?

Firebase:在不要求用户再次登录的情况下管理与服务器的用户会话?,firebase,firebase-authentication,google-cloud-functions,firebase-admin,Firebase,Firebase Authentication,Google Cloud Functions,Firebase Admin,我们有一个RESTAPI(Python+Flask),通过Google云函数向外部用户公开。我们还有一个web应用程序(React),它使用此API在web上显示结果。因此,我们的功能有两个接口:RESTAPI和Web 现在根据新的要求,我们正在我们的网站上实施用户注册/登录模块(使用电子邮件和密码),以便只有注册/登录的用户才能在网站上看到结果 我们计划使用Firebase。在我们的网站中集成Firebase客户端SDK是很简单的(添加了一个新的登录页面,用户可以登录,一旦登录,他们将保持登录

我们有一个RESTAPI(Python+Flask),通过Google云函数向外部用户公开。我们还有一个web应用程序(React),它使用此API在web上显示结果。因此,我们的功能有两个接口:RESTAPI和Web

现在根据新的要求,我们正在我们的网站上实施用户注册/登录模块(使用电子邮件和密码),以便只有注册/登录的用户才能在网站上看到结果

我们计划使用Firebase。在我们的网站中集成Firebase客户端SDK是很简单的(添加了一个新的登录页面,用户可以登录,一旦登录,他们将保持登录状态,直到清除浏览器cookie)

我们还希望为RESTAPI的用户提供类似的身份验证。API用户将首先在我们的网站上注册。我们将再公开一个REST API
SignIn
,他将在其中传递注册的电子邮件和密码,我们将使用Firebase
SignInWithPassword
(Firebase Admin SDK/Firebase REST API)对其生效,并返回ID令牌/刷新令牌。现在,在使用任何其他公开的API时,用户需要将这些令牌发送到IDToken/RefreshToken,我们将使用
verifyidtoken()
对其进行验证

问题在于ID令牌的寿命很短(1小时到期),在此之后,
VerifyIdToken
将失败。现在,我们不希望API用户再次调用
SignIn
API来获取新的ID令牌/RefreshToken,也不希望API用户访问我们的网站来获取任何此类令牌

我们有没有办法刷新API的用户ID令牌而不要求他再次登录?

在Web客户端上管理令牌 网站客户端代码可以调用:

如果当前令牌尚未过期,则返回该令牌。否则,这将刷新令牌并返回一个新令牌

每次向服务器发送令牌时,都需要调用该函数


或者,可以通过会话cookie管理用户会话

Firebase Auth为依赖会话cookie的传统网站提供服务器端会话cookie管理。与客户端短期ID令牌相比,此解决方案有几个优点,客户端短期ID令牌可能每次都需要重定向机制来在到期时更新会话cookie:

  • 通过只能使用授权服务帐户生成的基于JWT的会话令牌提高了安全性
  • 使用JWTs进行身份验证带来的所有好处都是无状态会话cookie。会话cookie与ID令牌具有相同的声明(包括自定义声明),从而使相同的权限检查可在会话cookie上强制执行
  • 能够创建会话cookie,自定义过期时间从5分钟到2周不等
  • 根据应用程序要求实施cookie策略的灵活性:域、路径、安全、
    httpOnly
  • 当使用现有的刷新令牌吊销API怀疑令牌被盗时,能够吊销会话cookie。
    • 能够在主要帐户更改时检测会话撤销