Google登录 - 尝试访问userinfo时出现401错误“需要登录”

时间:2013-08-29 14:10:59

标签: android node.js authentication google-authentication

我有一个支持使用PlusClient与Google登录的Android应用。连接后,我使用AsyncTaskGoogleAuthUtil.getToken方法获取身份验证令牌,如下所示:

  

private void fetchAuthToken(){           AsyncTask task = new AsyncTask(){

        @Override
        protected String doInBackground(Void... params) {
            String token = null;
            String scope = "oauth2: https://www.googleapis.com/auth/plus.login https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/userinfo.email";//"oauth2: "+ Scopes.PLUS_PROFILE;
            Bundle appActivities = new Bundle();
            appActivities.putString(GoogleAuthUtil.KEY_REQUEST_VISIBLE_ACTIVITIES, visiblaeActivities);
            try {                   
                token = GoogleAuthUtil.getToken(Login.instance.context, mPlusClient.getAccountName(), scope, appActivities);
            } catch (UserRecoverableAuthException e) {                  
                loginActivity.startActivityForResult(e.getIntent(), REQUSET_TOKEN_PERMISSIONS_RESLOVE_ERR);                 
            } catch (IOException e) {
                e.printStackTrace();
            } catch (GoogleAuthException e) {
                e.printStackTrace();
            }
            return token;
        }

这很好用,然后我将令牌发送到我在node.js中的后端,在那里,我尝试使用此请求从谷歌中获取用户详细信息:

https://www.googleapis.com/oauth2/v2/userinfo?access_token=' + access_token

然后我得到用户的详细信息,一切都是Hunky Dory。问题是,有时我得到令牌无效的错误,如下所示:

  

“错误”:{      “错误”:[       {        “域名”:“全球”,        “理由”:“必需”,        “message”:“需要登录”,        “locationType”:“标题”,        “位置”:“授权”       }      ]      “代码”:401,      “message”:“需要登录”     }    }

我猜是有人试图用谷歌登录但由于某种原因无法连接。这很难调试,因为它偶尔发生,并且大多数用户成功登录。任何人吗?

P.S 我只在用户连接后获取令牌,即 - 我在fetchAuthToken()回调中呼叫onConnected,因此用户肯定是在那时登录的

1 个答案:

答案 0 :(得分:0)

我的想法:你保留会话信息吗?您的http客户端需要跟踪会话,否则令牌可能会失效。

BasicCookieStore cookieStore = new BasicCookieStore();
HttpContext localContext = new BasicHttpContext();
localContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore);

然后为你的帖子/获取/你正在做的任何请求添加上下文

client.execute(post, localContext);