Android:如何通过Google登录API获取刷新令牌?

Swa*_*nar 12 android google-api access-token google-play-services google-signin

目前,我正在开发用户可以使用Google登录的应用程序.作为登录过程的一部分,我们需要将Google ACCESS TOKEN和REFRESH TOKEN发送到服务器端.

我通过以下方法检索访问令牌,

        mAccountName = googleSignInAccount.getEmail();
        String scopes = "oauth2:profile email";
        String token = null;
        try {
            token = GoogleAuthUtil.getToken(activity.getApplicationContext(), mAccountName, scopes);
        } catch (IOException e) {
            Logger.eLog(TAG, e.getMessage());
        }
Run Code Online (Sandbox Code Playgroud)

我正在访问访问令牌的GoogleAuthUtil类没有刷新令牌的功能.那么如何访问Refresh Token呢?提前致谢!

Isa*_*hen 9

您应该通过Auth.GOOGLE_SIGN_IN_API使用服务器身份验证代码流:在Android客户端上获取服务器身份验证代码,发送到您的服务器,服务器交换代码以进行刷新和访问令牌(带有秘密).此博客文章中还有更多详细信息.

此外,如果您现在使用GoogleAuthUtil.getToken作为访问令牌,您需要查看此Google登录最佳做法博客文章,了解如何迁移到推荐的流程以确保安全性和最佳用户体验.

  • @BNK,我无法穷尽所有用例,所以只是调用了最常见的用例(vs 服务器访问)使用透明 OAuth 令牌(库支持和文档)的 REST API 访问仍在进行中。在发布博文时,GoogleAuthUtil 仍然是官方记录的在 Android 上进行 REST API 调用的方法。 (2认同)

pRa*_*NaY 1

我认为你需要尝试AsyncTask下面的代码。

private class RetrieveTokenTask extends AsyncTask<String, Void, String> {

    @Override
    protected String doInBackground(String... params) {
        String accountName = params[0];
        String scopes = "oauth2:profile email";
        String token = null;
        try {
            token = GoogleAuthUtil.getToken(getApplicationContext(), accountName, scopes);
        } catch (IOException e) {
            Log.e(TAG, e.getMessage());
        } catch (UserRecoverableAuthException e) {
            startActivityForResult(e.getIntent(), REQ_SIGN_IN_REQUIRED);
    //REQ_SIGN_IN_REQUIRED = 55664;
        } catch (GoogleAuthException e) {
            Log.e(TAG, e.getMessage());
        }
        return token;
    }

    @Override
    protected void onPostExecute(String s) {
        super.onPostExecute(s);
        Log.i("AccessToken",s);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后像下面这样调用AsyncTask来获取访问令牌:

...    
new RetrieveTokenTask().execute(mAccountName);
Run Code Online (Sandbox Code Playgroud)

检查这里。我希望它对你有帮助。

  • 你可以看看[这个问题](http://stackoverflow.com/questions/26969622/how-to-get-refreshtoken-when-using-googleauthutil)。它表明您无法使用“GoogleAuthUtil.getToken()”获取刷新令牌,但是一旦令牌本身失效,它将返回一个新的令牌(刷新令牌) (6认同)