Firebase Auth setCustomClaims()不起作用

Posted

技术标签:

【中文标题】Firebase Auth setCustomClaims()不起作用【英文标题】:Firebase Auth setCustomClaims() not working 【发布时间】:2020-10-17 07:04:07 【问题描述】:

我在为 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);
    
)

我不知道自己做错了什么,但令牌不包含我在云函数 processSignup() 中设置的自定义声明。我知道函数执行没有错误,因为我可以检查我的函数日志并找到信息条目SUCCESS: Custom claims attached

谁能帮我解决这个问题?

【问题讨论】:

【参考方案1】:

更新声明不会触发onAuthStateChanged(登录或未登录的身份验证状态没有改变,但用户的声明有)并且令牌被铸造然后使用约1小时.

您正在调用getIdTokenResult,但没有强制刷新,请尝试:

let idToken = await user.getIdTokenResult(true);

这将强制从服务器获取一个新令牌,并将(希望)包含您的自定义声明。

【讨论】:

感谢@Michael Bleigh 这么快的回复。你是对的。需要强制刷新令牌。

以上是关于Firebase Auth setCustomClaims()不起作用的主要内容,如果未能解决你的问题,请参考以下文章

firebase.auth().currentUser 为空

Flutter 和 Firebase:任务 ':firebase_auth:compileDebugJavaWithJavac' 执行失败

Xcode Build failed,fatal error: module 'firebase_auth' not found @import firebase_auth;

如何在 firebase-functions 中使用 firebase.auth()?

Auth0 与 Firebase 委托

错误:名称“用户”在库“package:firebase_auth/firebase_auth.dart”和“package:quizmaker/models/user.dart”中定义