Я оцениваю различные параметры аутентификации в среде 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 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']
Получив информацию о пользователе, вы должны следовать процедуре аутентификации, как описано в разделе "Аутентификация пользователя".
Хорошо, я думаю, что нашел свой ответ в исходном коде.
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, похоже, не использует ничего из этого (это немного отбросило меня).