Javascript 向onCreate user firebase cloud函数添加自定义声明

Javascript 向onCreate user firebase cloud函数添加自定义声明,javascript,node.js,firebase,firebase-authentication,google-cloud-functions,Javascript,Node.js,Firebase,Firebase Authentication,Google Cloud Functions,我正在尝试使用firebase云函数在创建新用户时添加一些自定义声明。根据自定义声明,我需要向创建的用户添加一个用户角色 我尝试过一些教程,其中用户角色是在用户创建后添加的。但是我想在创建用户时添加自定义声明并返回响应 const functions = require('firebase-functions'); const admin = require('firebase-admin'); admin.initializeApp(functions.config().firebase);

我正在尝试使用firebase云函数在创建新用户时添加一些自定义声明。根据自定义声明,我需要向创建的用户添加一个用户角色

我尝试过一些教程,其中用户角色是在用户创建后添加的。但是我想在创建用户时添加自定义声明并返回响应

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);

exports.addDefaultUserRole = functions.auth.user().onCreate((user) => {

    let uid = user.uid;

    //add custom claims
    return admin.auth().setCustomUserClaims(uid,{
        isAdmin: true,

    });


});

即使上面的代码在firebase中执行,也没有发生任何事情,响应中也没有收到任何声明。在用户创建时添加自定义声明不是一种好做法吗?不使用上述代码附加自定义声明的原因是什么?

您的云功能代码看起来正常,并且应正确设置自定义声明

exports.addDefaultUserRole = functions.auth.user().onCreate((user) => {

    let uid = user.uid;

    //add custom claims
    return admin.auth().setCustomUserClaims(uid,{
        isAdmin: true
    })
    .then(() => {
         //Interesting to note: we need to re-fetch the userRecord, as the user variable **does not** hold the claim
         return admin.auth().getUser(uid);
    })
    .then(userRecord => {
        console.log(uid);
        console.log(userRecord.customClaims.isAdmin);
        return null;
    }); 
});
您似乎遇到的问题是无法确认索赔设置是否正确。事实上,
setCustomUserClaims()
方法返回一个包含void的非空承诺(除此之外没有其他内容!)

如果要通过日志验证声明是否已正确设置,可以执行以下操作

exports.addDefaultUserRole = functions.auth.user().onCreate((user) => {

    let uid = user.uid;

    //add custom claims
    return admin.auth().setCustomUserClaims(uid,{
        isAdmin: true
    })
    .then(() => {
         //Interesting to note: we need to re-fetch the userRecord, as the user variable **does not** hold the claim
         return admin.auth().getUser(uid);
    })
    .then(userRecord => {
        console.log(uid);
        console.log(userRecord.customClaims.isAdmin);
        return null;
    }); 
});
最后,请注意,在用户创建时添加自定义声明并不是一种“坏习惯”!当您知道要设置哪些声明时,在用户创建时这样做是完全有意义的


希望它能起作用。

您所说的“响应中未收到索赔”是什么意思?身份验证函数没有“响应”,也没有任何后台函数。仅供参考,您的代码现在使所有新帐户成为“管理员”帐户。那真的是你想要的吗?事实上不是。这个代码段只是一个获得想法的演示代码。我需要添加一个默认用户角色。不是管理员用户角色。感谢您的快速回答。我已经试过你的代码了。但是对于console.log(user.customClaims.isAdmin),我在firebase函数日志中发现“未定义”请给我15/20分钟的时间,以便再次检查。为了回答这个问题,我修改了一个代码,它确实适合我。我会再检查一遍。我已经修改了我的答案。您将看到,我们需要重新获取
userRecord
,以获得正确的声明(即刚刚设置的声明)。传递给handler函数的初始
userRecord
不包含声明,也不会更新。(在我为答案改编的代码中,我通过数据库触发器触发声明设置,因此我必须通过这个“额外”步骤获取userRecord)感谢您的努力。不管怎么说,你的回答对我的云功能有效,它确实在日志中打印了管理员值。即使当我尝试从客户端从firebase.auth().currentUser.getIdTokenResult()获取声明时,它也没有在声明对象中获取自定义声明。只有默认声明存在。很高兴我能帮上忙!如果您严格遵守文档,您应该在客户端获得索赔,它工作正常。如果你认为我的回答有帮助,你可以投我的赞成票,见。谢谢