Идентификатор токена входа Google недействителен_токен

Мне нужно получить идентификатор токена входа в Google+.

Вот мой код:

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

Я использовал неправильный токен Google при входе в iOS. Первоначально я использовал user.authentication.idToken, что неверно и не будет работать.

Правильный токен — user.authentication.accessToken.

но я не могу найти аналогичный accessToken в объекте GoogleSignInResult....

ОБНОВЛЕНИЕ 2

Я использую отладочный apk. вот мой код нажатия кнопки:

fun onGooglePlusClicked(v: View) {
        val signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient)
        mActivity?.startActivityForResult(signInIntent, GOOGLE_SIGN_IN)
    }

person Andriy Antonov    schedule 13.04.2017    source источник
comment
Вы использовали firebase Auth для входа в систему?   -  person Nithinlal    schedule 13.04.2017
comment
нет, только логин google+   -  person Andriy Antonov    schedule 13.04.2017
comment
Убедитесь, что файл находится в google-services.json в правильном положении. Внутри папки приложения.   -  person Nithinlal    schedule 13.04.2017
comment
это правильно и размещено в правильном месте   -  person Andriy Antonov    schedule 13.04.2017
comment
Где взять WEB_CLIENT_ID ?Какая консоль Firebase или любая другая   -  person Nithinlal    schedule 13.04.2017
comment
из консоли разработчика Google этот идентификатор клиента для веб-клиента. пожалуйста, взгляните на вопрос об обновлении   -  person Andriy Antonov    schedule 13.04.2017
comment
firebase.google.com/docs/auth/android/google-signin вот как теперь мы можем интегрировать знак Google с Android. Я думаю, что Google теперь интегрировал все свои сервисы в firebase.   -  person Nithinlal    schedule 13.04.2017
comment
я использую консоль firebase, но мне не нужно использовать firebaseAuth, весь остальной код - такой же, как по вашей ссылке   -  person Andriy Antonov    schedule 13.04.2017
comment
Итак, вы используете WEB_CLIENT_ID из firebase?   -  person Nithinlal    schedule 13.04.2017
comment
да, это было автоматически сгенерировано   -  person Andriy Antonov    schedule 13.04.2017
comment
Вы используете подписанный apk сейчас, отладочная и подписанная версии имеют отдельный ключ SHA1   -  person Nithinlal    schedule 13.04.2017
comment
Можете ли вы поделиться кодом нажатия кнопки (вызов намерения)?   -  person Nithinlal    schedule 13.04.2017
comment
пожалуйста, обратите внимание на обновление   -  person Andriy Antonov    schedule 13.04.2017
comment
Строка tokenId = result.getIdToken(); вот как получить идентификатор токена для результата попробуйте   -  person Nithinlal    schedule 13.04.2017
comment
result.signInAccount.idToken — это то же самое, но в Котлине. на самом деле этот токен слишком длинный   -  person Andriy Antonov    schedule 13.04.2017
comment
Я уже нашел ответ ) в любом случае - спасибо!   -  person Andriy Antonov    schedule 13.04.2017


Ответы (3)


Очень важная вещь

Google необходимо обновить документацию, потому что она вводит в заблуждение. Либо вы используете iOS, либо Android, вы должны отправить accessToken в серверную часть, а не idToken.

Вы можете получить accessToken из пользовательского объекта (например, val accessToken = user.authentication.accessToken)

Например, если вы хотите получить информацию о пользователе, попробуйте этот запрос GET:

https://www.googleapis.com/oauth2/v3/tokeninfo?access_token={токен_доступа}

person George Bikas    schedule 23.03.2018
comment
Access_token больше не устарел в соответствии с внутренними документами, и следует использовать id_token. Также добавил мой ответ здесь, обновление токена помогает. - person Slobodan Antonijević; 22.02.2021


Ответ в 2021 году: у меня была такая же проблема. Для меня очистка данных приложения полностью решила проблему. Похоже, застрял старый токен с истекшим сроком действия. Также необходимо проверить токен идентификатора здесь https://oauth2.googleapis.com/tokeninfo?id_token=

person Slobodan Antonijević    schedule 22.02.2021