Ответ 1
Я слишком недавно столкнулся с этой проблемой и нашел два решения.
Но перед этим вам нужно понять, что делает библиотека python (или других рекомендуемых библиотек клиентов).
- Он нажал https://www.googleapis.com/oauth2/v2/certs, чтобы получить массив открытых ключей rsa.
- Декодировать токен.
- Использует поле "kid" (key id) из декодированного токена для генерации ключа pem для сопоставления открытого ключа RSA.
- Проверить подпись токена (который после 2-й точки в токене jwt) с помощью клавиши pem.
Теперь два решения:
-
Использование официальной библиотеки oauth "google.golang.org/api/oauth2/v2"
func getTokenInfo(idToken string) (*oauth2.Tokeninfo, error) { oauth2Service, err := oauth2.New(&http.Client{}) if err != nil { return nil, err } tokenInfoCall := oauth2Service.Tokeninfo() tokenInfoCall.IdToken(idToken) return tokenInfoCall.Do() }
Из Tokeninfo вы можете проверить, что аудитория (tokenInfo.Audience) и выдана (tokenInfo.IssuedTo) действительны. И другие параметры, которые вы хотите проверить. Но официальная библиотека Голанга не следит за процессом, о котором я упоминал ранее. Он попадает на www.googleapis.com/oauth2/v2/tokeninfo для генерации tokeninfo (не www.googleapis.com/oauth2/v3/tokeninfo. v2 не дает некоторого поля, такого как "имя", но каждое поле, включая электронную почту, которое необходимо проверить на токен.).
-
Использование библиотеки GoogleIdTokenVerifier, которая представляет собой порт библиотеки python.
Что вы можете сделать для повышения эффективности процесса, это кэширование сертификатов и pem. Если не появился токен с новым "ребенком", не попадайте в URL-адрес.
Проведите проверку и проверьте, какой подход выполняется быстрее. Эта вещь о задержке может быть неправильной, поскольку вы используете сеть для получения сертификатов.