2015-12-22 11 views
6

Sto cercando di implementare l'autenticazione basata su JWT Auth0 nell'API di Django REST utilizzando il framework django-rest. So che esiste una libreria JWT disponibile per il framework REST, e ho provato ad usarla perché l'account ufficiale Auth0 di Twitter ha detto che dovrebbe funzionare bene con auth0 + Django.Autenticazione Django + Auth0 JWT che rifiuta di decodificare

MODIFICA: Sto usando the official auth0 python api guide per questo codice. È scritto per fiasco, ma ho pensato che potevo portarlo su Django visto che funzionano allo stesso modo.

Ora, questo non ha funzionato come volevo, quindi sto cercando di scrivere il mio decoratore login_required per una vista. Il codice che ho qui è la seguente:

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 

Ora, il authenticate() è fondamentalmente la mia implementazione personalizzata per Jsonify() che viene utilizzato nella documentazione Auth0 per Python API. Ho verificato che funziona, quindi non è un problema.

SECRET è il mio segreto Auth0, codificato in base64 (tutti gli altri tasti non sono riusciti a decodificare)
CLIENT_ID è il mio ID cliente Auth0 che viene usato come il pubblico, in base alla documentazione Auth0.

Sto utilizzando il progetto seme angolare sul front-end e ho verificato che il token viene effettivamente inviato con la richiesta e ho verificato che è lo stesso token che viene memorizzato nella variabile token sul backend.

Quando jwt.decode() si chiama, innescherà il jwt.DecodeError ogni volta, e ho passato ore e ore cercando di risolvere questo problema, ma sono assolutamente stordito sul motivo per cui questo è non di lavoro. Ho provato a impostare le opzioni JWT su false, in particolare su quella della firma di verifica. Ciò ha funzionato, ma presumo che sia non sicuro disabilitare la verifica della firma JWT.

Non riesco a capire perché questo mi sta fallendo, ho provato questo stesso codice senza che sia in un decoratore e fa la stessa cosa. La vista decorata è solo una vista vuota che restituisce una risposta Http OK.

Tldr; Utilizzando Django-REST + Auth0 JWT - jwt.decode() non funzionerà, non importa quello che faccio.

EDIT2: vale la pena ricordare Sono corsheaders per Django-riposo che mi permette di fare richieste cross-domain. Ho anche seguito il suggerimento nella parte inferiore della guida API Python da Auth0 per disinstallare e reinstallare la libreria JWT, ma questo non ha fatto nulla per me.

Sto trascurando qualcosa, questa implementazione non è sicura o avete un modo migliore di implementare Auth0 con Django? Per favore fatemi sapere, questo problema mi sta causando incubi.

+0

Sto anche cercando di usare Auth0 con il framework django rest. Hai qualche codice sorgente che posso vedere? Se puoi, sarà davvero di grande aiuto! – nextdoordoc

+0

@nextdoordoc Sono terribilmente dispiaciuto ma la mia implementazione è stata così fallita che ho rinunciato a metà strada. Stai meglio cercando di trovare un'implementazione scritta per un'altra lingua e portandola. –

+0

oh mi spiace sentirlo .. btw hai finalmente usato un altro linguaggio per usare auth0? o hai finalmente usato un altro strumento di autenticazione? – nextdoordoc

risposta

5

un classico caso di "gli insetti più difficili da risolvere sono di solito quelli più stupidi" ...

ho copiato la chiave segreta dal cruscotto Auth0 con un doppio, non rendendosi conto c'erano parti che didn essere copiati Questo l'ha risolto.

Se lo si desidera, è possibile utilizzare il mio decoratore personalizzato nel proprio progetto per verificare le JWT.

di importarlo e poi utilizzarlo in questo modo:

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

Scusaci! Questo è un feedback utile, miglioreremo questa UX nella dashboard Auth0. –

Problemi correlati