我使用Firebase nodejs admin sdk生成一个自定义令牌,稍后发送到android客户端。我已经成功地使用admin. auth().createCustomToken()
生成令牌。但是,我需要解码此令牌以获取uid
和生成令牌时设置的其他自定义声明。
我已经搜索过了,看来Firebase没有开箱即用的解决方案,使用它的admin sdk来解码自定义令牌(如果我错了,请纠正我)。
我找到的解决方案是使用signInWellCustomToken()
首先获取idToken,然后使用Firebase的admin sdkveryIdToken
方法获取uid。我对这个解决方案有点怀疑,因为我认为它不能提供对我最初设置的自定义声明的访问。
我发现的另一个解决方案是使用jwt
nodejs模块来解码这个令牌。但是,jwt
需要一个API密钥来解码这个令牌。不确定API密钥,因为我首先使用服务号来生成令牌。
现在的问题是:
编辑正如Doug所指出的,我需要解码令牌的原因是获取uid(字符串)和一个附加声明,该声明具有与注册期间设置的postgres用户表相关联的user_id(int)。这些id用于授权某些超文本传输协议请求
此外,我碰巧将自定义令牌作为查询参数附加到密码重置链接。因此,我需要解码令牌以知道哪个用户拥有它。
找到了一个解决方案。我使用了id令牌。在我使用signInWellCustomToken
与fire base android sdk登录后,sdk实际上生成了一个id令牌
。应该根据超文本传输协议请求将id令牌
而不是自定义令牌
发送到服务器。通过在Firebase admin nodejs环境(在服务器上)中使用admin. auth().verifyIdToken(idToken)
方法,我们能够解码令牌以获得最初设置的uid和自定义声明。解码后的令牌如下所示:
{
"is_id_verified": false,
"id": 4,
"iss": "https://securetoken.google.com/my-app-name",
"aud": "my-app-name",
"auth_time": 1628738368,
"user_id": "email@gmail.com",
"sub": "email@gmail.com",
"iat": 1628738369,
"exp": 1628741969,
"firebase": {
"identities": {},
"sign_in_provider": "custom"
},
"uid": "email@gmail.com"
}
您与signInWellCustomToken
一起使用的令牌仅用于在客户端登录用户。无论身份验证方法如何,ID令牌都保持不变,并且可以通过mUser. getIdToken()
方法检索。此后,您可以使用Firebase AdminSDK验证IdToken或使用任何第三方JWT库,以更容易的方式为准。