gpt4 book ai didi

android - 从现有用户授权码获取 Google 刷新 token

转载 作者:太空宇宙 更新时间:2023-11-04 01:27:44 27 4
gpt4 key购买 nike

我正在尝试获取Google刷新 token ,问题是我在任何地方都没有看到我当前的场景,我想要完成的是从本地android应用程序的google登录已经生成的用户身份验证 token 中获取刷新 token ,基本上我请求应用程序上需要的每个google权限,以及登录中的身​​份验证代码,使用该身份验证代码我将其发送到我的Firebase功能后端,在那里我尝试获取刷新 token ,但我总是从google获得invalid_grant ,所以我不知道我哪里会搞砸

我看到请求 oauth 离线可能会解决问题,但我登录了 Android 应用程序,所以我无法从后端离线发出登录请求,我需要仅在 Android 应用程序上进行登录和身份验证,并且我需要它通过后端发出 Google Assistant 请求,为此,唯一缺少的是刷新 token

我从 Google 云控制台获取了 google oauth2 key ,并初始化了客户端

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
);

最后尝试获取 token :

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 :

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 是我用来尝试在后端获取刷新 token 的代码

最佳答案

您需要调用

            .requestServerAuthCode(getClientId(),true)

而不是

            .requestServerAuthCode(getClientId())

如果你想获得刷新 token 。您发布的 JavaScript 代码适用于刷新 token 。

这是验证应用程序的最简单方法,因为所有其他类型的 token 都会过期。刷新 token 不会过期。 Google 登录库为您提供了一个访问代码,您已使用该代码来获取刷新 token 。您需要保存此刷新 token 并将其发送给 Google 才能获取访问 token 。然后,访问 token 最终可以用于发出 API 请求。

顺便说一句,这实际上就是“离线访问”所指的意思。我也花了一段时间才弄清楚这一点。

关于android - 从现有用户授权码获取 Google 刷新 token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56933690/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com