0

我已经设置了一个 android 应用程序来使用放大身份验证。

我允许它接受未经授权的(访客)用户和谷歌联合登录。

这一切似乎都按预期工作。我可以使用 google 登录和 cognito 登录。

我在使用为 google 登录和来宾用户生成的临时凭据时遇到问题。

我在 apigateway 中设置了一个 api(导入到我的 apigateway 中的宠物示例)。我可以使用具有允许调用 api 的策略的用户访问端点。我使用用户 accessKey 和 secretKey 在邮递员中进行测试,它可以工作。

当我使用 cognito 登录用户的 idToken 时,它也可以工作。

(我已将允许调用 api 添加到所使用的身份池的身份验证和非身份验证角色的策略中)

如果我使用以下代码为客人生成的 accessKey 和 secretKey:

 public void getGuestCredentials(View view) {
    Log.i(TAG, "inside getGuestCredentials()...");
    Amplify.Auth.fetchAuthSession(
            result -> {
                AWSCognitoAuthSession cognitoAuthSession = (AWSCognitoAuthSession) result;
                Log.i(TAG, "Is user signed in: "+cognitoAuthSession.isSignedIn());

                switch(cognitoAuthSession.getIdentityId().getType()) {
                    case SUCCESS:
                        Log.i(TAG, "success IdentityId: " + cognitoAuthSession.getIdentityId().getValue());
                        Log.i(TAG, "success access key: " + cognitoAuthSession.getAWSCredentials().getValue().getAWSAccessKeyId());
                        Log.i(TAG, "success secret key: " + cognitoAuthSession.getAWSCredentials().getValue().getAWSSecretKey());
                        break;
                    case FAILURE:
                        Log.i(TAG, "failure IdentityId not present because: " + cognitoAuthSession.getIdentityId().getError().toString());
                        break;
                    default:
                        Log.i(TAG, "default IdentityId: " + cognitoAuthSession.getIdentityId().getValue());
                        Log.i(TAG, "default access key: " + cognitoAuthSession.getAWSCredentials().getValue().getAWSAccessKeyId());
                        Log.i(TAG, "default secret key: " + cognitoAuthSession.getAWSCredentials().getValue().getAWSSecretKey());
                        break;

                }
            },
            error -> Log.i("AuthQuickStart", error.toString())
    );

我得到:

"message": "请求中包含的安全令牌无效。"

在邮递员。

与使用此代码为 google 登录生成的密钥相同:

//            sign in as federated user using google token (using escape hatch)
        AWSMobileClient mobileClient = (AWSMobileClient) Amplify.Auth.getPlugin("awsCognitoAuthPlugin").getEscapeHatch();

// mobileClient.federatedSignIn(IdentityProvider.GOOGLE.toString(), account.getIdToken(), new Callback() { mobileClient.federatedSignIn("accounts.google.com", account.getIdToken(), new Callback() {

            @Override
            public void onResult(final UserStateDetails userStateDetails) {
                //Handle the result
                Log.i(TAG, "mobileClient login result: " + userStateDetails.getUserState().toString());
                Log.i(TAG, "success google federation, going to authenticated user page.... ");

// ************************************************

                AWSCredentials credentials = mobileClient.getCredentials();
                Log.i(TAG, "***** secret key: "+credentials.getAWSSecretKey());
                Log.i(TAG, "***** access key: "+credentials.getAWSAccessKeyId());

……

感谢任何帮助解决这个问题。谢谢

4

1 回答 1

0

设法得到排序。

“当您使用临时安全凭证进行呼叫时,呼叫必须包含一个会话令牌,该令牌与这些临时凭证一起返回。AWS 使用会话令牌来验证临时安全凭证。临时凭证在指定的时间间隔后过期。”

我使用以下代码获得了 sessionToken:

((AWSSessionCredentials) AWSMobileClient.getInstance().getCredentials()).getSessionToken();
于 2020-10-02T08:51:16.593 回答