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= 检查并被接受。