2016-01-19 15 views
5

Ich führe gerade eine Node.js-Anwendung, mit einer API und Dateien dienen (ich weiß nginx könnte damit umgehen, aber ich sollte es nicht zuerst verwenden).Basic Auth und JWT

Ich verwende es einfach, um eine einfache grundlegende Auth zu haben, die nicht so einfach ist.

Hier ist meine 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; 
    } 
    } 

Die /etc/nginx/.htpasswd Datei ist nur user:encryptedpassword und gut ist.

Mit dieser Konfiguration, wenn ich zu meinem IP gehen es:

  • fragt mich, den Benutzer und das Passwort
  • startet die Seite zu laden
  • (manchmal) fragt wieder für Benutzer und Passwort
  • beendet, um die Seite

So weit so gut, auch wenn es zweimal das Passwort gefragt.

Die Node.js App hat eine JWT-Authentifizierung, wenn ich mich anmelde, lädt die Website neu und von hier aus fragt es unbegrenzt nach dem Benutzer und Passwort (Basic Auth), solange ich auf Login klicke. Das JWT befindet sich in meinem lokalen Speicher. Wenn ich in der Basisauthentifizierung auf "Abbrechen" klicke, wird der JWT gelöscht und ich werde abgemeldet. Er fragt erneut nach der Basisauthentifizierung.

Dies ist in Chrome. Bei Firefox und Safari wird nach der JWT-Protokollierung das Token automatisch aus dem lokalen Speicher gelöscht (und ich bin ausgeloggt).

Es ist ziemlich schwierig zu erklären, und ich kann Ihnen die Website nicht zeigen. Kurz gesagt, das Hauptproblem ist, dass die JWT (der node.js App) gelöscht wird.

+0

Ich bin mir nicht sicher, es ist möglich, Grund Auth zu mischen und JWT. Ich kann mich irren, aber so weit ich weiß, verwenden beide Methoden den 'Authorization'-Request-Header, also ist es nicht verwunderlich, dass sie konfus sind. – Curious

+0

Ja, nach einigen Untersuchungen bestätige ich, dass es das Problem sein könnte – Cohars

+0

Denke nicht, dass ich irgendeine Lösung dafür finden kann. – Cohars

Antwort

4

Wenn erkennen ich, dass das Problem der Konflikt zwischen Grunde Auth und JWT ist (wie @Curious im commend vorgeschlagen), und dass sie beide mit dem Authorization Header, war die Lösung ganz einfach.

ich konfigurieren meine Front-End-Anwendung die JWToken über einen benutzerdefinierten Header zu senden, **JWTAuthorization**, so, wenn die Anfrage den Server trifft, enthält es beide Header Authorization & JWTAuthorization. Dann ist es ziemlich einfach, nachdem die Basis Authentifizierung übergeben, ich nur ersetzen die Header (hier auf der Node.js Anwendung, basierend auf Koa):

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