gpt4 book ai didi

flutter - 为 Flutter 中的 Firebase 身份验证设置自定义声明

转载 作者:行者123 更新时间:2023-12-03 23:11:53 27 4
gpt4 key购买 nike

我正在为应用程序使用 Firebase auth,但作为用户创建的一部分,我需要设置一些自定义声明。

我编写了一个云函数来在创建用户时设置声明:

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

// On sign up.
exports.processSignUp = functions.auth.user().onCreate(user => {

let customClaims;

// Set custom user claims on this newly created user.
return admin.auth().setCustomUserClaims(user.uid, {
'https://hasura.io/jwt/claims': {
'x-hasura-default-role': 'user',
'x-hasura-allowed-roles': ['user'],
'x-hasura-user-id': user.uid
}
})
.then(() => {
// Update real-time database to notify client to force refresh.
const metadataRef = admin.database().ref("metadata/" + user.uid);
// Set the refresh time to the current UTC timestamp.
// This will be captured on the client to force a token refresh.
return metadataRef.set({
refreshTime: new Date().getTime()
});
})
.then(() => {
return admin.auth().getUser(user.uid);
})
.then(userRecord => {
console.log(userRecord);
return userRecord.toJSON();

})
.catch(error => {
console.log(error);
});
});

当我打印到控制台 userRecord 时,我可以看到自定义声明设置正确。

然后在 flutter 中,我从创建的用户那里获得了 token ,但它似乎没有附加自定义声明。

我正在使用此代码创建用户并在 flutter 中打印声明
    Future<FirebaseUser> signUp({String email, String password}) async {
final FirebaseUser user = (await auth.createUserWithEmailAndPassword(
email: email,
password: password,
)).user;

IdTokenResult result = await (user.getIdToken(refresh: true));
print('claims : ${result.claims}');

return user;
}

如果我在 jwt 调试器中检查 token 本身,我可以看到它没有自定义声明。
一旦设置了声明,我是否需要一些额外的步骤来尝试获取更新的 token ?
我试过 user.reload()user.getIdToken(refresh: true) 但它们似乎没有帮助。

关于如何获取具有自定义声明的 token 的任何想法?

最佳答案

您显示的代码可能会在创建帐户后过早地尝试获取自定义声明。调用 auth.createUserWithEmailAndPassword 后,函数需要几秒钟才能触发。它是异步运行的,完全不会阻碍用户创建的过程。因此,在调用 user.getIdToken(refresh: true) 之前,您需要以某种方式等待函数完成。

这正是我在 this blog post 中解决的问题。我提供的解决方案如下:

  • 客户端:创建用户
  • 客户端:WAITING在 Firestore 中创建具有用户 UID 的文档
  • 服务器:Auth onCreate 函数触发
  • 服务器:函数完成其工作
  • 服务器:最后,函数使用新用户的 UID 将数据写入新文档
  • 客户端:数据库监听器在创建文档时触发

  • 然后,您将在客户端上添加更多步骤以在它看到新文档后刷新 ID token 。

    帖子中给出的代码适用于 web/javascript,但该过程适用于任何客户端。您只需要让客户端等待该功能完成,Firestore 是一个方便的传递该信息的地方,因为客户端可以实时收听它。

    read this post 也是一种让客户端根据写入 Firestore 文档的声明立即刷新其 token 的方法。

    最重要的是,您需要在客户端和服务器之间同步大量代码。

    关于flutter - 为 Flutter 中的 Firebase 身份验证设置自定义声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60724002/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com