我在设置Firebase身份验证服务令牌的自定义声明时遇到问题。我正在使用Cloud函数设置Hasura的自定义声明。云功能在新用户创建事件时执行以设置自定义声明。这是我在云函数中运行的代码
const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp();
exports.processSignup = functions.auth.user().onCreate(user => {
// create custom claims for hasura
const hasuraClaims = {
"x-hasura-default-role": "user",
"x-hasura-allowed-roles": ["user"],
"x-hasura-user-id": user.uid
}
// attach claims to user auth object
return admin.auth().setCustomUserClaims(user.uid, hasuraClaims)
.then(_ => {
functions.logger.info('SUCCESS: Custom claims attached');
})
.catch(err => {
console.log('ERROR: ', err);
})
})
在我的前端网页中,我正在运行以下代码来获取idToken
// subscribe to user state change
firebase.auth().onAuthStateChanged(async user => {
console.log('Firebase auth state changed');
if (user) {
// User is signed in.
window.User = user;
let idToken = await user.getIdTokenResult();
console.log('idToken: ', idToken);
}
})
我不知道自己在做什么错,但是令牌不包含我在Cloud函数processSignup()
中设置的自定义声明。我知道该函数执行没有错误,因为我可以检查函数日志并找到信息条目SUCCESS: Custom claims attached
。
有人可以帮我解决这个问题吗?
答案 0 :(得分:2)
更新声明不会触发onAuthStateChanged
(登录或未登录的auth 状态尚未更改,但用户的声明已更改),令牌被铸造,然后用于〜1h。
您正在呼叫getIdTokenResult
,但没有强制刷新,请尝试:
let idToken = await user.getIdTokenResult(true);
这将强制从服务器获取新令牌,并(希望)包括您的自定义声明。