使用Cognito Federated Identities进行身份验证

时间:2017-01-18 08:59:39

标签: java amazon-web-services amazon amazon-cognito

我正在努力弄清楚如何在我的网络应用程序中使用Amazon Cognito(基于Java)。我希望有一些身份验证中心(Amazon Cognito)来验证具有多个Auth Providers的用户 - 这就是我想要使用Amazon Cognito的原因! :)

首先,我设置了用户池(我有我的UserPoolId:eu-central-1_xxxxxxxxxx)并在那里创建了一个用户。接下来,我使用IdentityPoolId创建了标识池(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

请求我用

收到Exception
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);

有人能帮我完成这项任务吗?也许我做错了什么?

谢谢, 卡米尔:)

2 个答案:

答案 0 :(得分:1)

在这种情况下,有三个数据需要匹配:

  • AWS中配置的提供程序。
  • 提供商已放入Logins地图。
  • iss id(发布者)在id令牌中。

当我看到此错误时,原因是登录映射中的值与AWS中配置的提供程序不匹配。

例如,意外的端口号或trailing slash可能导致这些不匹配。

除此之外,AWS中还有一些需要排队的设置。

AWS中配置的提供商

使用Cognito用户池,亚马逊会为您配置此名称,因此它在后端无法配置。 Java代码中providerName的格式看起来不错,但首先我要对xxxxxxx部分进行三重检查以获取拼写错误。

应用客户端设置

然后,确保您的App Client在用户池设置中启用了Cognito:

Cognito enabled for App Client

联合身份设置

接下来,在您的联盟身份设置中,验证用户池ID和客户端ID是否出现在"身份验证提供商"下的Cognito选项卡中,并且它们与您的用户池和App Client匹配。

Federated Identities settings

JWT发行人

最后,如果JWT中的"Invalid login token. Issuer doesn't match providerName"值出现问题,我希望错误为iss。但是,解码你得到的id令牌并检查内容(如另一个答案所示)也是一个很好的建议。

如果所有这些部分都已到位,并且错误仍然存​​在,请发表评论。快乐黑客!

答案 1 :(得分:0)

创建用户池时,请检查是否支持所有预期的联合提供程序。如果您使用经过身份验证的开发人员,请确保添加该“login ....”域。 抓住你的/一个令牌并在jwt.io中查看它以获取线索。