Как использовать oauth-библиотеки Google Python для реализации OpenID Connect?

1

Я оцениваю различные параметры аутентификации в среде Flex для приложений App Engine, для приложений, которые работают в домене G Suite.

Я пытаюсь собрать воедино инструкции OpenID Connect "поток сервера" здесь с тем, как Google-Auth-библиотека-питон реализует общие инструкции OAuth2 здесь.

Я как бы отслеживаю вещи до 4. Код Exchange для токена доступа и токена ID, который выглядит как flow.fetch_token, за исключением того, что он говорит: "Ответ на этот запрос содержит следующие поля в массиве JSON" и включает не только доступ но токен и другие вещи. Я видел этот патч в библиотеке. Означает ли это, что я мог бы использовать некоторый flow.fetch_token для создания IDTokenCredentials (как?), А затем использовать его для создания клиента API OpenID Connect (и где этот API документирован)? А как насчет проверки маркера id, есть ли отдельная библиотека python, чтобы помочь с этим или является частью библиотеки API?

Все это очень запутанно. Многое было бы прояснено каким-то фактическим примером "суп-орехи", но я ничего не нашел в Интернете, что заставляет меня думать (а), возможно, это не жизнеспособный способ сделать аутентификацию, или (b), так недавно библиотеки python не догнали? Однако я бы скорее сделал проверку подлинности на сервере, чем на клиенте с помощью входа в Google.

Любые предложения или ссылки на код очень ценятся.

Теги:
google-app-engine
openid-connect
google-oauth

2 ответа

2
Лучший ответ

Кажется, библиотека Google python содержит модуль для проверки маркера id. Это можно найти в модуле google.oauth2.id_token. После проверки он вернет декодированный токен, который вы можете использовать для получения информации о пользователе.

from google.oauth2 import id_token
from google.auth.transport import requests

request = requests.Request()

id_info = id_token.verify_oauth2_token(
    token, request, 'my-client-id.example.com')

if id_info['iss'] != 'https://accounts.google.com':
    raise ValueError('Wrong issuer.')

userid = id_info['sub']

Получив информацию о пользователе, вы должны следовать процедуре аутентификации, как описано в разделе "Аутентификация пользователя".

  • 0
    Благодарю. Да, покопавшись немного больше, я это увидел (и код для того, как кешировать сертификаты). Другая половина вопроса заключается в том, как сделать запрос токена, чтобы получить токен id в первую очередь, в разгар потока веб-приложений. Возможно, это нужно сделать вручную на этом этапе?
1

Хорошо, я думаю, что нашел свой ответ в исходном коде.

google.oauth2.credentials.Credentials предоставляет id_token:

В зависимости от сервера авторизации и запрашиваемых областей это может быть заполнено, когда учетные данные будут получены и обновлены при вызове refresh. Этот токен - это JWT. Он может быть проверен и декодирован [как указано @kavindu-dodanduwa] с помощью google.oauth2.id_token.verify_oauth2_token.

И несколько слоев вниз по стеку вызовов, которые мы видим, fetch_token делает некоторую минимальную проверку ответа JSON (проверяя, что маркер доступа был возвращен и т.д.), Но в основном проходит через все, что он получает от конечной точки маркера, включая (то есть, если OpenID Connect область включена) маркер id как JWT.

РЕДАКТИРОВАТЬ:

И последний фрагмент головоломки - это перевод токенов с (общего) OAuthSession на (Google-специфические) учетные данные в google_auth_oauthlib.helpers, где id_token схвачен, если он существует.

Обратите внимание, что общая библиотека oauthlib, похоже, теперь реализует OpenID Connect, но выглядит очень недавно и в процессе (июль 2018 года). На данный момент Google, похоже, не использует ничего из этого (это немного отбросило меня).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню