簡體   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