Как декодировать 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