spring-security 如何创建Firebase身份验证声明?

e1xvtsh3  于 2022-11-11  发布在  Spring
关注(0)|答案(3)|浏览(137)

我正在开发一个需要通过服务器应用程序进行身份验证的Android应用程序。该服务器应用程序是一个使用Spring Security的Sping Boot 应用程序。该服务器应用程序使用自定义身份验证提供程序为用户设置授权。
这是我用来检索idToken的代码:

FirebaseToken firebaseToken = null;

    try {
        FirebaseApp app = FirebaseUtil.getFirebaseApp();
        firebaseToken = FirebaseAuth.getInstance(app).verifyIdTokenAsync(authenticationToken.getIdToken()).get();
    } catch ( InterruptedException | ExecutionException | CancellationException e ) {
        throw new AuthenticationServiceException(e.getMessage());
    } 

    return firebaseToken;

一旦我有了Firebase令牌,我就可以像这样检索声明:

Map<String, Object> claims = token.getClaims();

然后,我可以遍历这些声明,并创建如下所示的权限:

List<GrantedAuthority> authorities = Lists.newArrayList(); 
authorities.add(new SimpleGrantedAuthority("some_role"));

我不知道如何使用Firebase控制台创建索赔。这可能吗?我怀疑我需要使用Firebase数据库,但在Firebase文档中找不到我要找的确切内容。

lb3vh1jj

lb3vh1jj1#

Firebase身份验证的自定义声明当前只能通过Firebase Admin SDK创建。

// Set admin privilege on the user corresponding to uid.
admin.auth().setCustomUserClaims(uid, {admin: true}).then(() => {
  // The new custom claims will propagate to the user's ID token the
  // next time a new one is issued.
});

允许从控制台创建声明也是一个不错的主意,所以我建议您使用file a feature request

flvtvl50

flvtvl502#

您也可以使用Python轻松完成此操作:

auth.set_custom_user_claims(user_id, {"admin":True}, app=None)
zvms9eto

zvms9eto3#

如果您一直在localhost上使用Firebase Emulator Suite,您可能已经注意到,您可以直接在该控制台中编辑用户以添加自定义声明,如{“role”:“admin”}。只需转到Authentication选项卡,单击特定用户的溢出菜单,选择“Edit User”,然后在文本框中设置自定义声明。
您可能在这里发现“Edit User”选项没有出现在生产版Firebase控制台中,因此您需要弄清楚如何对代码执行同样的操作。以下是我在Windows中使用Python、服务帐户和Firebase管理工具设置自定义声明所采取的步骤。在Linux或OSX上的步骤应该是相似的。这里假设您已经安装了python和pip。
1.从此处开始下载您的服务用户凭据。您将使用在步骤3中下载的文件。

https://console.firebase.google.com/project/<your_project>/settings/serviceaccounts/adminsdk

1.从终端安装Python的firebase-admin工具(对于Linux或OSX,您可能需要在此命令前面加上sudo):

pip install firebase-admin

1.通过从命令行运行python打开python终端,并执行以下代码行:

import firebase_admin
    from firebase_admin import credentials, auth
    cred = credentials.Certificate("c:\\Users\\<path_to_my_credentials_file>.json")
    default_app = firebase_admin.initialize_app(cred)
    user = auth.get_user_by_email('<user_email_address>')
    auth.set_custom_user_claims(user.uid, {'role': 'admin'})

    # Verify the change worked:
    user = auth.get_user_by_email('<user_email_address>')
    print(user.custom_claims)

相关问题