Google 登录 tokenId 是 invalid_token
Google signIn tokenId is invalid_token
我需要获取 google+ signIn tokenId。
这是我的代码:
var mGSO = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestIdToken(WEB_CLIENT_ID)//from developer console
.requestEmail()
.build()
mGoogleApiClient = GoogleApiClient.Builder(mActivity)
.enableAutoManage(mActivity, this)
.addApi(Auth.GOOGLE_SIGN_IN_API, mGSO)
.build()
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
val result = Auth.GoogleSignInApi.getSignInResultFromIntent(data)
var tokenId = result.signInAccount.idToken
}
所以我成功获得了 tokenId,但是当我尝试在这里检查它时 (https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=) 我收到消息:
{
"error": "invalid_token",
"error_description": "Invalid Value"
}
我每次尝试得到的令牌都是一样的!
怎么了?
知道如何解决这个问题吗?
更新
发现这个问题:https://github.com/PhilipGarnero/django-rest-framework-social-oauth2/issues/61
I was using the wrong google token from my sign-in on iOS. I
originally used user.authentication.idToken which is wrong, and will
not work.
The correct token is user.authentication.accessToken.
但我无法在 GoogleSignInResult 对象中找到任何类似的 accessToken....
更新 2
我正在使用调试 apk。
这是我的按钮点击代码:
fun onGooglePlusClicked(v: View) {
val signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient)
mActivity?.startActivityForResult(signInIntent, GOOGLE_SIGN_IN)
}
答案建立于此:
https://developers.google.com/identity/protocols/CrossClientAuth
关键词:GoogleAuthUtil.getToken()
所以,这是我更新的代码:
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
val result = Auth.GoogleSignInApi.getSignInResultFromIntent(data)
Observable.create(Observable.OnSubscribe<String> {
var **accessTokent** = GoogleAuthUtil.getToken(mActivity!!, result.signInAccount.account, "oauth2:" + Scopes.PLUS_LOGIN)
//send token to server
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe()
}
希望这会对某人有所帮助:)
非常重要的事情
Google 需要更新文档,因为它具有误导性。
您在 iOS 或 Android 上,您必须将 accessToken 发送到后端并且 而不是 idToken
您可以从用户对象获取 accessToken(例如 val accessToken = user.authentication.accessToken)
例如,如果你想获取用户信息,试试这个 GET 请求:
https://www.googleapis.com/oauth2/v3/tokeninfo?access_token={access_token}
2021 年回答:
我有同样的问题。
对我来说,清除应用数据完全解决了这个问题。
好像旧的过期令牌卡住了。
此外,id 令牌 应在此处进行验证
https://oauth2.googleapis.com/tokeninfo?id_token=
就我而言,我在 Unity 中对此进行了测试,并复制了我在 logcat 中打印的 idToken
值。事实证明,adb logcat 或 Unity 的 Debug.Log()
方法中的一行有一些字符或大小限制(1024 字节?)。所以打印的令牌值被截断了。然后我为测试所做的是,我在运行时将令牌值复制到剪贴板,然后再次使用令牌信息端点 https://oauth2.googleapis.com/tokeninfo?id_token=
检查并被接受。
我需要获取 google+ signIn tokenId。
这是我的代码:
var mGSO = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestIdToken(WEB_CLIENT_ID)//from developer console
.requestEmail()
.build()
mGoogleApiClient = GoogleApiClient.Builder(mActivity)
.enableAutoManage(mActivity, this)
.addApi(Auth.GOOGLE_SIGN_IN_API, mGSO)
.build()
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
val result = Auth.GoogleSignInApi.getSignInResultFromIntent(data)
var tokenId = result.signInAccount.idToken
}
所以我成功获得了 tokenId,但是当我尝试在这里检查它时 (https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=) 我收到消息:
{
"error": "invalid_token",
"error_description": "Invalid Value"
}
我每次尝试得到的令牌都是一样的! 怎么了? 知道如何解决这个问题吗?
更新
发现这个问题:https://github.com/PhilipGarnero/django-rest-framework-social-oauth2/issues/61
I was using the wrong google token from my sign-in on iOS. I originally used user.authentication.idToken which is wrong, and will not work.
The correct token is user.authentication.accessToken.
但我无法在 GoogleSignInResult 对象中找到任何类似的 accessToken....
更新 2
我正在使用调试 apk。 这是我的按钮点击代码:
fun onGooglePlusClicked(v: View) {
val signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient)
mActivity?.startActivityForResult(signInIntent, GOOGLE_SIGN_IN)
}
答案建立于此: https://developers.google.com/identity/protocols/CrossClientAuth
关键词:GoogleAuthUtil.getToken()
所以,这是我更新的代码:
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
val result = Auth.GoogleSignInApi.getSignInResultFromIntent(data)
Observable.create(Observable.OnSubscribe<String> {
var **accessTokent** = GoogleAuthUtil.getToken(mActivity!!, result.signInAccount.account, "oauth2:" + Scopes.PLUS_LOGIN)
//send token to server
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe()
}
希望这会对某人有所帮助:)
非常重要的事情
Google 需要更新文档,因为它具有误导性。 您在 iOS 或 Android 上,您必须将 accessToken 发送到后端并且 而不是 idToken
您可以从用户对象获取 accessToken(例如 val accessToken = user.authentication.accessToken)
例如,如果你想获取用户信息,试试这个 GET 请求:
https://www.googleapis.com/oauth2/v3/tokeninfo?access_token={access_token}
2021 年回答: 我有同样的问题。 对我来说,清除应用数据完全解决了这个问题。 好像旧的过期令牌卡住了。 此外,id 令牌 应在此处进行验证 https://oauth2.googleapis.com/tokeninfo?id_token=
就我而言,我在 Unity 中对此进行了测试,并复制了我在 logcat 中打印的 idToken
值。事实证明,adb logcat 或 Unity 的 Debug.Log()
方法中的一行有一些字符或大小限制(1024 字节?)。所以打印的令牌值被截断了。然后我为测试所做的是,我在运行时将令牌值复制到剪贴板,然后再次使用令牌信息端点 https://oauth2.googleapis.com/tokeninfo?id_token=
检查并被接受。