Получить токен Google Refresh из существующего кода авторизации пользователя - PullRequest
1 голос
/ 08 июля 2019

Я пытаюсь получить токен Google Refresh, дело в том, что я нигде не видел свой текущий сценарий, чего я пытаюсь добиться, так это получить токен обновления из пользовательского токена авторизации, уже сгенерированного Googleвойдите из нативного приложения для Android, в основном я запрашиваю каждое разрешение Google, которое мне нужно в приложении, и код авторизации от входа, с этим кодом авторизации я отправляю его в свой бэкэнд функций Firebase, там я пытаюсь получить обновлениетокен, но я всегда получаю invalid_grant от Google, так что я не знаю, где я мог испортить

Я видел, что запрос oauth в автономном режиме может решить проблему, но я вхожу в приложение для Android, поэтомуЯ не могу сделать запрос на вход в автономном режиме из бэкэнда, мне нужно, чтобы вход и аутентификация были только в приложении для Android, и мне нужно, чтобы запросы помощника Google передавались через бэкэнд, и для этого единственное, чего не хватает, это токен обновления

У меня есть мой ключ Google oauth2 из облачной консоли Google, и клиент инициализируетсяd

var OAuth2 = google.auth.OAuth2;

var _client_id = require('./config/secrets/omni.json').installed.client_id; 
var _client_secret = require('./config/secrets/omni.json').installed.client_secret;
var redirect = require('./config/secrets/omni.json').installed.redirect_uris[1];

return new OAuth2(
        _client_id,
        _client_secret,
        redirect
        );

И, наконец, попытайтесь получить токен:

function getRefreshToken(authCode, idFBUser) {
    return new Promise((resolve, reject) => {
        getOAuthClient().getToken(authCode, function(err, token) {
            if (!err) {
                console.log(`Get Token success, token: ${token}`);
                getOAuthClient().setCredentials(token);
                saveRefreshFirebase(idFBUser, token)
                resolve(token);
            } else {
                console.log("Get Token error", err);
                reject(err);
            }
        });
    });
}

ошибка, которую я получаю именно так: {error: 'invalid_grant', error_description: 'Bad Request'}

Метод, который я использую в приложении для Android для запроса кода авторизации, таков:

Создание экземпляра GoogleSignIn

val gso = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
            .requestIdToken(getString(R.string.default_web_client_id))
            .requestEmail()
            .requestId()
            .requestIdToken(getClientId())
            .requestServerAuthCode(getClientId())
            .requestScopes(ASSISTANT_SCOPE)
            .build()

googleSignInClient = GoogleSignIn.getClient(this, gso)

Вызов Intent Intent:

val signInIntent = googleSignInClient.signInIntent
startActivityForResult(signInIntent, RESULT_GOOGLE_SIGNIN)

Обработка результата входа в систему:

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if (resultCode == Activity.RESULT_OK) {
            when (requestCode) {
                RESULT_GOOGLE_SIGNIN -> {
                    val task = GoogleSignIn.getSignedInAccountFromIntent(data)
                    try {
                        task.result?.let {  account ->
                            val id = account.id
                            val idToken = account.idToken
                            val authCode = account.serverAuthCode
                            Log.d("GoogleSignIn", "ID: $id")
                            Log.d("GoogleSignIn", "ID Token: $idToken")
                            Log.d("GoogleSignIn", "Auth code: $authCode")
                            btnLogin.text = "Sign Out"
                            loggedIn = true
                        } ?: Log.e("GoogleSignIn", "Exception: ${task.exception}")
                    } catch (e: Exception) {
                        Log.e("GoogleSignIn", "Catch Exception: $e")
                    }
                }
            }
        }
    }

, и я использовал authCode для получения токена обновления в бэкэнде

1 Ответ

0 голосов
/ 08 июля 2019

Вам нужно позвонить

            .requestServerAuthCode(getClientId(),true)

вместо

            .requestServerAuthCode(getClientId())

Если вы хотите получить токен обновления. Размещенный вами код JavaScript работает с токенами обновления.

Это самый простой способ проверки подлинности вашего приложения, поскольку срок действия всех других типов токенов истекает. Обновление токенов не имеет срока действия. Библиотека входа в Google дает вам код доступа, который вы уже используете для получения токена обновления. Вам необходимо сохранить этот токен обновления и отправить его в Google, чтобы получить токены доступа. Затем, наконец, токен доступа можно использовать для выполнения запросов API.

Кстати, именно это и означает «автономный доступ». Мне понадобилось время, чтобы понять это.

...