我正在创建一个后端服务,而我正在使用AWS Cognito。 现在,我正在使用我的开发人员身份验证身份。 所以,我的用户可以使用我自己的系统登录。这部分已经完成。
但是,我在登录后验证用户时遇到问题。假设用户向我发送访问我的API的某些私有函数的请求。如何识别和验证此用户?
如果我使用Facebook作为登录提供商,我可以使用他的Cognito ID和他的facebook访问令牌来实现http标头。然后,我可以验证他,尝试使用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);
获取我的开发人员身份验证不是公共提供程序的错误。
如果我朝着正确的方向前进,我会很困惑。我基本上想要验证我的用户。类似于oauth2的东西,我收到一个令牌可以检查用户身份。使用Cognito的正确方法是什么?
答案 0 :(得分:2)
是的,使用身份ID和Cognito令牌,您可以调用getCredentialsForIdentity并确定令牌有效并且属于该身份。
然后,您可以使用这些凭据以该用户身份调用不同的服务。
另一种选择是将后端服务器逻辑放在API网关之后: http://docs.aws.amazon.com/apigateway/latest/developerguide/welcome.html
然后,您的用户将获得客户端的凭据,并使用这些凭据进行调用,以支持服务器端逻辑的API网关。
答案 1 :(得分:1)
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令牌,那么您应该能够获得身份并进行身份验证。如果令牌无效,则您不会对您的用户进行身份验证。
如果令牌无效,Amazon会抛出异常,因此您可以捕获并返回404错误。