Zum Hauptinhalt springen

Leitfaden: Python

Schritt 1: Extrahiere das Bearer-Token aus dem Anfrage-Header

Eine autorisierte Anfrage sollte einen Authorization-Header mit Bearer <access_token> als Inhalt enthalten. Extrahiere das Autorisierungstoken aus dem Anfrage-Header:

"""requires-auth.py
"""
def get_auth_token():
auth = request.headers.get("Authorization", None)

if not auth:
raise Error({ code: 'auth.authorization_header_missing', status: 401 })

contents = auth.split()

if len(contents) < 2
raise Error({code: 'auth.authorization_token_invalid_format', status: 401})

elif contents[0] != 'Bearer'
raise Error({code: 'auth.authorization_token_type_not_supported', status: 401})

return contents[1]

Schritt 2: Token-Validierung

Zur Demonstration verwenden wir die Flask-App und das jose-Paket, um den require_auth-Decorator zu erstellen, der die Signatur, den Ablaufstatus und die erforderlichen Ansprüche des Tokens validiert.

Installiere python-jose als Abhängigkeit

Wähle die Kryptografie, die du in Logto verwendest. (ecdsa standardmäßig)

pip install python-jose[ecdsa]

Abrufen der OIDC-Konfigurationen von Logto

Du benötigst einen JWK-öffentlichen Schlüssel und den Token-Aussteller, um die Signatur und Quelle des empfangenen JWS-Tokens zu überprüfen. Alle aktuellen öffentlichen Logto-Autorisierungskonfigurationen findest du unter https://<your-logto-domain>/oidc/.well-known/openid-configuration.

z.B. Rufe https://tenant-id.logto.app/oidc/.well-known/openid-configuration auf. Und finde die folgenden zwei Felder im Antwortkörper:

{
"jwks_uri": "https://tenant-id.logto.app/oidc/jwks",
"issuer": "https://tenant-id.logto.app/oidc"
}

Erstelle den Autorisierungsvalidierungs-Decorator

warnung

Wenn du rollenbasierte Zugangskontrolle (RBAC) verwendest, ist auch eine Berechtigungsprüfung erforderlich.

"""requires-auth.py
"""

import json
from flask import request, _request_ctx_stack
from six.moves.urllib.request import urlopen
from functools import wraps
from jose import jwt

def requires_auth(f):
@wraps(f)
def decorated(*args, **kwargs):
token = get_token_auth_header()

# jwks_uri-Endpunkt von Logto abgerufen
jwks_uri = urlopen('https://<your-logto-domain>/oidc/jwks')

# Aussteller von Logto abgerufen
issuer = 'https://<your-logto-domain>/oidc'

jwks = json.loads(jwks_uri.read())

try:
payload = jwt.decode(
token,
jwks,
# Der jwt-Codierungsalgorithmus zusammen mit jwks abgerufen. ES384 standardmäßig
algorithms=jwt.get_unverified_header(token).get('alg'),
# Der registrierte Ressourcenindikator der API in Logto
audience='<your request listener resource indicator>',
issuer=issuer,
options={
'verify_at_hash': False
}
)
except Exception:
# Ausnahmebehandlung
raise Error({code: 'invalid_token', status: 401})

# Benutzerdefinierter Code zur Verarbeitung der Nutzlast
_request_ctx_stack.top.user_id = payload.get('sub')

return f(*args, **kwargs)
return decorated

Wende den Decorator auf deine API an

from flask import Flask
from flask_cors import cross_origin

APP = Flask(__name__)

@APP.route("/user/info")
@cross_origin(headers=["Content-Type", "Authorization"])
@requires_auth
def api:
# Deine API-Logik