- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 Firebase Auth 进行登录的 Next.js WEB/Node 应用上调试 session 超时问题。我正在利用自定义 token 来实现精细的 Firestore 安全规则。在调试时,我发现我发送到后端以创建自定义 token 的 idToken 在初始客户端调用后似乎是自定义 token 本身。至少它包含我的自定义声明,据我从文档中了解到,服务器只能按照 https://firebase.google.com/docs/auth/admin/verify-id-tokens 上的明显红色通知处理 idTokens。 。我不知道这是否是超时错误的根源,但这看起来很奇怪。
更新
在调查解码 token 上不存在 picture
字段的原因时,我发现 createCustomToken
的第一个参数错误地是用户集合文档的 firestore 文档 ID而不是 id token 的 uid
字段。所有相同的澄清问题仍然适用。不过,我希望这个失误能够解决问题。它使 picture
字段在 token 的后续解码中返回。但是, token 仍然有我的自定义声明,这可能仍然是问题,也可能不是问题。
首次登录
网络客户端代码
signInResult = await firebase.auth().signInWithPopup(googleProvider);
//... exception handling ...
const { user } = signInResult;
const fbToken = await user.getIdToken();
// axios POST request to backend with fbToken in data payload
使用 FB 管理客户端的后端代码
decodedToken = await adminClient.auth().verifyIdToken(data.fbIdToken);
//... validation and exception handling ...
// . If I log out decodedToken:
{ name: 'Blaine Garrett',
picture: '...',
iss: '...',
aud: '...',
auth_time: 1569160850,
user_id: '...',
sub: '...',
iat: 1569160850,
exp: 1569164450,
email: '...',
email_verified: true,
firebase:
{ identities: { 'google.com': [Array], email: [Array] },
sign_in_provider: 'google.com' },
uid: '...' }
{ issued: 2019-09-22T14:00:50.000Z,
expires: 2019-09-22T15:00:50.000Z }
let userId = decodedToken.uid; // As per update, this was not the case originally
// Build custom claims
customToken = await adminClient.auth().createCustomToken(userId, additionalClaims);
// return customToken in a 200 response
在客户端的服务器响应中
...
await firebase.auth().signInWithCustomToken(customToken);
...
后续调用如果我在上述 signInWithCustomToken
之后调用 const firebaseIdToken = wait firebase.auth().currentUser.getIdToken();
并将结果发送到后端并记录 token ,解码后的 token 是:
{ email: '...',
user_roles: [ 'admin', 'support' ], // <-- my custom claims
iss: '...',
aud: '...',
auth_time: 1569161153,
user_id: '...',
sub: '...',
iat: 1569161163,
exp: 1569164763,
firebase: { identities: {}, sign_in_provider: 'custom' },
uid: '...' }
{ issued: 2019-09-22T14:06:03.000Z,
expires: 2019-09-22T15:06:03.000Z }
// Note: not everything is present on this token, including `picture` property and `email_verified`, etc
因此,即使我在客户端上调用 currentUser.getIdToken()
,它似乎是我的自定义 token - 或者至少缺少我的自定义声明和一些原始 id token 字段。
这是预期的行为吗?即,如果之前调用过signInWithCustomToken,则getIdToken将返回自定义 token 。
如果给定 token 是自定义 token ,尝试在服务器上使用 verifyIdToken 是否有效?
这实际上是一个自定义 token 还是 FB 只是保留声明。 (缺少的个人资料字段让我感到困惑)。
有没有办法区分自定义 token 和 idToken?
上述每次更新能够为 createCustomToken 的第一个参数发送任意值的目的是什么?例如。我通过了 asdf
并且 token 被很好地类型转换并且随后被很好地解码。这会影响 session 超时吗?
感谢您的任何见解。再说一次,我不知道这是否是超时问题的根源,但我在尝试调试时遇到了这个问题,这让我质疑我对文档的理解。
最佳答案
当您向 Firebase 身份验证用户帐户添加自定义声明时,客户端不会立即“看到”它们,直到其 ID token 以某种方式刷新。此行为是documented :
After new claims are modified on a user via the Admin SDK, they are propagated to an authenticated user on the client side via the ID token in the following ways:
- A user signs in or re-authenticates after the custom claims are modified. The ID token issued as a result will contain the latest claims.
- An existing user session gets its ID token refreshed after an older token expires.
- An ID token is force refreshed by calling currentUser.getIdToken(true).
因此,如果您需要客户端立即开始使用新声明,您应该使用第三个要点强制刷新。将 true
传递给 getIdToken。
关于javascript - Firebase currentUser.getIdToken() 在signInWithCustomToken后返回自定义 token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58050178/
使用新的 firebase 版本,您需要在我的 firebase 应用程序中通过 node.js 访问。 var firebase = require("firebase"); var parms={
我使用 signInWithCustomToken 方法通过来自另一个应用的重定向在我的单页应用中建立登录。 在我的 SPA 中,我想让用户通过 currentUser.updatePassword(
我正在使用带有自定义身份验证的 firebase 9.x。根据文档, token 到期时间不能超过一小时。是否有一个我可以注册的监听器,当 token 过期时将调用它。 该文档还讨论了 token 的
我在使用 Firebase 的 signInWithCustomToken 登录时遇到问题。我是出现如下错误: Error creating custom token: TypeError: fire
我正在为使用 Ionic 制作的移动应用程序使用 Firebase 自定义身份验证系统,并且我使用 Laravel 5.2 作为自定义身份验证后端。 当新用户注册时,我在 laravel 中生成一个
我想通过共享 JWT token 对多个网站上的用户进行身份验证。该 token 最初是由 firebase 生成的,所以我认为它是一个很好且有效的 token (在 jwt.io 上测试过,似乎没问
我试图了解使用 token 的 Firebase 自定义身份验证方法,但文档对我来说并不是那么清楚。在尝试使用 JWT 生成器之前,我想检查是否有一种方法可以使用身份验证响应 token 通过 jav
所以我创建了一个自定义 token const token = authRef.createCustomToken(options.userId, { app: appRootName,
我是一名优秀的程序员,十分优秀!