Android: Как получить токен обновления с помощью API входа в систему Google?

В настоящее время я работаю над приложением, в котором пользователь может войти в систему с помощью 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());
        }

Класс GoogleAuthUtil, с которого я обращаюсь к токену доступа, не имеет функции для обновления токена. Итак, как получить доступ к токена обновления? Спасибо заранее!

Ответ 1

Вы должны использовать серверный поток аутентификации сервера через Auth.GOOGLE_SIGN_IN_API: получить код авторизации сервера на клиенте Android, отправить на сервер, сервер обменяет код для токена обновления и доступа (с тайной). В этом сообщении также есть более подробная информация.

Кроме того, если вы используете GoogleAuthUtil.getToken для доступа к токену сейчас, вы хотите проверить это Сообщение в блоге Google по лучшей практике Google, чтобы узнать, как перейти к рекомендуемому потоку, чтобы обеспечить безопасность и лучший UX.

Ответ 2

Я думаю, вам нужно попробовать этот код в 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);
    }
}

Затем вызовите AsyncTask, как показано ниже, чтобы получить токен доступа:

...    
new RetrieveTokenTask().execute(mAccountName);

Отметьте здесь. Надеюсь, это поможет вам.