我已经使用开发人员站点集成了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/

10-13 00:29