Android,Cognito:可以登录,但无法进行经过身份验证的AWS调用

时间:2016-11-04 00:06:49

标签: android amazon-web-services amazon-s3 amazon-cognito aws-lambda

在Android应用中,我可以使用Cognito成功进行身份验证,Cognito会返回CognitoIdToken和CognitoAccessToken。

但我无法弄清楚如何使用它来进行实际的身份验证调用,比如Lambda或S3。似乎CognitoIdentityProvider(我似乎能够使用它)和CognitoCredentialsProvider(我没有)之间存在鸿沟。

感谢您的想法,甚至指向使用Cognito和经过身份验证的调用/角色的示例的指针。

[edit]红利问题:有人可以解释为什么有AWSCognito *和AmazonCognito *,为什么它们看起来几乎完全不相关?

2 个答案:

答案 0 :(得分:2)

在aws控制台中查看您的联合身份池。在身份浏览器中查找您正在通过身份验证的identityId(来自您的日志)。

以下是关键:如果身份标识不显示登录信息,那么您从未进行过身份验证。 *当我说登录时,每个身份都有一个登录计数,如果你点击身份ID,它会显示身份验证发生的identityProviderName。

这是一个简单的测试,如果您有登录验证。如果你不这样做,你就不是。现在为什么AWS上没有任何文档说明......嗯......谁知道。

如果您通过身份验证,那么SDK会存储令牌,您不必担心它可以开始使用服务配置的aws。

(响应基于IOS sdk,但我相信这些问题,它们是相同的 - The diagrams in here may help you,但这些是IOS SDK的笔记,我承认我没有在Android中尝试过这个)。

答案 1 :(得分:1)

我最终确定我缺少将令牌设置为凭证提供程序的调用:

    final CognitoCachingCredentialsProvider credentialsProvider = getCredentialsProvider(applicationContext);

    Map<String, String> logins = new HashMap<String, String>();
    logins.put(Constants.COGNITO_USER_POOL_LOGIN_STRING, cognitoUserSession.getIdToken().getJWTToken());
    credentialsProvider.setLogins(logins);

其中Constants.COGNITO_USER_POOL_LOGIN_STRING类似于“cognito-idp.us-west-2.amazonaws.com/”+ MY_COGNITO_USER_POOL_ID。执行此操作后,TransferUtility对象能够通过身份验证下载。之前获得的TransferUtility就像这样(编辑过):

CognitoCredentialsProvider cp = . . .
AmazonS3Client s3Client = new AmazonS3Client(cp);
TransferUtility s3transferUtility = new TransferUtility(s3Client);