Holen Sie sich mit Firebase und Fast API das Token auf der Clientseite, fügen Sie es in den Header ein, wenn Sie auf Ihre eigene API treffen, und überprüfen Sie auf der Serverseite, ob Sie angemeldet sind. Hier überprüfen wir das Token mit firebase_admin
von Google.
Aktivieren Sie die Kennwortanmeldung unter Authentifizierung in der Firebase-Konsole und erstellen Sie ein geeignetes Konto, wie unten gezeigt. Hier melden Sie sich damit an.
EMAIL = '[email protected]'
PASSWORD = 'password'
Installieren Sie, was Sie brauchen.
$ pip install requests
Holen Sie sich den folgenden JSON von der Firebase-Konsole und fügen Sie ihn in eine schöne Form ein. (Verwenden Sie eigentlich nur "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"
}
Klicken Sie auf die REST-API von Firebase Auth, um das Token zu erhalten. Die Dokumentation zur REST-API finden Sie hier.
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']
Dieses Token wird zur Laufzeit ausgegeben und später verwendet.
Installieren Sie, was Sie brauchen.
$ pip install fastapi firebase_admin uvicorn
Gehen Sie in der Firebase-Konsole zu Ausrüstung → Dienstkonto → Neuen privaten Schlüssel generieren, um den privaten Schlüssel herunterzuladen und zu laden.
from firebase_admin import auth, credentials
cred = credentials.Certificate("path/to/cert.json")
firebase_admin.initialize_app(cred)
Definiert eine Funktion, die ein Token aus dem Header abruft, es decodiert und Benutzerinformationen abruft. Eigentlich denke ich, dass Sie die Benutzerinformationen von der DB hier erhalten können. Die FastAPI-Dokumentation enthielt ein Beispiel für die Verwendung von "fastapi.security.OAuth2PasswordBearer", beschrieb jedoch nicht, wie man einfach ein Bearer-Token erhält. Ich musste mir den Code ansehen.
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
Definiert einen Endpunkt, auf den nur mit einem gültigen Bearer-Token zugegriffen werden kann. FastAPI ist sehr nützlich, da Sie Depends einfügen und Anmerkungen eingeben können.
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)
Der bisherige Code ist in Gist zusammengefasst. Verwenden Sie zunächst den folgenden Code, um das Token abzurufen und zu kopieren. https://gist.github.com/pteroid/241687ecb5219ae0ce633a884d8ab5bb
Starten Sie dann den Server mit dem folgenden Code. https://gist.github.com/pteroid/a698fd679fb545cb2cfe792f0114938c
Schlagen Sie es mit einem geeigneten REST-Client (ich benutze Insomnia). Dann erhalten Sie das folgende Ergebnis.
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 Ich möchte, dass Sie beliebter werden.
Recommended Posts