2015-12-22 10 views
6

Próbuję zaimplementować uwierzytelnianie oparte na JWT Auth0 w moim interfejsie API REST Django przy użyciu struktury django-rest. Wiem, że istnieje biblioteka JWT dostępna dla struktury REST i próbowałem jej używać, ponieważ oficjalne konto twh Auth0 wspomniało, że powinno działać dobrze z auth0 + Django.Autoryzacja JWT Django + Auth0 odmowa dekodowania

EDYTOWANIE: Używam tego kodu pod numerem the official auth0 python api guide. Jest napisany na kolbę, ale pomyślałem, że mogę go przenieść do Django, ponieważ oni działają tak samo.

Teraz nie wyszło tak, jak chciałem, więc staram się napisać swój własny dekorator login_required dla widoku. Kod mam tutaj jest następujący:

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 

Teraz authenticate() jest w zasadzie mój zwyczaj wdrożenie dla Jsonify(), który jest stosowany w dokumentacji Auth0 dla Pythona API. Sprawdziłem, że to działa, więc to nie jest problem.

SECRET jest mój sekret Auth0, zakodowane w base64 (inne klawisze nie udało się rozszyfrować)
CLIENT_ID jest mój identyfikator klienta Auth0 który służy jako publiczności, zgodnie z dokumentacją Auth0.

Używam projektu z ziarnami kątowymi po stronie frontend i sprawdziłem, czy token jest rzeczywiście wysyłany wraz z żądaniem, i zweryfikowałem, że to ten sam token, który jest przechowywany w zmiennej token na backend.

Kiedy jwt.decode() nazywa, będzie wyzwalać jwt.DecodeError za każdym razem, a ja spędzam wiele godzin próbuje rozwiązać ten problem, ale jestem absolutnie zaskoczony, dlaczego to nie roboczego. Próbowałem ustawić opcje JWT na false, w szczególności weryfikować podpis jeden. To zadziałało, ale zakładam, że jest to niebezpieczny, aby wyłączyć weryfikację podpisu JWT.

Nie mogę zrozumieć, dlaczego to mnie nie udaje, próbowałem tego samego kodu bez bycia w dekoratorze i robi to samo. Widok, który jest dekorowany, jest po prostu pustym widokiem, który zwraca OK HttpResponse.

Tldr; Używanie Django-REST + Auth0 JWT - jwt.decode() nie zadziała, bez względu na to, co zrobię.

EDIT2: Warto wspomnieć, że jestem corsheaders dla django-rest, który pozwala mi wykonywać żądania w wielu domenach. Podążałem również za wskazówkami na dole przewodnika API Pythona od Auth0, aby odinstalować i ponownie zainstalować bibliotekę JWT, ale nic to dla mnie nie dało.

Czy coś przeoczyłem, czy ta implementacja jest niezabezpieczona, czy masz lepszy sposób na zaimplementowanie Auth0 z Django? Daj mi znać, ten problem powoduje nocne koszmary.

+0

Próbuję również użyć Auth0 z frameworkiem django rest. Czy masz jakiś kod źródłowy, który widzę? Jeśli możesz, to naprawdę bardzo pomoże! – nextdoordoc

+0

@nextdoordoc Bardzo mi przykro, ale moja implementacja była tak zepsuta, że ​​zrezygnowałem w połowie. Lepiej próbuj znaleźć implementację napisaną dla innego języka i przesyłając ją. –

+0

oh przepraszam by usłyszeć, że .. czy w końcu użyłeś innego języka do używania auth0? lub w końcu użyłeś innego narzędzia uwierzytelniania? – nextdoordoc

Odpowiedz

5

Klasyczny przypadek „Najtrudniejszą naprawić błędy są zwykle najbardziej głupich” ...

skopiowane tajny klucz z tablicy rozdzielczej Auth0 przez dwukrotne go, nie zdając sobie sprawy nie były części, które nie zrobił nie zostaną skopiowane. To naprawiło to.

Jeśli chcesz, możesz użyć mojego niestandardowego dekoratora we własnym projekcie, aby zweryfikować JWT.

importować je, a następnie używać go tak:

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

Przepraszam za to! To jest przydatna informacja zwrotna, poprawimy ten UX w panelu kontrolnym Auth0. –

Powiązane problemy