首页 文章

使用Cognito Federated Identities进行身份验证

提问于
浏览
0

我正在努力弄清楚如何在我的网络应用程序中使用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 回答

  • 1

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

    • AWS中配置的提供程序 .

    • 提供者放入 Logins Map .
      id令牌中的

    • iss value(issuer) .

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

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

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

    Provider as configured in AWS

    使用Cognito用户池,Amazon会为您配置此名称,因此在后端无法配置 . Java代码中 providerName 的格式看起来不错,但首先我要检查 xxxxxxx 部分是否有错误 .

    App Client settings

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

    Cognito enabled for App Client

    Federated Identities settings

    接下来,在联合身份设置中,验证用户池ID和客户端ID是否出现在“身份验证提供程序”下的“身份验证”选项卡中,并且它们与您的用户池和App Client相匹配 .

    Federated Identities settings

    JWT issuer

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

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

  • 0

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

相关问题