Firebase:在不要求用户再次登录的情况下管理与服务器的用户会话?
我们有一个RESTAPI(Python+Flask),通过Google云函数向外部用户公开。我们还有一个web应用程序(React),它使用此API在web上显示结果。因此,我们的功能有两个接口:RESTAPI和Web 现在根据新的要求,我们正在我们的网站上实施用户注册/登录模块(使用电子邮件和密码),以便只有注册/登录的用户才能在网站上看到结果 我们计划使用Firebase。在我们的网站中集成Firebase客户端SDK是很简单的(添加了一个新的登录页面,用户可以登录,一旦登录,他们将保持登录状态,直到清除浏览器cookie) 我们还希望为RESTAPI的用户提供类似的身份验证。API用户将首先在我们的网站上注册。我们将再公开一个REST APIFirebase:在不要求用户再次登录的情况下管理与服务器的用户会话?,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是很简单的(添加了一个新的登录页面,用户可以登录,一旦登录,他们将保持登录
SignIn
,他将在其中传递注册的电子邮件和密码,我们将使用FirebaseSignInWithPassword
(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。
- 能够在主要帐户更改时检测会话撤销