我正在努力弄清楚如何在我的网络应用程序中使用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
请求我用
收到Exceptioncom.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 :(得分:1)
在这种情况下,有三个数据需要匹配:
Logins
地图。iss
id(发布者)在id令牌中。当我看到此错误时,原因是登录映射中的值与AWS中配置的提供程序不匹配。
例如,意外的端口号或trailing slash可能导致这些不匹配。
除此之外,AWS中还有一些需要排队的设置。
AWS中配置的提供商
使用Cognito用户池,亚马逊会为您配置此名称,因此它在后端无法配置。 Java代码中providerName
的格式看起来不错,但首先我要对xxxxxxx
部分进行三重检查以获取拼写错误。
应用客户端设置
然后,确保您的App Client在用户池设置中启用了Cognito:
联合身份设置
接下来,在您的联盟身份设置中,验证用户池ID和客户端ID是否出现在"身份验证提供商"下的Cognito选项卡中,并且它们与您的用户池和App Client匹配。
JWT发行人
最后,如果JWT中的"Invalid login token. Issuer doesn't match providerName"
值出现问题,我希望错误为iss
。但是,解码你得到的id令牌并检查内容(如另一个答案所示)也是一个很好的建议。
如果所有这些部分都已到位,并且错误仍然存在,请发表评论。快乐黑客!
答案 1 :(得分:0)
创建用户池时,请检查是否支持所有预期的联合提供程序。如果您使用经过身份验证的开发人员,请确保添加该“login ....”域。 抓住你的/一个令牌并在jwt.io中查看它以获取线索。