À 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.
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.
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)
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"
}
}
FastAPI Je veux que vous soyez plus populaire.