使用 AWS Cognito 联合身份进行身份验证失败,因为用户未通过身份验证

Authenticating with AWS Cognito Federated Identities fails because user is not authenticated

我正在向调用 AWS-Lambda 的 android 应用程序添加适当的身份验证。应用程序用户需要注册。该应用程序应支持 public 登录提供商,例如 Google+ 或 Facebook。为此,我想我会使用 AWS Cognito 和联合身份。

我正在尝试遵循 https://aws.amazon.com/blogs/mobile/understanding-amazon-cognito-authentication 记录的工作流程 其中包括

  1. GetId
  2. 获取OpenIdToken
  3. AssumeRoleWithWebIdentity

在 AWS 控制台中,我创建了一个 AWS 身份池并将 Google+ 配置为身份验证提供程序。我已禁用未经身份验证的访问,因为我需要始终对用户进行身份验证。

我在调用 GetId 时遇到问题,这是该工作流程的第一步,它 returns 和错误通知我未为此身份池启用未经身份验证的访问。是的,我的用户正在进行身份验证,在工作流的早期用户还无法通过身份验证,这就是重点,不是吗。

这是代码 (Xamarin.Android C#)

using Amazon.CognitoIdentity;

var shortLivedAWScredentials = new CognitoAWSCredentials(
    "identity-pool-id",
    AWSConfigs.RegionEndpoint);

var cognitoClient = new AmazonCognitoIdentityClient(
    shortLivedAWScredentials,
    AWSConfigs.RegionEndpoint);

var logins = new Dictionary<string, string>();
logins["accounts.google.com"] = "id token";

var request = new GetIdRequest();
request.IdentityPoolId = "identity-pool-id";
request.Logins = logins;

var task = cognitoClient.GetIdAsync(request);
var result = await task; 

GetId 调用引发异常,告诉我此身份池不支持未经身份验证的访问。关于使用联合身份通过 AWS Cognito 进行身份验证,我误解了哪一部分?

更新: 那么这是否意味着要为未经身份验证的访问禁用 AWS 身份池,我需要创建一个 IAM 帐户,该帐户有权仅访问该身份池,并将其凭据存储在移动应用程序中?只是为了让我的移动应用程序可以对最终用户进行身份验证。 如果这确实是如何完成的,那么是否有好的解决方案可以将访问密钥存储在移动应用程序中,从而阻止大多数廉价的逆向工程?如果访问密钥存储在移动应用程序中,这真的比让身份池未经身份验证提供更多的安全性吗?

我找到了一个不需要调用以下方法的解决方案

  1. GetId
  2. 获取OpenIdToken
  3. AssumeRoleWithWebIdentity

改为

var awsCredentials = new CognitoAWSCredentials(
    "Identity Pool ID",
    AWSConfigs.RegionEndpoint);
awsCredentials.AddLogin("accounts.google.com", token);

另请参阅 ,其中解释了如何将 Cognito 联合到 Google。