Я пытаюсь получить токен 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 для получения токена обновления в бэкэнде