Как декодировать Firebase JWT токен в Python

Я добавил Firebase, чтобы клиенты могли проходить аутентификацию прямо из клиента веб-приложения (браузера). Я использую пакет firebase-web JS, и он прекрасно работает. Я вижу в своем браузере, что я получаю объект пользователя с информацией о пользователе, включая idToken,

Мне нужно аутентифицировать этого пользователя на моем сервере, который является Python Django. В документации по Firebase я нашел практическое руководство для именно того, что я пытаюсь сделать, а именно для проверки токена id.

Поскольку у них нет поддерживаемого Firebase SDK для Python, мне нужно использовать стороннее решение. Я пришел к пакету python-jose после того, как нашел его в списке на сайте jwt.io. Пример выглядит достаточно просто:

jwt.decode(token, 'secret', algorithms=['RS256'])

Я впервые использую JWT. Я не знаю, что использовать для 'secret', Я попытался вставить свой токен как tokenи ключ веб-API от консоли Firebase для secret, но получил эту ошибку:

jose.exceptions.JWKError: формат ключа RSA не поддерживается

Я также попробовал отладчик JWT, который, кажется, правильно читает большую часть моего идентификатора, но при проверке подписи ищет открытый и / или закрытый ключи, такие как 'secret' убегают от меня.

Я действительно в недоумении, как найти этот секрет и как проверить токен идентификатора JWT в целом. Информация о документации Firebase (сторонний раздел):

Наконец, убедитесь, что идентификационный токен был подписан секретным ключом, соответствующим заявке токена на ребенка. Возьмите открытый ключ с https://www.googleapis.com/robot/v1/metadata/x509/securetoken@system.gserviceaccount.com и используйте библиотеку JWT для проверки подписи. Используйте значение max-age в заголовке Cache-Control ответа от этой конечной точки, чтобы узнать, когда обновлять открытые ключи.

Я попытался вставить весь BLOB-объект json из этого URL-адреса googleapis в отладчик JWT, но все равно получаю предупреждение "Недопустимая подпись". Я не понимаю, как использовать этот открытый ключ.

Должен ли Python-Jose работать для этого подхода? Если так, что я должен использовать для секрета? Если нет, может ли кто-нибудь указать мне правильное направление?

Благодарю.

1 ответ

Наконец-то я нашел ответ, который искал в этом посте: Миграция бэкэнда Python из Gitkit в Firebase-Auth с python-jose для проверки токена

Со времени публикации были сделаны обновления для python-jose пакет, который дает лучшую поддержку токенов Firebase ID. Вот некоторый рабочий код (jose version 1.3.1) о том, как использовать python для декодирования токена Firebase ID:

import urllib, json
from jose import jwt

idtoken = "<id token passed to server from firebase auth>"

target_audience = "<firebase app id>"

certificate_url = 'https://www.googleapis.com/robot/v1/metadata/x509/securetoken@system.gserviceaccount.com'

response = urllib.urlopen(certificate_url)
certs = response.read()
certs = json.loads(certs)

#will throw error if not valid
user = jwt.decode(idtoken, certs, algorithms='RS256', audience=target_audience)
print user
Другие вопросы по тегам