我有一个Android应用程序,支持使用PlusClient
登录谷歌。连接后,我使用AsyncTask
和GoogleAuthUtil.getToken
方法获得auth令牌,如下所示:
private void fetchAuthToken(){AsyncTask任务=新的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我只在用户连接后获取令牌,即-我在onConnected
回调中调用fetchAuthToken()
,因此用户肯定会在之前登录
我的想法是:你在保留你的会话信息吗?http客户端需要跟踪会话,否则令牌可能会无效。
BasicCookieStore cookieStore = new BasicCookieStore();
HttpContext localContext = new BasicHttpContext();
localContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore);
然后将上下文添加到你的帖子/获取/你提出的任何请求
client.execute(post, localContext);