繁体   English   中英

Google身份验证因Android上的AWS Cognito身份池而失败

[英]Google Authentication fails with AWS Cognito Identity Pool on Android

当我调用Amazon.CognitoIdentity.AmazonCognitoIdentityClient.GetIdAsync()时,我得到NotAuthorizedException:Token is not from a supported provider of this identity pool

我不明白为什么,令牌是通过使用GoogleSignInApi进行身份验证而获得的,并且AWS Identity Pool配置为使用与在Android设备上进行身份验证的相同“ Google WebApp客户端ID”联合到Google身份验证提供程序。

在此处输入图片说明

我也尝试使用两种不同的方法来获取Google令牌

  • 使用.RequestIdToken()上的GoogleSignInOptions .RequestIdToken()结果
  • 通过调用GoogleAuthUtil.GetToken API

在检查时,这两个令牌是不同的,它们看起来都像是好的令牌,并且在给AmazonCognitoIdentityClient时都失败,并出现相同的错误。 显然,用户已在Android设备上通过身份验证,该应用程序能够获取电子邮件,DisplayName等。

var googleSignInOptions = new 
GoogleSignInOptions.Builder(GoogleSignInOptions.DefaultSignIn)
   .RequestIdToken("Google WebApp Client ID")
   .RequestEmail()
   .Build();

mGoogleApiClient = new GoogleApiClient.Builder(this)
   .EnableAutoManage(
      this, // FragmentActivity
      this) // OnConnectionFailedListener
   .AddApi(Auth.GOOGLE_SIGN_IN_API, gso)
   .Build();

mGoogleApiClient.Connect();

var result = await Auth.GoogleSignInApi.SilentSignIn(mGoogleApiClient);

// Only need one or the other, trying to figure out which
var idToken = result.SignInAccount.IdToken;
var authToken = await GetGoogleAuthTokenAsync(result.SignInAccount.Email);

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"] = idToken; // same failure if I use authToken

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

var result = await cognitoClient.GetIdAsync(request); // THIS THROWS Amazon.CognitoIdentity.Model.NotAuthorizedException

private async Task<string> GetGoogleAuthTokenAsync(string accountEmail)
{
   Account googleAccount = new Account(accountEmail, GoogleAuthUtil.GoogleAccountType);
   string scopes = "audience:server:client_id:" + "Google WebApp Client ID"
   var token = await Task.Run(() => { return GoogleAuthUtil.GetToken(this, googleAccount, scopes); });
   return token;
}

注意 -发生异常后,AWS控制台立即显示Cognito身份池增加了1个未经身份验证的身份,而Google身份的数量没有变化 在此处输入图片说明

经过数小时的搜索,我终于找到了解决方案。 基本上, 到Google+的 AWS Cognito身份池联盟已完全损坏 ,但不要绝望。 您需要做的是与OpenID提供程序联合

首先,转到AWS控制台> IAM>身份提供程序>创建提供程序>提供程序类型= OpenID Connect>提供程序URL = https://accounts.google.com > Audience =“您在Google中创建的Android或iOS的Google客户端ID开发者控制台”

请注意,请勿为受众群体使用“ Google Web App客户端ID”。

其次,转到AWS Console> Cognito>联合身份池。 选择您的身份池,然后单击“编辑身份池”,然后导航到OpenID标签(不是Google+标签,甚至不要使用那是行不通的)。 现在,您应该看到一个标题为“ accounts.google.com”的复选框,选中它。

第三,去编辑您的移动应用程序源代码,并确保您在构建用于调用GoogleAuthUtil.GetTokenGoogleAuthUtil.GetToken(this, googleAccount, scopes)的范围字符串时使用在Google Developer Console中生成的“ Google WebApp Client ID”。 。 那是scopes = "audience:server:client_id:" + "webClientId"

现在,您对var result = await cognitoClient.GetIdAsync(request);的调用var result = await cognitoClient.GetIdAsync(request); 应该成功。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM