2015-12-22 8 views
6

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.

+0

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

+0

@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. –

+0

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

Antwort

5

Ein klassischer Fall von „härtesten Fehler zu beheben sind in der Regel die meisten Dummen“ ...

ich den geheimen Schlüssel aus dem Auth0 Armaturenbrett kopiert durch Doppelklick aus, ohne zu wissen, da Teile waren, die didn Ich werde nicht kopiert. Das hat es behoben.

Wenn Sie möchten, können Sie meinen benutzerdefinierten Dekorator in Ihrem eigenen Projekt verwenden, um die JWTs zu überprüfen.

Sie importieren und dann verwenden, etwa so:

@auth_required 
def myView(request): 
    .... 
+0

Sorry! Dies ist ein nützliches Feedback, wir werden dieses UX im Auth0-Dashboard verbessern. –