我已经使用开发人员站点集成了google +登录,对于服务器端,我在Riskcompletefailure博客上关注了@ianbarber的解决方案
这是我如何建立GoogleApiClient的方法:
return new GoogleApiClient.Builder(getActivity())
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(Plus.API, Plus.PlusOptions.builder().build())
.addScope(new Scope("email")).addScope(Plus.SCOPE_PLUS_LOGIN)
.build();
这是在异步任务中获取id令牌的方法
scopes = "audience:server:client_id:" + Util.CLIENT_ID_SERVER;
id = GoogleAuthUtil.getToken(getActivity(),
Plus.AccountApi.getAccountName(mGoogleApiClient),
scopes);
之后调用createSession并根据服务器的响应更新hashMap并重建GoogleApiClient并再次重试连接,但由于服务器返回401(没有可用的刷新令牌),因此它将转到onConnceted()而不是onConnectionFailed()
if (cookie.equals("NO_REFRESH")) {
Log.v(TAG, "create session for " + mAccountName);
mSessionCookie = null;
mUserHasRefreshOnServer.put(mAccountName, false);
} else {
Log.v(TAG, "refresh available on server");
mSessionCookie = cookie;
mUserHasRefreshOnServer.put(mAccountName, true);
}
if (mGoogleApiClient.isConnected()) {
mGoogleApiClient.disconnect();
Log.v(TAG, "disconnect googleclient ");
}
Log.v(TAG, "try connect googleclient ");
mGoogleApiClient = buildGoogleApiClient();
mGoogleApiClient.connect();
}
这是我需要在onConnectionFailed()中执行的操作
public void onConnectionFailed(ConnectionResult result) {
if ((mAccountName != null)
&& mUserHasRefreshOnServer.containsKey(mAccountName)
&& mUserHasRefreshOnServer.get(mAccountName) == Boolean.FALSE) {
getCode(); //code for getting onetime authorization code
}
请指出我在做什么错,有关详细信息,请参阅我严格遵循的document
编辑:
我更改了流程..完全复制了该gist,但是现在在发送ID令牌(提供的服务器没有刷新且未征得同意)之后,当我去找getCode时
我只为Plus.SCOPE_PLUS_LOGIN而不是离线访问,因此得到同意后,当我重新我仍然在错误代码onConnectionFailed最终= 4(需要登录)
但,
替代流动,其中,如果我解决错误事前(同意Plus.SCOPE_PLUS_LOGIN),然后去引用代码这段时间我得到这个离线访问同意也因此一onConnected这是需要什么。
最佳答案
这是进入的有效状态!如果用户先前已登录,则可以到达那里,但是您丢失了服务器上的刷新令牌。
如果您查看要点(自从移至GoogleApiClient以来,现在已经过时),您会发现我们在onConnected中也有一个getCode调用:https://gist.github.com/ianbarber/7105273#file-codeactivity-java-L97
if (mSessionCookie == null) {
// If the server hasn't got a refresh token, grab it.
if(mUserHasRefreshOnServer.containsKey(mAccountName)) {
getCode();
} else {
// Otherwise, just get the session.
getSession();
}
}
正是为了处理这种情况-我们知道用户已经签名,但是我们仍然需要在服务器上获取刷新令牌,因此我们将不得不沿着getCode路由发送它们,并通过UserRecoverableAuthException。
关于android - G +登录Ian Barber实现:断开重建GoogleApiClient的连接时未调用onConnectionFailed,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28692432/