首页 > 解决方案 > 如何访问自定义声明?

问题描述

我正在尝试根据此文档文章访问我为我的用户设置的自定义声明。

我在 Firebase Authentication Flutter 插件的类中找不到customClaims成员。FirebaseUser

如何在 Flutter 中访问 Firebase 身份验证自定义声明?

注意:我有以下自定义声明:

"customClaims": {
  "admin": true
}

标签: firebaseflutterdartfirebase-authentication

解决方案


您可以使用 访问用户的声明FirebaseUser.getIdTokenResult
该方法IdTokenResult返回的Future返回值包含有关身份验证令牌的有用信息,例如身份验证时间、令牌的到期时间、登录提供程序等,但它还包含用户的声明,并且还包含您的自定义声明

Future<Map<dynamic, dynamic>> get currentUserClaims async {
  final user = FirebaseAuth.instance.currentUser;

  // If refresh is set to true, a refresh of the id token is forced.
  final idTokenResult = await user.getIdTokenResult(true);
  
  return idTokenResult.claims;
}

如果您现在调用 getter ( await currentUserClaims),它将返回Map<dynamic, dynamic>包含所有用户声明的 a,而不仅仅是自定义声明。这看起来像这样(在这种情况下,用户使用了电话登录提供商):

{
  phone_number: <phone number>,
  firebase: {
    identities: {
      phone: [<phone number>]
    }, 
    sign_in_provider: phone
  }, 
  user_id: <user id>, 
  aud: <project id>, 
  exp: <expiration time in milliseconds since epoch>, 
  iat: <issued at time in milliseconds since epoch>, 
  iss: https://securetoken.google.com/<project id>, 
  sub: <user id>, 
  auth_time: <authentication time in milliseconds since epoch>, 
  admin: true, # This is your custom claim!
}

您可以在最后看到自定义声明。这意味着您可以像这样检查它:

final isAdmin = (await currentUserClaims)['admin'] == true;

推荐阅读