使用 cognito 验证用户身份

Verify user identity using cognito

我正在创建 back-end 服务并且我正在使用 AWS Cognito。 现在,我正在使用我的开发人员身份验证身份。 所以,我的用户可以使用我自己的系统登录。这部分就完成了。

但是,我在登录后验证用户时遇到问题。假设用户向我发送了访问我 API 的一些私有功能的请求。我如何识别和验证此用户?

如果我使用 facebook 作为登录提供程序,我可以使用他的 Cognito ID 和他的 facebook 访问令牌来完成 http header。然后,我可以对他进行身份验证,尝试使用函数 GetOpenIdTokenRequest 获取 Cognito 令牌。

我会有类似的东西

providerTokens.put("graph.facebook.com", "xxxxxxxxxxxx");
tokenRequest.setLogins(providerTokens);

AmazonCognitoIdentityClient identityClient = new AmazonCognitoIdentityClient();
        identityClient.setRegion(RegionUtils.getRegion(Configuration.REGION));
        GetOpenIdTokenResult tokenResp = identityClient.getOpenIdToken(tokenRequest);

但是,我没有使用 Facebook。

所以,我尝试了一些类似的东西

providerTokens.put("customdeveloper.authentication.com", "xxxxxxxxxxxx");
tokenRequest.setLogins(providerTokens);

收到一条错误消息,提示我的开发人员身份验证不是 public 提供商。

如果我朝着正确的方向前进,我会很困惑。我基本上想验证我的用户。类似于我收到令牌的 oauth2 的东西可以检查用户身份。

使用 Cognito 的正确方法是什么?

服务器端的 Cognito 文档非常模糊,但我想出了一种方法。

基本上,您需要将身份 ID 和 Cognito 令牌传递给服务器。然后,在服务器上你做这样的事情:

// Create the request object            
        Map providerTokens = new HashMap();
        providerTokens.put("cognito-identity.amazonaws.com", "auidhashaisdhals");
        tokenRequest.setLogins(providerTokens);

        AmazonCognitoIdentityClient identityClient = new AmazonCognitoIdentityClient();
        identityClient.setRegion(RegionUtils.getRegion(Configuration.REGION));
        GetCredentialsForIdentityRequest request = new GetCredentialsForIdentityRequest();
        request.withLogins(providerTokens);
        request.setIdentityId("us-east-1:XXXXX-9ac6-YYYY-ac07-ZZZZZZZZZZZZ");
        GetCredentialsForIdentityResult tokenResp = identityClient.getCredentialsForIdentity(request);

如果您拥有正确的 Cognito 令牌,那么您应该能够获取身份并进行身份验证。如果令牌无效,则您不会对您的用户进行身份验证。

如果令牌无效,亚马逊会抛出异常,因此您可以捕获并return 404 错误。

是的,使用身份 ID 和 Cognito 令牌,您可以调用 getCredentialsForIdentity 并确定令牌有效且属于该身份。

然后您可以使用这些凭据作为该用户调用不同的服务。

另一种选择是将后端服务器逻辑置于 API 网关之后: http://docs.aws.amazon.com/apigateway/latest/developerguide/welcome.html

然后您的用户将获得客户端凭据,并使用这些凭据调用 API 位于服务器端逻辑前面的网关。