【问题标题】:How to use Cognito identity pool with UnAuthenticatd users in Amplify for Android如何在 Amplify for Android 中将 Cognito 身份池与 UnAuthenticad 用户一起使用
【发布时间】:2020-12-27 19:19:50
【问题描述】:

我一直在浏览 AWS Amplify docs and tutorials,了解如何与未经身份验证的用户一起使用 Amplify 和 Cognito 身份池。 Amplify 文档给出的示例是:

Amplify.Auth.fetchAuthSession(
    result -> {
        AWSCognitoAuthSession cognitoAuthSession = (AWSCognitoAuthSession) result;
            switch(cognitoAuthSession.getIdentityId().getType()) {
                case SUCCESS:
                    Log.i("AuthQuickStart", "IdentityId: " + cognitoAuthSession.getIdentityId().getValue());
                    break;
                case FAILURE:
                    Log.i("AuthQuickStart", "IdentityId not present because: " + cognitoAuthSession.getIdentityId().getError().toString());
            }
        },
        error -> Log.e("AuthQuickStart", error.toString())
);

但实际上,当我使用此代码时 - 我在 LogCat 中打印出一个错误:

AuthQuickStart: FAILURE IdentityId not present because: AmplifyException {message=You are currently signed out., cause=null, recoverySuggestion=Please sign in and reattempt the operation.}

注意:我确实将 AWS Cognito 配置为支持未经身份验证的用户!

我还到处寻找 Amplify Android API 文档以查看支持哪些其他 API - 找不到任何 Android API 文档。 并查看 AWS Amplify.Auth 方法,我找不到任何处理未经身份验证的用户的函数

问题:

任何线索我如何使用 Amplify (Android) 并通过 AWS Cognito 为未经身份验证的用户获得 AWS 凭证???

【问题讨论】:

    标签: android amazon-web-services amazon-cognito aws-amplify


    【解决方案1】:

    我是 Amplify Android 团队的 David。前几天我实际上只是在研究这个问题,目前有一个黑客需要让未经身份验证的用户工作。

    通过 CLI 设置 unauth/guest 用户后(正如您提到的那样),您必须调用底层逃生舱口上的 getAWSCredentials 方法一次,应用才能使其工作。

    这是我编写的代码 sn-p,您可以在 Amplify.configure 之后运行(同样,每次应用安装只需运行一次):

    AWSMobileClient mobileClient = (AWSMobileClient) Amplify.Auth.getPlugin("awsCognitoAuthPlugin").getEscapeHatch();
    
    mobileClient.getAWSCredentials(new Callback<AWSCredentials>() {
         @Override
         public void onResult(AWSCredentials result) {
    
            // Now you'll see the Identity ID and AWSCredentials in the resulting auth session object.
            Amplify.Auth.fetchAuthSession(
                result2 -> Log.i(TAG, result2.toString()),
                error -> Log.e(TAG, error.toString()));
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
         }
    
         @Override
         public void onError(Exception e) {
              // Handle the error however is best for your app
         }
    });
    

    我现在正在研究一种避免这种黑客攻击的解决方案,并在我们的网站上添加一个关于 Unauth 用户的文档部分,但与此同时,这应该让它为你工作。

    再次注意,您只需执行一次,从那时起,它应该在您致电 fetchAuthSession 时起作用。

    更新:未打补丁的(官方)版本:

    Amplify.Auth.fetchAuthSession(
        result -> {
            AWSCognitoAuthSession cognitoAuthSession = (AWSCognitoAuthSession) result;
            switch (cognitoAuthSession.getIdentityId().getType()) {
                case SUCCESS:
                    Log.i(TAG, "identity: " + cognitoAuthSession.getIdentityId().getValue());
                    Log.i(TAG, "credentials: " + cognitoAuthSession.getAWSCredentials().getValue(););
                    break;
                case FAILURE:
                    Log.i(TAG, "FAILURE IdentityId not present because: " + cognitoAuthSession.getIdentityId().getError().toString());
            }
        },
        error -> Log.e(TAG, "UNAUTH USERS ERR: " + error.toString()));
    

    【讨论】:

    • 检查过,有效!现在,我确实获得了未经身份验证的用户的 identityId 和凭据。 (虽然我仍然在 logcat 中看到“您当前已注销......请登录并重新尝试操作”)。需要注意的是非常重要 - 让未经身份验证的用户使用 AWS 服务(例如 s3、kinesis 等)不需要身份验证代码(甚至不需要您在上面发布的那个),只需照常使用 Amplify sdk Kinesis 代码(当然如果您在 AWS 控制台中设置了未经身份验证的角色以使用 Kinesis)。
    • 如果 Amplify android 页面在此开发完成后包含(未修补的)示例,我将不胜感激。请注意,sdk 过时页面 (docs.amplify.aws/sdk/analytics/kinesis/q/platform/android) 上有很多客户端示例(例如 Kinesis),而当前的放大 sdk 文档 (docs.amplify.aws/lib/analytics/personalize/q/platform/…) 中根本没有出现
    • 是的,我实际上已经编写了更新的文档,计划在本周或下周发布我的补丁(现在也已完成)时发布。
    • 好的,它现在已在最新版本的 Amplify 中运行,文档在此处更新:docs.amplify.aws/lib/auth/guest_access/q/platform/android
    • 已验证,现在一切正常。感谢支持
    【解决方案2】:

    除非您有登录用户,否则您将无法检索经过身份验证的会话。

    如果您的身份池(不是用户池)是为未经身份验证的用户或来宾用户配置的,您可以简单地调用 GetId 端点:

    获取ID

    生成(或检索)一个 Cognito ID。提供多个登录名将创建一个隐式链接帐户。

    这是一个公共 API。您无需任何凭据即可调用此 API。

    请求语法

    {
       "AccountId": "string",
       "IdentityPoolId": "string",
       "Logins": { 
          "string" : "string" 
       }
    }
    

    https://docs.aws.amazon.com/cognitoidentity/latest/APIReference/API_GetId.html

    然后您应该能够使用该 ID 来检索令牌:

    获取OpenIdToken

    使用已知的 Cognito ID 获取 OpenID 令牌。这个已知的 Cognito ID 由 GetId 返回。您可以选择为身份添加其他登录名。提供多个登录会创建一个隐式链接。

    OpenID 令牌有效期为 10 分钟。

    这是一个公共 API。您无需任何凭据即可调用此 API。

    请求语法

    {
       "IdentityId": "string",
       "Logins": { 
          "string" : "string" 
       }
    }
    

    https://docs.aws.amazon.com/cognitoidentity/latest/APIReference/API_GetOpenIdToken.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-28
      • 2016-09-26
      • 2018-02-11
      • 2016-10-23
      • 2017-02-10
      • 2021-06-08
      • 2016-11-10
      相关资源
      最近更新 更多