问题描述
我正在尝试使用Firebase作为Open ID Connect提供程序进行AWS联合登录。我已完成以下所有步骤:
- 根据IAM创建的Firebase Identity提供程序:
- 创建了新的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]" } } } ] }
- 使用以下设置创建新的身份池:
- 在“通过身份验证的角色”下拉列表中,选择了第2步中的一个。
- 在“身份验证提供程序”下,选择“打开ID”选项卡,然后从步骤1中选择身份提供程序。
我正在使用以下SDK进行登录:
- 具有FirebaseUI library的Firebase身份验证SDK
- AWS Mobile SDK,其中已指定awsconfiguration.json文件:
{
"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 (将#修改为@)