2017-01-18 50 views
0

我很難想出如何在我的Web應用程序(基於Java)中使用Amazon Cognito。我想擁有某種身份驗證中心(Amazon Cognito)通過多個身份驗證提供程序對用戶進行身份驗證 - 這就是爲什麼我想使用Amazon Cognito! :)使用Cognito聯合身份驗證

首先,我設置了用戶池(我有我的UserPoolId:eu-central-1_xxxxxxxxxx)並創建了一個用戶。接下來,我使用IdentityPoolId創建了Identity Pool(eu-central-1:yyyyyyyyyy)。然後我使用AWS JavaScript SDK對UserPool進行身份驗證以獲得idToken,並且它工作得很好!我從Cognito UserPool收到idToken。然後我將這個idToken發送到我的後端應用程序(基於Java),並且我想用IdentityPool驗證此idToken。我在UserPoolId中添加了新的身份驗證提供程序 - Cognito,並在UserPool中添加了新創建的應用程序ID。我試圖按照本教程: https://aws.amazon.com/blogs/mobile/use-amazon-cognito-in-your-website-for-simple-aws-authentication/ 但每次我做

GetID 

要求我recevied異常與

com.amazonaws.services.cognitoidentity.model.NotAuthorizedException: Token is not from a supported provider of this identity pool. 

我的Java代碼如下:

final AmazonCognitoIdentityClient identityClient = new AmazonCognitoIdentityClient(
       new BasicAWSCredentials("accessKey", "secretKey")); 
identityClient.setRegion(Region.getRegion(Regions.EU_CENTRAL_1)); 

GetIdRequest idRequest = new GetIdRequest(); 
idRequest.setAccountId("accountId"); 
idRequest.setIdentityPoolId(identityPoolId); 

final String providerName = "cognito-idp.eu-central-1.amazonaws.com/eu-central-1_xxxxxxxx"; 

Map providerTokens = new HashMap(); 
providerTokens.put(providerName, idToken); 
idRequest.setLogins(providerTokens); 

GetIdResult idResp = identityClient.getId(idRequest); 

沒有人能幫助我完成這項任務?也許我做錯了什麼?

感謝, 卡米爾:)

回答

0

當你創建你的用戶羣仔細檢查你有所有支持預期的聯合供應商。如果您使用開發人員身份驗證,請確保您添加了「登錄....」域。 抓住你的/一個令牌,並在jwt.io中查看它以獲取線索。

1

有數據的三個需要在這種情況下,以匹配:如配置AWS

  • 提供商。
  • 提供者放入Logins地圖。
  • iss值(issuer)在id令牌中。

當我看到這個錯誤時,這是​​因爲登錄映射中的值與AWS中配置的提供者不匹配。

例如,一個意外的端口號或trailing slash可能導致這些不匹配。

除此之外,AWS中還有一些需要排列的設置。

供方爲AWS

隨着Cognito用戶池配置,亞馬遜配置這個名字給你,所以它是在後端不可配置。您的Java代碼中providerName的格式看起來不錯,但首先我會檢查xxxxxxx部分是否有拼寫錯誤。

應用客戶端設置

然後,請確保您的應用程序客戶端在用戶池設置,使Cognito:

Cognito enabled for App Client

聯合身份設置

接下來,您的聯合身份設置,請確認用戶池ID和客戶端ID出現在Cognito ta中b在「身份驗證提供程序」下,並且它們與您的用戶池和App Client相匹配。

Federated Identities settings

JWT發行

最後,我期望誤差爲"Invalid login token. Issuer doesn't match providerName"是否有與在JWT的iss值存在問題。然而,解碼你回來的id令牌並檢查內容(如另一個答案中的建議)也是很好的建議。

如果所有這些部分都顯示就位,並且錯誤仍然存​​在,請發表評論。快樂的黑客!

相關問題