通过Firebase Open ID Connect Provider进行AWS联合登录

问题描述

我正在尝试使用Firebase作为Open ID Connect提供程序进行AWS联合登录。我已完成以下所有步骤:

  1. 根据IAM创建的Firebase Identity提供程序:
    • 提供商ARN:arn:aws:iam :: [MASKED_VALUE]:oidc-provider / securetoken.google.com / [MASKED_FIREBASE_APP_ID]
    • 提供商类型:OIDC
    • 提供商网址:securetoken.google.com/ [MASKED_FIREBASE_APP_ID]
    • 受众群体:[MASKED_FIREBASE_APP_ID]
  2. 创建了新的IAM角色:
    • 我需要访问的AWS服务的附加策略
    • 已编辑的信任关系,已添加
     {
     "Version": "2012-10-17","Statement": [
         {
         "Effect": "Allow","Principal": {
             "Federated": "[ARN_FOR_THE_ABOVE_IDENTITY_PROVIDER]"
         },"Action": "sts:AssumeRoleWithWebIdentity","Condition": {
             "StringEquals": {
             "securetoken.google.com/[MASKED_FIREBASE_APP_ID]:aud": "[MASKED_FIREBASE_APP_ID]"
             }
         }
         }
     ]
     }
    
  3. 使用以下设置创建新的身份池:
    • 在“通过身份验证的角色”下拉列表中,选择了第2步中的一个
    • 在“身份验证提供程序”下,选择“打开ID”选项卡,然后从步骤1中选择身份提供程序。

我正在使用以下SDK进行登录

{
  "Version": "1.0","CredentialsProvider": {
    "CognitoIdentity": {
      "Default": {
        "PoolId": "eu-central-1:[MASKED_POOL_ID_FROM_STEP_3]","Region": "eu-central-1"
      }
    }
  },"IdentityManager": {
    "Default": {}
  }
}

我已将Firebase UI库集成到我的Android应用程序中,并已通过任何第三方提供商(Google,Facebook)成功登录。当我取回Firebase ID令牌时,然后尝试使用AWS Mobile SDK通过AWS执行federated sign in以访问AWS相关服务:

final AWSMobileClient awsClient = AWSMobileClient.getInstance();
...
// part where I get back Firebase token
awsClient.federatedSignIn("securetoken.google.com/[MASKED_FIREBASE_APP_ID]",idToken)

此呼叫之后,我返回错误消息,提示联合令牌时出错。,并显示详细消息无效的身份池配置。检查为此池分配的IAM角色。。但是正如您在上面看到的,我为该池分配了正确的IAM角色。然后我发现有一个通过FederatedSignInoption构造一些自定义登录选项的选项,因此我尝试了:

FederatedSignInoptions federatedSignInoptions = FederatedSignInoptions.builder()
                                .cognitoIdentityId("eu-central-1:[MASKED_POOL_ID_FROM_STEP_3]")
                                .customroleARN("arn:aws:iam::[MASKED_ROLE_ARN_FROM_STEP_2]")
                                .build();

将此配置传递给federatedSignIn:

awsClient.federatedSignIn("securetoken.google.com/[MASKED_FIREBASE_APP_ID]",idToken,federatedSignInoptions)

与以前相同的错误,但现在的原因是仅SAML提供程序和具有RoleMappings的提供程序支持自定义角色ARN。

然后,我找到了以下代码片段,用于创建请求以具有Web身份的角色:

BasicAWSCredentials basicCreds = new BasicAWSCredentials("","");
AWSSecurityTokenServiceClient sts = new AWSSecurityTokenServiceClient(basicCreds);

AssumeRoleWithWebIdentityRequest request = new AssumeRoleWithWebIdentityRequest()
        .withRoleArn("arn:aws:iam::[MASKED_ROLE_ARN_FROM_STEP_2]")
        .withRoleSessionName("app1")
        .withWebIdentityToken(idToken).withDurationSeconds(3600);
AssumeRoleWithWebIdentityResult response = sts.assumeRoleWithWebIdentity(request);
Credentials credentials = response.getCredentials();

在这里,我实际上取回带有访问密钥和秘密密钥的AWS凭证。这甚至是正确的方法吗?为什么AWSMobileClient上的federatedSignIn不起作用?我在这里想念什么?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)