Ich versuche Auth0 JWT-basierte Authentifizierung in meiner Django REST API mit dem Django-Rest-Framework zu implementieren. Ich weiß, dass es eine JWT-Bibliothek für das REST-Framework gibt, und ich habe versucht, sie zu verwenden, weil der offizielle Auth0-Twitter-Account erwähnt hat, dass es gut mit auth0 + Django funktionieren sollte.Django + Auth0 JWT-Authentifizierung verweigert Decodierung
BEARBEITEN: Ich verwende the official auth0 python api guide für diesen Code. Es ist für Flask geschrieben, aber ich dachte, ich könnte es einfach nach Django portieren, da sie ähnlich arbeiten.
Nun, das hat nicht geklappt, wie ich wollte, also versuche ich meinen eigenen login_required
Dekorateur für eine Ansicht zu schreiben. Der Code, den ich hier habe, ist wie folgt:
def auth_required(f):
def wrap(request, *args, **kwargs):
auth = request.META.get('HTTP_AUTHORIZATION', None)
if not auth:
return authenticate({'code': 'authorization_header_missing', 'description': 'Authorization header is expected'})
parts = auth.split()
if parts[0].lower() != 'bearer':
return authenticate({'code': 'invalid_header', 'description': 'Authorization header must start with Bearer'})
elif len(parts) == 1:
return authenticate({'code': 'invalid_header', 'description': 'Token not found'})
elif len(parts) > 2:
return authenticate({'code': 'invalid_header', 'description': 'Authorization header must be Bearer + \s + token'})
token = parts[1]
try:
payload = jwt.decode(
token,
base64.b64decode(SECRET.replace("_","/").replace("-","+")),
audience=CLIENT_ID,
)
except jwt.ExpiredSignature:
return authenticate({'code': 'token_expired', 'description': 'token is expired'})
except jwt.InvalidAudienceError:
return authenticate({'code': 'invalid_audience', 'description': 'incorrect audience, expected: ' + CLIENT_ID})
except jwt.DecodeError:
return authenticate({'code': 'token_invalid_signature', 'description': 'token signature is invalid'})
return f(request, *args, **kwargs)
wrap.__doc__=f.__doc__
wrap.__name__=f.__name__
return wrap
nun die authenticate()
grundsätzlich für Jsonify()
meine benutzerdefinierte Implementierung ist, die in der Dokumentation von Auth0 für Python-API verwendet wird. Ich habe überprüft, dass das funktioniert, das ist also kein Problem.
SECRET
ist mein Auth0 secret, in Base64 codiert (andere Schlüssel zu dekodieren fehlgeschlagen)
CLIENT_ID
ist mein Auth0 Client-ID, die als Zielgruppe verwendet wird, gemäß der Auth0 Dokumentation.
Ich verwende das Angular-Seed-Projekt auf der Frontend-Seite, und ich habe überprüft, dass das Token in der Tat mit der Anfrage gesendet wird, und ich habe überprüft, dass es genau das gleiche Token ist, das in der token
Variable gespeichert wird Backend.
Wenn jwt.decode()
genannt wird, wird es die jwt.DecodeError
jedes Mal auslösen, und ich habe unzählige Stunden verbracht versuchen, dieses Problem zu beheben, aber ich bin absolut fassungslos, warum dies ist nicht Arbeiten. Ich habe versucht, die JWT-Optionen auf falsch zu setzen, insbesondere die Signatur zu verifizieren. Das hat funktioniert, aber ich nehme an, dass es unsicher ist, die Überprüfung der JWT-Signatur zu deaktivieren.
Ich kann nicht herausfinden, warum dies fehlschlägt, habe ich diesen gleichen Code ausprobiert, ohne dass es in einem Dekorateur ist und es dasselbe tut. Die Ansicht, die dekoriert ist, ist nur eine leere Ansicht, die eine OK HttpResponse zurückgibt.
Tldr; Die Verwendung von Django-REST + Auth0 JWT - jwt.decode()
funktioniert nicht, egal was ich mache.
EDIT2: Es ist erwähnenswert, ich corsheaders
für django-Rest bin, die mich Cross-Domain-Anfragen machen können. Ich habe auch den Tipp am Ende des Python-API-Leitfadens von Auth0 gefolgt, um die JWT-Bibliothek zu deinstallieren und neu zu installieren, aber das hat nichts für mich getan.
Bin ich etwas übersehen, ist diese Implementierung einfach unsicher oder hast du einen besseren Weg Auth0 mit Django zu implementieren? Bitte lassen Sie mich wissen, dieses Problem verursacht mir Albträume.
Ich versuche auch, Auth0 mit Django Rest Framework zu verwenden. Haben Sie Quellcode, den ich sehen kann? Wenn du kannst, wird es sehr viel helfen! – nextdoordoc
@nextdoordoc Es tut mir schrecklich leid, aber meine Implementierung war so kaputt, dass ich auf halbem Wege aufgab. Es ist besser, wenn Sie versuchen, eine Implementierung zu finden, die für eine andere Sprache geschrieben und portiert wurde. –
oh tut mir leid zu hören, dass .. btw du endlich andere Sprache verwendet, um auth0 zu verwenden? oder hast du endlich ein anderes Authentifizierungs-Tool benutzt? – nextdoordoc