Amazon Cognito和Android SDK的问题NotAuthorizedException:无效的登录令牌

时间:2015-03-06 14:26:07

标签: android amazon-web-services android-asynctask google-plus amazon-cognito

我无法使用Google +使用Amazon SDK进行授权。我可以同时获得Cognito ID和Google+令牌,在我的身份库中,我可以看到未经身份验证的用户。在我的Cognito设置中,我已将服务器设置为正确的服务clientID。

这是我的代码:

public class cognitoID extends AsyncTask<String, Void, Void>{



        @Override
        protected Void doInBackground(String ... id){
            credentialsProvider = new CognitoCachingCredentialsProvider(
                    MainActivity.this, /* Current Activity Context */
                    "us-east-1:XXXXXXXX", /* Identity Pool ID */
                    Regions.US_EAST_1 /* Region */
            );

            credentialsProvider.getCredentials();

            cognitoID = credentialsProvider.getIdentityId();
             Log.i("Cognito", credentialsProvider.getIdentityId());


            if(accessToken =="") {

                mGoogleApiClient.connect();
                Log.i("Getting me a token", "allright");

            }
                GooglePlayServicesUtil.isGooglePlayServicesAvailable(getApplicationContext());

                AccountManager am = AccountManager.get(getApplicationContext());

                android.accounts.Account[] accounts = am.getAccountsByType(GoogleAuthUtil.GOOGLE_ACCOUNT_TYPE);

            try{
                accountName = Plus.AccountApi.getAccountName(mGoogleApiClient);
                scope = "oauth2:" + Scopes.PLUS_LOGIN;
                accessToken = GoogleAuthUtil.getToken(
                        getApplicationContext(), accountName, scope);


            } catch (UserRecoverableAuthException recoverableException) {
                Log.e("URAE", recoverableException.toString());
                startActivityForResult(recoverableException.getIntent(), REQUEST_AUTHORIZATION);

            } catch (GoogleAuthException authEx) {


                Log.e("GAE", authEx.toString());
            } catch (IOException ioEx) {
                Log.e("IOE", ioEx.toString());
            }
                Map<String, String> logins = new HashMap<String, String>();

                logins.put("accounts.google.com", accessToken);

                credentialsProvider.setLogins(logins);

                Log.i("everything set", accessToken.toString() + " cognito " + cognitoID.toString());
                credentialsProvider.withLogins(logins);
            credentialsProvider.refresh();

            Log.i("logins", credentialsProvider.getLogins().toString());
            return null;

        }


 }

我不确定它是我在AWS Developer Console上的设置,还是它的代码。

这是身份池的角色策略:

{
    "Version": "2012-10-17",
    "Statement": [{
        "Action": [
            "mobileanalytics:PutEvents",
            "cognito-sync:*"
        ],
        "Effect": "Allow",
        "Resource": [
            "*"
        ]
    }]
}

以下是错误:

机器人:

03-03 22:41:33.106    1970-2366/com.brillada.comicsareus E/AndroidRuntime﹕ FATAL EXCEPTION: AsyncTask #2
    Process: com.brillada.comicsareus, PID: 1970
    java.lang.RuntimeException: An error occured while executing doInBackground()
            at android.os.AsyncTask$3.done(AsyncTask.java:300)
            at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
            at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
            at java.util.concurrent.FutureTask.run(FutureTask.java:242)
            at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
            at java.lang.Thread.run(Thread.java:818)
     Caused by: com.amazonaws.services.cognitoidentity.model.NotAuthorizedException: Invalid login token. (Service: AmazonCognitoIdentity; Status Code: 400; Error Code: NotAuthorizedException; Request ID: 5a30d834-c220-11e4-8aed-791c85399196)
            at com.amazonaws.http.AmazonHttpClient.handleErrorResponse(AmazonHttpClient.java:818)
            at com.amazonaws.http.AmazonHttpClient.executeHelper(AmazonHttpClient.java:437)
            at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:243)
            at com.amazonaws.services.cognitoidentity.AmazonCognitoIdentityClient.invoke(AmazonCognitoIdentityClient.java:1079)
            at com.amazonaws.services.cognitoidentity.AmazonCognitoIdentityClient.getCredentialsForIdentity(AmazonCognitoIdentityClient.java:499)
            at com.amazonaws.auth.CognitoCredentialsProvider.populateCredentialsWithCognito(CognitoCredentialsProvider.java:622)
            at com.amazonaws.auth.CognitoCredentialsProvider.startSession(CognitoCredentialsProvider.java:549)
            at com.amazonaws.auth.CognitoCredentialsProvider.refresh(CognitoCredentialsProvider.java:499)
            at com.amazonaws.auth.CognitoCachingCredentialsProvider.getIdentityId(CognitoCachingCredentialsProvider.java:418)
            at com.amazonaws.auth.CognitoCredentialsProvider.populateCredentialsWithCognito(CognitoCredentialsProvider.java:615)
            at com.amazonaws.auth.CognitoCredentialsProvider.startSession(CognitoCredentialsProvider.java:549)
            at com.amazonaws.auth.CognitoCredentialsProvider.refresh(CognitoCredentialsProvider.java:499)
            at com.brillada.comicsareus.MainActivity$cognitoID.doInBackground(MainActivity.java:408)
            at com.brillada.comicsareus.MainActivity$cognitoID.doInBackground(MainActivity.java:352)
            at android.os.AsyncTask$2.call(AsyncTask.java:288)
            at java.util.concurrent.FutureTask.run(FutureTask.java:237)
            at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
            at java.lang.Thread.run(Thread.java:818)

我确定我遗漏了一些东西,但我甚至无法找到从哪里开始排除错误。

2 个答案:

答案 0 :(得分:3)

您正在获得一个&#34;无效的登录令牌&#34; Cognito的异常,这意味着您传递的令牌无效。这主要是由于两个原因:

  1. 您正在传递过期或空令牌。
  2. 您传递的是有效令牌,但您在应用中使用的Google App ID与您在身份池中配置的ID不匹配。

答案 1 :(得分:0)

基于Javascript passport-google-auth模块,它返回access_token,refresh_token和params。

获取cognito_identity您需要使用从Google收到的params.id_token

 passport.use(new GoogleStrategy(googleDeveloperDetails, getUserDetails));

app.get("/auth/google", passport.authenticate("google", { scope: ['email'] }));

var authGoogle = passport.authenticate("google", {
    failureRedirect: "/auth/google"
});

app.get("auth/google/callback", authGoogle, controller.successRedirect);

getUserDetails = function(accessToken, refreshToken, params, profile, done) {
      if(profile.provider == "google") {
       profile.token = params.id_token   // params.id_token to be used to get cognito credentials
      } else {
            profile.token = accessToken;
      }
      done(null, profile);
}

googleDeveloperDetails = {
    clientID: "google cleint ID",
    clientSecret: "google client secret",
    callbackURL: "https://localhost:3000/auth/google/callback",
    profileFields: ["emails", "profile"]
}