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 周的令牌一起使用?如果没有,是否有一种标准方法可以实现令人难以置信的长寿命会话?
延长时间太长可能会有风险,就像 cookie 泄露一样,攻击窗口将会相当宽。我不建议延长会话时间,但如果这是必需的,您可以尝试执行以下操作:
signInWithCustomToken使用该自定义令牌。user.getIdToken()获取新的 ID 令牌。缺点是会话 cookie 中的声明将对应于自定义令牌用户。
请注意,对于客户端会话,传递的 ID 令牌的持续时间为一小时,即使会话是无限期的。这是因为刷新令牌存在于设备上并用于交换新的 ID 令牌。在任何时候,仅传输 ID 令牌,如果令牌泄露,攻击窗口将被限制为一小时。
我认为 Firebase Auth 提供活动持续时间功能会很有用。这对于以短增量连续延长会话会更好。这比铸造一个无限期或很长的 cookie 更好。活跃用户的会话会不断延长。Firebase Auth 不提供此功能,但您可以为其提交功能请求。
| 归档时间: |
|
| 查看次数: |
1872 次 |
| 最近记录: |