2016-01-19 16 views
5

Attualmente sto eseguendo un'applicazione Node.js, con un'API e file che servono (so che nginx potrebbe gestirlo, ma non dovevo usarlo all'inizio).Basic Auth e JWT

Lo sto semplicemente usando per avere un'autenticazione di base semplice, il che sembra non essere così semplice.

Ecco il mio nginx config:

upstream nodejsapp { 
    server 127.0.0.1:1337; 
    keepalive 15; 
    } 

    server { 
    listen 80 default_server; 

    auth_basic "Restricted"; 
    auth_basic_user_file /etc/nginx/.htpasswd; 
    proxy_redirect off; 

    location/{ 
     proxy_pass http://nodejsapp; 

     proxy_set_header Connection "Keep-Alive"; 
     proxy_set_header Proxy-Connection "Keep-Alive"; 
     proxy_set_header X-Real-IP $remote_addr; 
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
     proxy_set_header Host $http_host; 
     proxy_set_header X-NginX-Proxy true; 
    } 
    } 

Il file /etc/nginx/.htpasswd è solo user:encryptedpassword ed è buono.

Con questa configurazione, quando vado al mio IP è:

  • mi chiede l'utente e la password
  • inizia a caricare la pagina
  • (a volte) chiede ancora una volta per l'utente e la password
  • termina per caricare la pagina

Fin qui tutto bene, anche se chiedeva il doppio della password.

L'app Node.js ha un'autenticazione JWT, quando accedo, il sito web si ricarica e da qui, richiede a tempo indeterminato l'utente e la password (autenticazione di base), a patto che clicchi sul login. Il JWT è nella mia memoria locale. Se faccio clic su annulla sul prompt di autenticazione di base, il JWT viene eliminato e sono disconnesso, e ... chiede di nuovo l'autenticazione di base.

Questo è su Chrome. Con Firefox e Safari, dopo la registrazione JWT, cancella automaticamente il token dalla memoria locale (e sono disconnesso).

È piuttosto difficile da spiegare e non posso mostrarti il ​​sito web. In breve, il problema principale è che il JWT (dell'app node.js) viene cancellato.

+0

io non sono sicuro che sia possibile mescolare autenticazione di base e JWT. Potrei sbagliarmi ma, per quanto ne so, entrambi i metodi usano l'header di richiesta 'Authorization', quindi non sorprende che stiano configgendo. – Curious

+0

Sì, dopo alcune ricerche, confermo che potrebbe essere il problema – Cohars

+0

Non credo di poter trovare alcuna soluzione per questo. – Cohars

risposta

4

Quando ho capito che il problema era la conflitto tra Basic Auth e JWT (come suggerito nella @Curious affido), e che sono entrambi utilizzando l'intestazione Authorization, la soluzione è stata abbastanza facile.

ho configurare la mia applicazione front-end per inviare il JWToken attraverso un header personalizzato, **JWTAuthorization**, in modo che quando la richiesta raggiunge il server, contiene sia le intestazioni Authorization & JWTAuthorization. Poi è abbastanza semplice, dopo l'autenticazione di base è passato, ho appena sostituire le intestazioni (qui sull'applicazione Node.js, sulla base di Koa):

app.use(function *(next) { 
    this.headers.authorization = this.headers.jwtauthorization; 
    yield next; 
});