Проверка токена идентификатора входа в Google в Go

Я нахожу способ проверить токен идентификатора для входа в Google для Android с помощью проекта внутреннего сервера Go.

Какова эквивалентная функция для проверки токенов идентификатора с помощью клиентской библиотеки Google API в Go?

На этой странице в разделе "Использование клиентской библиотеки Google API"

https://developers.google.com/identity/sign-in/android/backend-auth#using-a-google-api-client-library.

Существуют примеры Java и Python, а также есть ссылки для токенов проверки идентификаторов с клиентской библиотекой Google API для PHP, Node.js и других языков. Я проверил свой целевой язык; Иди сюда

https://github.com/google/google-api-go-client/blob/master/GettingStarted.md

Однако я не нашел эквивалентной функции для проверки токена, как в примере Java и Python. Есть ли в Go такая функция?

Я не хочу использовать конечную точку с информацией о токене

https://www.googleapis.com/oauth2/v3/tokeninfo?id_token=XYZ123

поскольку это приводит к возможной задержке и сетевой ошибке. Я хочу использовать клиентскую библиотеку Google API. Пожалуйста, подскажите, куда мне заглянуть.


person Ook    schedule 19.04.2016    source источник


Ответы (4)


Вот как я это сделал с помощью https://github.com/google/google-api-go-client:

import (
    "google.golang.org/api/oauth2/v2"
    "net/http"
)

var httpClient = &http.Client{}

func verifyIdToken(idToken string) (*oauth2.Tokeninfo, error) {
    oauth2Service, err := oauth2.New(httpClient)
    tokenInfoCall := oauth2Service.Tokeninfo()
    tokenInfoCall.IdToken(idToken)
    tokenInfo, err := tokenInfoCall.Do()
    if err != nil {
        return nil, err
    }
    return tokenInfo, nil
}

Объект oauth2.Tokeninfo содержит информацию о пользователе. Обратите внимание, что это вызывает вызов https://www.googleapis.com/oauth2/v2/tokeninfo и я думаю, что все клиентские библиотеки Google API делают этот HTTP-вызов изнутри.

person AlexCV    schedule 19.04.2016
comment
Похоже, нам нужно называть oauth2 / v3, а не / v2, и если нам все еще нужно позвонить по этому URL-адресу, как бы избежать задержки и проблем с сетью? - person Ook; 19.04.2016
comment
google-api-go-client не имеет oauth2 / v3, но v2 работает хорошо. Не знаю, удастся ли избежать http-вызова. - person AlexCV; 19.04.2016
comment
oauth2.New(httpClient) кажется, что он помечен как устаревший в пользу oauth2.NewService(ctx, ClientOption) - person Etienne Marais; 26.08.2020
comment
Эта проблема предполагает, что вам действительно следует использовать вместо этого используйте пакет idtoken. - person Gooz; 19.03.2021

Идентификатор Google idToken на самом деле находится в формате JWT, который представляет собой компактный и автономный JSON с подписью.

См. Также: https://jwt.io/introduction/

OAuth2Client.prototype.verifyIdToken google-auth-library-nodejs проверяет idtoken с помощью открытого ключа Google и извлекает ClaimSet из idtoken без вызова конечной точки tokeninfo.

Я просто перенес функцию verifyIdToken из google-auth-library-nodejs и создал для этого библиотеку: https://github.com/futurenda/google-auth-id-token-verifier.

Использование:

import (
     "github.com/futurenda/google-auth-id-token-verifier"
)

v := googleAuthIDTokenVerifier.Verifier{}
aud := "xxxxxx-yyyyyyy.apps.googleusercontent.com"
err := v.VerifyIDToken(TOKEN, []string{
    aud,
})
if err == nil {
    claimSet, err := googleAuthIDTokenVerifier.Decode(TOKEN)
    // claimSet.Iss,claimSet.Email ... (See claimset.go)
}
person Zeno Zeng    schedule 11.03.2017

import (
    "google.golang.org/api/idtoken"
)

var token string           // this comes from your web or mobile app maybe
const googleClientId = ""  // from credentials in the Google dev console

tokenValidator, err := idtoken.NewValidator(context.Background())
if err != nil {
    // handle error, stop execution
}

payload, err := tokenValidator.Validate(context.Background(), token, googleClientId)
if err != nil {
    // handle error, stop execution
}

email := payload.Claims["email"]
name  := payload.Claims["name"]
// and so on...

Возможно, вам потребуется предоставить свои учетные данные Google вашему приложению: https://cloud.google.com/docs/authentication/production

person Guy    schedule 19.07.2020
comment
Перед созданием NewValidator ожидается, что для переменной env GOOGLE_APPLICATION_CREDENTIALS будет установлен файл json, загруженный с консоли. В противном случае idtoken.NewValidator завершится ошибкой, поскольку ожидает некоторых учетных данных. Я не могу заставить его работать с idtoken.Validate. Я получаю эту ошибку: Получите googleapis.com/oauth2/v3/certs: закрытый ключ должен быть PEM или простой PKCS1 или PKCS8; ошибка синтаксического анализа: asn1: синтаксическая ошибка: последовательность усечена. Любая идея? - person Anton; 09.01.2021

Это очень просто и имеет однострочное решение. Просто воспользуйтесь официальной библиотекой:

go get google.golang.org/api/idtoken"

а затем напишите этот код:

payload, err := idtoken.Validate(context.Background(), request.IdToken, "your google client id")
if err != nil {
    panic(err)
}
fmt.Print(payload.Claims)

Тогда вы получите такой результат:

map[
    aud:<Your web application client id>
    azp:<Your android application client id>
    email:<Authenticated user email> 
    email_verified:true
    exp:<expire at>
    family_name:<Authenticated user lastname>
    given_name:<Authenticated user firstname>
    iat:<issued at>
    iss: <accounts.google.com or https://accounts.google.com>
    locale:en
    name:<Authenticated User fullname>
    picture:<Authenticated User Photo URL>
    sub: <Google Account ID [Use this to identify a id uniquely]>
]

person princebillyGK    schedule 15.04.2021
comment
Я считаю, что это новый правильный ответ. Немного сбивает с толку, что idtoken - это подпакет oauth2 на других языках, таких как Python, но в Go это отдельная библиотека - person Asad-ullah Khan; 19.06.2021