2014-04-10 13 views
5

Ich entwickle derzeit einen RESTful Web-Service mit NodeJS und restify.Basis-Authentifizierung mit Node.js und restify

Ich habe alles mit node-mysql für die Datenbank ausgeführt, aber ich möchte auch HTTP Basic-Authentifizierung implementieren.

Ich habe das nur einmal mit Apache und einer .htaccess Datei.

Aber hier der Webserver kommt mit restify und ich beginne es wie folgt aus:

var server = restify.createServer({ 
    name: 'my webservice' 
}); 

Es gibt eine Authentifizierung Parser Plugin in der restify Dokumentation aufgeführt (http://mcavage.me/node-restify/#Bundled-Plugins), aber ich kann nicht herausfinden, wie es zu benutzen .

Der Wert req.username wird immer auf anonym gesetzt, auch wenn ich http://user:[email protected] verwende.

Die beste Sache wäre, wenn ich es mit einer .htpasswd Datei verwenden könnte, um den Benutzer zu speichern und auf ihn zuzugreifen.

Kann jemand dies mit restify oder einem anderen Modul implementieren?

Antwort

1

Werfen Sie einen Blick auf Passport.js. Es unterstützt Basic HTTP als eines der Authentifizierungsschemas.

+0

sieht vielversprechend aus ... Ich werde es versuchen – Nico

0

Der req.username Wert ist immer anonym gesetzt, auch wenn ich http: // user: pass @ url ....

Die Dokumentation scheint darauf hinzudeuten, dass es die erwartet Anmeldeinformationen in der Kopfzeile nicht in der URL, müssen Sie möglicherweise Curl oder ein anderes Tool neben einem Browser verwenden, um Header mit Autorisierungsheadern zu erstellen.

+0

Ok ... Ich dachte, dass sie im Header gesendet werden, auch wenn ich sie in die URL setzen. – Nico

+0

@nico - Ich denke, ein Browser könnte diese Funktion haben, aber Sie können nicht sicher sein. Ich habe das URL-Format, das Sie verwenden, noch nie gesehen. – Hogan

-3

mit drückst du so etwas tun kann:

var auth = express.basicAuth(function(user, pass) { 
    return (user == "admin" && pass == "1234"); 
},'Super duper secret area'); 

app.get('/test', auth, function(req, res){ 
    ... 
}); 

expressjs.com

+0

Ich möchte nicht Express verwenden.Es hat zu viel enthalten, dass ich nicht brauche ... deshalb wählte ich restify.js – Nico

5

Schließlich fand ich einen Weg, um es ohne zusätzliche Module zu tun.

Zunächst schicke ich die correkt Header:

var auth = req.headers['authorization']; 
res.statusCode = 401; 
res.setHeader('WWW-Authenticate', 'Basic realm="Secure Area"'); 
res.end('need creds'); 

Dann prüfe ich den Benutzer und übergeben und wenn ihr ok dann den richtigen Statuscode senden

res.statusCode = 200; // OK 

Wenn das Passwort nicht korrekt ist:

res.statusCode = 401; // Force them to retry authentication 
    res.setHeader('WWW-Authenticate', 'Basic realm="Secure Area"'); 
    res.end('<html><body>You shall not pass</body></html>'); 

Das funktioniert ziemlich gut. Ich habe nur einige Schwierigkeiten, das .htpasswd und das verschlüsselte Passwort zu lesen. Weiß jemand wie ich ein einfaches Passwort gegen eine .htpasswd Datei überprüfen kann?

+0

Glaubst du, dass es auch in meinem Fall funktionieren könnte: http://stackoverflow.com/questions/40287897/how-is-filled -request-Header-Autorisierung? Oder sollte ich meinen alten Code ändern und nur "restify" -Erweiterungen verwenden? – Filippo1980