![](/img/trans.png)
[英]Correct Proguard Rules for AWS AppSync with Cognito User Pool Authentication on Android
[英]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.