【问题标题】:Integrating User Pools with Amazon Cognito Identity with authentication provider将用户池与 Amazon Cognito Identity 与身份验证提供商集成
【发布时间】:2017-03-07 11:47:51
【问题描述】:

我按照链接中描述的步骤:http://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-integrating-user-pools-with-identity-pools.html 将我的用户池与 cognito 身份集成。但是每次我尝试使用身份验证提供程序访问亚马逊 S3 时,都会收到以下错误:

E/CognitoCachingCredentialsProvider:获取凭据失败 com.amazonaws.services.cognitoidentity.model.NotAuthorizedException: 登录名不匹配。请为此提供至少一个有效的登录信息 身份或身份池。 (服务:AmazonCognitoIdentity;状态 代码:400;错误代码:NotAuthorizedException;请求编号: ff4da8ad-9a96-11e6-9c64-67a5c841c727) 在 com.amazonaws.http.AmazonHttpClient.handleErrorResponse(AmazonHttpClient.java:712) 在 com.amazonaws.http.AmazonHttpClient.executeHelper(AmazonHttpClient.java:388) 在 com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:199) 在 com.amazonaws.services.cognitoidentity.AmazonCognitoIdentityClient.invoke(AmazonCognitoIdentityClient.java:558) 在 com.amazonaws.services.cognitoidentity.AmazonCognitoIdentityClient.getId(AmazonCognitoIdentityClient.java:444) 在 com.amazonaws.auth.AWSAbstractCognitoIdentityProvider.getIdentityId(AWSAbstractCognitoIdentityProvider.java:172) 在 com.amazonaws.auth.AWSEnhancedCognitoIdentityProvider.refresh(AWSEnhancedCognitoIdentityProvider.java:76) 在 com.amazonaws.auth.CognitoCredentialsProvider.startSession(CognitoCredentialsProvider.java:561) 在 com.amazonaws.auth.CognitoCredentialsProvider.getCredentials(CognitoCredentialsProvider.java:371) 在 com.amazonaws.auth.CognitoCachingCredentialsProvider.getCredentials(CognitoCachingCredentialsProvider.java:441) 在 com.amazonaws.auth.CognitoCachingCredentialsProvider.getCredentials(CognitoCachingCredentialsProvider.java:76) 在 com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:4369) 在 com.amazonaws.services.s3.AmazonS3Client.putObject(AmazonS3Client.java:1704) 在 com.amazonaws.mobileconnectors.s3.transferutility.UploadTask.uploadSinglePartAndWaitForCompletion(UploadTask.java:203) 在 com.amazonaws.mobileconnectors.s3.transferutility.UploadTask.call(UploadTask.java:85) 在 com.amazonaws.mobileconnectors.s3.transferutility.UploadTask.call(UploadTask.java:44) 在 java.util.concurrent.FutureTask.run(FutureTask.java:234) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573) 在 java.lang.Thread.run(Thread.java:864)。

代码如下:

public static TransferUtility getTransferUtility(Context context) {
        if (sTransferUtility == null) {
            sTransferUtility = new TransferUtility(getS3Client(context.getApplicationContext()),
                    context.getApplicationContext());
        }

        return sTransferUtility;
    }



public static AmazonS3Client getS3Client(Context context) {
        if (sS3Client == null) {
            sS3Client = new AmazonS3Client(getCredProvider(context.getApplicationContext()));
        }
        return sS3Client;
    }



 private static CognitoCachingCredentialsProvider getCredProvider(Context context) {
        if (sCredProvider == null) {
            sCredProvider = new CognitoCachingCredentialsProvider(
                    context.getApplicationContext(),
                    Constants.COGNITO_POOL_ID,
                    Regions.EU_WEST_1);
            Map<String, String> logins = new HashMap<>();
            logins.put("cognito-idp.eu-west-1.amazonaws.com/eu-west-1_xxxxxxxxx", idToken);
            sCredProvider.setLogins(logins);
        }
        return sCredProvider;
    }

我是如何获得令牌的

AuthenticationHandler authenticationHandler = new AuthenticationHandler() {
        @Override
        public void onSuccess(CognitoUserSession cognitoUserSession, CognitoDevice device) {
            Log.e(TAG, "***Auth Success***");
            idToken = cognitoUserSession.getIdToken().getJWTToken();
            AppHelper.setCurrSession(cognitoUserSession);
            AppHelper.newDevice(device);
            closeWaitDialog();
            launchUser();
        }

transferutility 是 com.amazonaws.mobileconnectors.s3.transferutility 包的一部分。

感谢您的帮助。 费里尼

【问题讨论】:

标签: amazon-s3 amazon-cognito


【解决方案1】:

问题可能是配置或您创建令牌的方式(提供者名称部分看起来正确)。但很可能您只需要 GetIdResult。

“登录名不匹配。请为此身份或身份池提供至少一个有效的登录名。”来自“AWSCognitoIdentityService.GetCredentialsForIdentity”api 请求(在 java 中我认为它是 GetCredentialsForIdentityResult)

当您拥有一个身份的 identityId,然后您为另一个身份提供登录信息时,就会发生这种情况。如果您更改身份,您需要执行“AWSCognitoIdentityService.GetId”(在 java 中我认为这是 GetIdResult)

错误告诉您它找不到与身份池关联的身份提供者,或者池没有配置该身份提供者(我认为这会产生不同的错误但不确定),或者它无法将 identityId 与登录入口令牌相关联(例如,如果 ID 令牌中的用户名声明与其所拥有的身份不匹配)。

我认为您需要修复您的登录字典,或者调用 GetIdResult 以确保您提供的登录哈希具有正确的 identityId。

或者...如果是配置,请确保您在身份验证提供程序列表中将用户池和客户端 ID 正确配置为 Cognito 用户池身份验证提供程序。请注意,如果您还在 IAM 中将其配置为身份提供者,则您必须让受众与相同的客户端 ID 匹配。 (这也有效)。

注意:如果您配置“未经身份验证”访问,然后尝试使用登录哈希获取凭据,但使用未经身份验证的身份,则可能会发生此问题。我认为你需要做一个 getIdResult 来切换。

【讨论】:

    【解决方案2】:

    这是一个配置问题。我将 Cognito 用户池作为身份验证提供程序添加到现有身份池中。我提供了用户池 ID 和客户端 ID。

    然后我点击保存更改。我的更改已保存在仪表板上以绿色显示。但实际上并非如此!这就是错误的原因。

    作为解决方案,我从头开始创建了一个新的身份池,并在创建过程中添加了 cognito 用户池作为身份验证提供程序。只有在创建池后才正确保存它。

    【讨论】:

      【解决方案3】:

      如果其他人有同样的警告,可以使用未验证的电子邮件登录到 Cognito 身份池,但同一用户将无法针对 Cognito 身份提供者进行授权,而是会抛出此错误:

      错误:登录名不匹配。请至少包含一个有效的登录信息 这个身份或身份池。

      可以通过 Cognito 控制台将用户设置为“已确认”。这并不等同于“电子邮件验证”。不过,用户可以登录到池中。

      完全未经确认的用户根本无法登录。

      【讨论】:

        猜你喜欢
        • 2016-09-26
        • 1970-01-01
        • 1970-01-01
        • 2017-02-28
        • 2017-04-16
        • 2020-09-28
        • 2021-11-24
        • 2017-02-10
        • 2020-08-14
        相关资源
        最近更新 更多