Émission de jetons d'authentification Firebase en Python et validation de jetons avec Fast API

Choses à faire

À l'aide de Firebase et de l'API Fast, récupérez le jeton côté client, collez-le dans l'en-tête lorsque vous accédez à votre propre API et vérifiez côté serveur pour déterminer si vous êtes connecté. Ici, nous vérifierons le jeton à l'aide de firebase_admin créé par Google.

Émettre un jeton

Activez la connexion par mot de passe dans Authentification sur la console Firebase et créez un compte approprié comme indiqué ci-dessous. Ici, connectez-vous en utilisant ceci.

EMAIL = '[email protected]'
PASSWORD = 'password'

Installez ce dont vous avez besoin.

$ pip install requests

Obtenez le JSON suivant à partir de la console Firebase et collez-le dans une belle forme. (En fait, n'utilisez que ʻapiKey`)

CONFIG = {
    "apiKey": "YOUR API KEY",
    "authDomain": "YOURPROJECTID.firebaseapp.com",
    "databaseURL": "https://YOURPROJECTID.firebaseio.com",
    "projectId": "YOUR PROJECT ID",
    "storageBucket": "YOUR PROJECT ID.appspot.com",
    "messagingSenderId": "YOUR MESSAGE SENDER ID",
    "appId": "YOUR:APP:ID",
    "measurementId": "YOUR MEASUREMENT ID"
}

Accédez à l'API REST de Firebase Auth pour obtenir le jeton. La documentation de l'API REST est ici.

api_key = CONFIG["apiKey"]
uri = f"https://www.googleapis.com/identitytoolkit/v3/relyingparty/verifyPassword?key={api_key}"
data = {"email": EMAIL, "password": PASSWORD, "returnSecureToken": True}

result = requests.post(url=uri, data=data).json()

token = result['idToken']

Ce jeton est sorti au moment de l'exécution et sera utilisé plus tard.

Valider les jetons avec FastAPI

Installez ce dont vous avez besoin.

$ pip install fastapi firebase_admin uvicorn

Depuis la console Firebase, accédez à Gear → Compte de service → Générer une nouvelle clé privée pour télécharger et charger la clé privée.

from firebase_admin import auth, credentials

cred = credentials.Certificate("path/to/cert.json")
firebase_admin.initialize_app(cred)

Définit une fonction qui obtient un jeton de l'en-tête, le décode et obtient des informations utilisateur. En fait, je pense que vous pouvez obtenir les informations utilisateur de la base de données ici. La documentation FastAPI avait un exemple d'utilisation de fastapi.security.OAuth2PasswordBearer, mais elle ne décrivait pas comment simplement obtenir un jeton Bearer, je devais regarder le code.

from fastapi.security import HTTPBearer, HTTPAuthorizationCredentials
from fastapi import Depends, HTTPException, status

def get_current_user(cred: HTTPAuthorizationCredentials = Depends(HTTPBearer())):
    try:
        decoded_token = auth.verify_id_token(cred.credentials)
    except:
        raise HTTPException(
            status_code=status.HTTP_401_UNAUTHORIZED,
            detail='Invalid authentication credentials',
            headers={'WWW-Authenticate': 'Bearer'},
        )

    user = decoded_token['firebase']['identities']

    return user

Définit un point de terminaison accessible uniquement avec un jeton de support valide. FastAPI est vraiment utile car vous pouvez injecter ce que vous voulez avec Depends et taper des annotations.

from fastapi import FastAPI, Depends, HTTPException, status

app = FastAPI()

@app.get('/')
async def homepage(current_user=Depends(get_current_user)):
    return {'msg': 'ok', 'user': current_user}

if __name__ == '__main__':
    import uvicorn

    uvicorn.run(app, host='localhost', port=5000)

Exécuter

Le code jusqu'à présent est résumé dans Gist. Tout d'abord, utilisez le code ci-dessous pour obtenir le jeton et le copier. https://gist.github.com/pteroid/241687ecb5219ae0ce633a884d8ab5bb

Démarrez ensuite le serveur avec le code suivant. https://gist.github.com/pteroid/a698fd679fb545cb2cfe792f0114938c

Frappez-le avec un client REST approprié (j'utilise Insomnia). Ensuite, vous obtiendrez le résultat suivant.

request


> GET / HTTP/1.1
> Host: localhost:5000
> User-Agent: insomnia/7.1.1
> Authorization: Bearer 
YOURTOKENYOURTOKENYOURTOKENYOURTOKENYOURTOKENYOURTOKENYOURTOKENYOURTOKENYOURTOKENYOURTOKENYOURTOKEN
> Accept: */*

response


{
  "msg": "ok",
  "user": {
    "identities": {
      "email": [
        "[email protected]"
      ]
    },
    "sign_in_provider": "password"
  }
}

finalement

FastAPI Je veux que vous soyez plus populaire.

Recommended Posts

Émission de jetons d'authentification Firebase en Python et validation de jetons avec Fast API
Processus d'authentification avec gRPC et authentification Firebase
Authentification sans mot de passe avec RDS et IAM (Python)
Gérer les "années et mois" en Python
Obtenez l'objet et le corps de Gmail avec Python et l'API Gmail
Envoyer HTTP avec l'en-tête d'authentification de base en Python
Accédez à l'API Firebase Dynamic Links en Python
Essayez d'utiliser l'API ChatWork et l'API Qiita en Python
Automatisez la suppression de l'arrière-plan pour les derniers portraits dans un répertoire avec Python et API
Jouer avec l'API d'intelligence artificielle locale de l'utilisateur en Python
API Evernote en Python
[Fast API + Firebase] Construction d'un serveur API pour l'authentification au porteur
Calculer la différence entre Pose et Transform avec ROS en Python
Exploration avec Python et Twitter API 1 - Fonction de recherche simple
Démarrer le calcul numérique avec Python (avec Homebrew et pip)
API C en Python 3
[Python] Obtenez des informations sur les utilisateurs et des articles sur l'API de Qiita
API Nifty Cloud facile à utiliser avec botocore et python
Veriloggen et cocotb sont utilisés pour concevoir et tester Verilog en Python uniquement.
Essayez d'utiliser l'API Twitter rapidement et facilement avec Python
Authentification de base avec mot de passe crypté (.htpasswd) avec bouteille en python
J'ai essayé la gestion du suivi avec l'API Twitter et Python (facile)
[API LINE Messaging] Émettre un jeton d'accès au canal v2.1 en Python
Créer une fonction d'authentification à l'aide de django-allauth et CustomUser dans Django
Prédire le sexe à partir du nom à l'aide de l'API Gender et de Pykakasi en Python
Introduction à la vérification des effets Rédaction des chapitres 4 et 5 en Python
Jouez avec les archives de Mastodon dans les réponses et les favoris de Python 2 Count
Génération de spécifications et génération de code dans le développement d'API REST (édition Python)
Installez CaboCha dans l'environnement Ubuntu et appelez-le avec Python.
Mettez en place le géocodage inversé en japonais avec l'API Python Google Maps
Comment se connecter à AtCoder avec Python et soumettre automatiquement
Hit API de Mastodon en Python
Programmation avec Python et Tkinter
Chiffrement et déchiffrement avec Python
Utiliser l'API Trello avec python
Grattage au sélénium en Python
Python et matériel - Utilisation de RS232C avec Python -
Exploitez LibreOffice avec Python
Grattage avec chromedriver en python
Authentification BASIC avec bouteille Python
Utiliser l'API Twitter avec Python
Débogage avec pdb en Python
Gérer les sons en Python
Grattage avec du sélénium en Python
Grattage avec Tor en Python
API Web avec Python + Falcon
Tweet avec image en Python
Combiné avec ordinal en Python
Pile et file d'attente en Python
Mettre en œuvre un RPC rapide en Python
API Blender Python dans Houdini (Python 3)
Appelez l'API avec python3.
python avec pyenv et venv
Unittest et CI en Python
Utiliser l'API subsonique avec python3
Fonctionne avec Python et R
Faites fonctionner Jupyter avec l'API REST pour extraire et enregistrer le code Python
Interpolation automatique des images avec OpenCV et Python (méthode de marche rapide, Navier-Stokes)
Exemple à utiliser après l'authentification OAuth de l'API BOX avec Python