【发布时间】:2020-03-04 13:46:15
【问题描述】:
我正在为我的应用程序使用 Firebase 身份验证,并使用它通过 JWT 令牌向后端 API 验证用户。在 API 后端,我配置了 JWT-secret,它是从这个 url 中提取的非对称密钥:
https://www.googleapis.com/service_accounts/v1/jwk/securetoken@system.gserviceaccount.com
这一切都很好。我最近需要创建一个云函数,它也需要调用 API 后端。为此,我正在使用该功能来创建此处找到的自定义令牌:
https://firebase.google.com/docs/auth/admin/create-custom-tokens
这会使用正确的自定义声明创建我的令牌
let additionalClaims = {
'x-hasura-default-role': 'admin',
'x-hasura-allowed-roles': ['user', 'admin']
}
admin.auth().createCustomToken(userId,additionalClaims).then(function (customToken) {
console.log(customToken);
response.end(JSON.stringify({
token: customToken
}))
})
.catch(function (error) {
console.log('Error creating custom token:', error);
});
但是,当我尝试将它用于后端 API 时,我收到“JWTInvalidSignature”错误。在我的云功能中,我指定了我的 firebase 项目中的服务帐户,但它似乎没有帮助。当我查看解码的两个令牌时,它们肯定来自不同的服务。
自定义令牌
{
"aud":
"https://identitytoolkit.googleapis.com/google.identity.identitytoolkit.v1.IdentityToolkit",
"iat": 1573164629,
"exp": 1573168229,
"iss": "firebase-adminsdk-r2942@postgrest-b4c8c.iam.gserviceaccount.com",
"sub": "firebase-adminsdk-r2942@postgrest-b4c8c.iam.gserviceaccount.com",
"uid": "mikeuserid",
"claims": {
"x-hasura-default-role": "admin",
"x-hasura-allowed-roles": [
"user",
"admin"
]
}
}
来自 FireBase 身份验证的令牌
{
"role": "webuser",
"schema": "customer1",
"userid": "15",
"claims": {
"x-hasura-default-role": "user",
"x-hasura-allowed-roles": [
"user",
"admin"
],
"x-hasura-user-id": "OS2T2rdkM5UlhfWLHEjNExZ71lq1",
"x-hasura-dbuserid": "15"
},
"iss": "https://securetoken.google.com/postgrest-b4c8c",
"aud": "postgrest-b4c8c",
"auth_time": 1573155319,
"user_id": "OS2T2rdkM5UlhfWLHEjNExZ71lq1",
"sub": "OS2T2rdkM5UlhfWLHEjNExZ71lq1",
"iat": 1573164629,
"exp": 1573168229,
"email": "johnny1@gmail.com",
"email_verified": false,
"firebase": {
"identities": {
"email": [
"johnny1@gmail.com"
]
},
"sign_in_provider": "password"
}
}
如何让这个 customToken 与我配置的现有 JWT 密钥一起使用??
【问题讨论】:
标签: firebase google-cloud-platform google-cloud-firestore firebase-authentication google-cloud-functions