Google signIn tokenId是invalid_token

时间:2017-04-13 13:52:24

标签: android google-signin google-client

我需要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)
    }

3 个答案:

答案 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=