我需要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
我在iOS登录时使用了错误的Google令牌。一世 最初使用的user.authentication.idToken是错的,并且会 不行。
正确的令牌是user.authentication.accessToken。
但我无法在GoogleSignInResult对象中找到任何类似的accessToken ....
更新2
我正在使用调试apk。 这是我的按钮点击代码:
fun onGooglePlusClicked(v: View) {
val signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient)
mActivity?.startActivityForResult(signInIntent, GOOGLE_SIGN_IN)
}
答案 0 :(得分:1)
非常重要
Google需要更新文档,因为它具有误导性。 无论您使用的是iOS还是Android,都必须将 accessToken 发送到后端,不是idToken
您可以从用户对象获取accessToken(例如val accessToken = user.authentication.accessToken)
例如,如果您想获取用户信息,请尝试以下GET请求:
https://www.googleapis.com/oauth2/v3/tokeninfo?access_token= {}的access_token
答案 1 :(得分:0)
答案是在这里建立的: 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()
}
希望这会有所帮助:)
答案 2 :(得分:0)
2021 年的答案: 我遇到了同样的问题。 对我来说,清除应用程序数据完全解决了这个问题。 好像一个旧的过期令牌卡住了。 还应在此处验证 id 令牌 https://oauth2.googleapis.com/tokeninfo?id_token=