如何将 Firebase 会话 Cookie 延长超过 2 周

Dav*_*are 3 firebase firebase-authentication

我正在使用 Firebase Auth 让用户使用其 Google 帐户进行身份验证。我发现返回的tokenfirebase.auth().currentUser.getIdToken只有1小时有效。为了让会话持续更长时间,我尝试创建一个会话 cookie,如管理会话 Cookie中所述:

const expiresIn = 60 * 60 * 24 * 5 * 1000;
admin.auth().createSessionCookie(idToken, {expiresIn}).then((sessionCookie) => {
    const options = {maxAge: expiresIn, httpOnly: true, secure: true};
    res.cookie('session', sessionCookie, options);
    res.end(JSON.stringify({status: 'success'});
}
Run Code Online (Sandbox Code Playgroud)

此代码成功创建了会话 cookie,并且可以使用 验证后续请求admin.auth().verifySessionCookie。一切都很好,直到我尝试增加expiresIn持续时间。事实证明,Firebase 会话 Cookie 的最长过期时间为 2 周。来自文档

能够创建自定义过期时间从 5 分钟到 2 周不等的会话 cookie。

对于这个项目,我希望用户登录一次并保持登录状态。我尝试在与服务器的每次交互中扩展会话,但我没有找到任何有关如何执行此操作的官方文档。admin.auth().createSessionCookie使用 返回的令牌调用服务器似乎是有意义的admin.auth().verifySessionCookie,但失败并出现以下错误:

Failed to extend session: { Error: An internal error has occurred. Raw server response: "{"error":{"code":400,"message":"Invalid value at 'valid_duration' (TYPE_INT64), 604.8","errors":[{"message":"Invalid value at 'valid_duration' (TYPE_INT64), 604.8","domain":"global","reason":"badRequest"}],"status":"INVALID_ARGUMENT"}}"`enter code here`
    at FirebaseAuthError.Error (native)
    at FirebaseAuthError.FirebaseError [as constructor] (/user_code/node_modules/firebase-admin/lib/utils/error.js:39:28)
    at FirebaseAuthError.PrefixedFirebaseError [as constructor] (/user_code/node_modules/firebase-admin/lib/utils/error.js:85:28)
    at new FirebaseAuthError (/user_code/node_modules/firebase-admin/lib/utils/error.js:143:16)
    at Function.FirebaseAuthError.fromServerError (/user_code/node_modules/firebase-admin/lib/utils/error.js:173:16)
    at /user_code/node_modules/firebase-admin/lib/auth/auth-api-request.js:726:49
    at process._tickDomainCallback (internal/process/next_tick.js:135:7)
  errorInfo: 
   { code: 'auth/internal-error',
     message: 'An internal error has occurred. Raw server response: "{"error":{"code":400,"message":"Invalid value at \'valid_duration\' (TYPE_INT64), 604.8","errors":[{"message":"Invalid value at \'valid_duration\' (TYPE_INT64), 604.8","domain":"global","reason":"badRequest"}],"status":"INVALID_ARGUMENT"}}"' },
  codePrefix: 'auth' }
Run Code Online (Sandbox Code Playgroud)

是否可以在服务器端扩展 Firebase 会话而不需要客户端执行任何工作?是否可以将 Firebase 身份验证与寿命超过 2 周的令牌一起使用?如果没有,是否有一种标准方法可以实现令人难以置信的长寿命会话?

boj*_*eil 5

延长时间太长可能会有风险,就像 cookie 泄露一样,攻击窗口将会相当宽。我不建议延长会话时间,但如果这是必需的,您可以尝试执行以下操作:

  1. 在为用户验证服务器上的会话 cookie 并注意到它即将过期之后。
  2. 使用 Admin SDK 为该用户 ID 创建自定义令牌
  3. signInWithCustomToken使用该自定义令牌。
  4. user.getIdToken()获取新的 ID 令牌。
  5. 将该 ID 令牌交换为新的会话 cookie。

缺点是会话 cookie 中的声明将对应于自定义令牌用户。

请注意,对于客户端会话,传递的 ID 令牌的持续时间为一小时,即使会话是无限期的。这是因为刷新令牌存在于设备上并用于交换新的 ID 令牌。在任何时候,仅传输 ID 令牌,如果令牌泄露,攻击窗口将被限制为一小时。

我认为 Firebase Auth 提供活动持续时间功能会很有用。这对于以短增量连续延长会话会更好。这比铸造一个无限期或很长的 cookie 更好。活跃用户的会话会不断延长。Firebase Auth 不提供此功能,但您可以为其提交功能请求。