J'essaie d'écrire un serveur REST-API avec NodeJS comme celui utilisé par Joyent , et tout va bien sauf que je ne peux pas vérifier l'authentification d'un utilisateur normal. Si je saute sur un terminal et que je curl -u username:password localhost:8000 -X GET
, Je ne peux pas obtenir les valeurs nom d'utilisateur: mot de passe sur le serveur NodeJS http. Si mon serveur http NodeJS est quelque chose comme
var http = require('http');
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello World\n');
}).listen(1337, "127.0.0.1");
, ne devrais-je pas obtenir les valeurs username: password quelque part dans l'objet req provenant du rappel? Comment puis-je obtenir ces valeurs sans avoir à utiliser Auth http de base de Connect ?
Le nom d'utilisateur: mot de passe est contenu dans l'en-tête d'autorisation sous la forme d'une chaîne codée en base64 .
Essaye ça:
http.createServer(function(req,res){
var header=req.headers['authorization']||'', // get the header
token=header.split(/\s+/).pop()||'', // and the encoded auth token
auth=new Buffer.from(token, 'base64').toString(), // convert from base64
parts=auth.split(/:/), // split on colon
username=parts[0],
password=parts[1];
res.writeHead(200,{'Content-Type':'text/plain'});
res.end('username is "'+username+'" and password is "'+password+'"');
}).listen(1337,'127.0.0.1');
Des détails sur l'autorisation http peuvent être trouvés sur http://www.ietf.org/rfc/rfc2617.txt
Si vous utilisez express, vous pouvez utiliser le plugin de connexion (inclus avec express):
//Load express
var express = require('express');
//User validation
var auth = express.basicAuth(function(user, pass) {
return (user == "super" && pass == "secret");
},'Super duper secret area');
//Password protected area
app.get('/admin', auth, routes.admin);
Vous pouvez utiliser node-http-digest pour l'authentification de base ou everyauth , si l'ajout d'une autorisation de services externes est dans votre feuille de route.
J'utilise ce code pour mes propres sites de démarrage avec authentification.
Cela fait plusieurs choses:
Avant d'utiliser le code, npm install express
var express = require("express");
var app = express();
//User validation
var auth = express.basicAuth(function(user, pass) {
return (user == "username" && pass == "password") ? true : false;
},'dev area');
/* serves main page */
app.get("/", auth, function(req, res) {
try{
res.sendfile('index.html')
}catch(e){}
});
/* add your other paths here */
/* serves all the static files */
app.get(/^(.+)$/, auth, function(req, res){
try{
console.log('static file request : ' + req.params);
res.sendfile( __dirname + req.params[0]);
}catch(e){}
});
var port = process.env.PORT || 8080;
app.listen(port, function() {
console.log("Listening on " + port);
});
Le framework restify (http://mcavage.github.com/node-restify/) comprend un analyseur d'en-tête d'autorisation pour les schémas d'authentification "de base" et "signature".
Il peut être implémenté facilement dans pure node.js sans dépendance, c'est ma version qui est basée sur cette réponse pour express.js mais simplifiée pour que vous puissiez voir facilement l'idée de base:
var http = require('http');
http.createServer(function (req, res) {
var userpass = new Buffer((req.headers.authorization || '').split(' ')[1] || '', 'base64').toString();
if (userpass !== 'username:password') {
res.writeHead(401, { 'WWW-Authenticate': 'Basic realm="nope"' });
res.end('HTTP Error 401 Unauthorized: Access is denied');
return;
}
res.end('You are in! Yay!');
}).listen(1337, '127.0.0.1');
Vous pouvez utiliser le module http-auth
// Authentication module.
var auth = require('http-auth');
var basic = auth.basic({
realm: "Simon Area.",
file: __dirname + "/../data/users.htpasswd" // gevorg:gpass, Sarah:testpass ...
});
// Creating new HTTP server.
http.createServer(basic, function(req, res) {
res.end("Welcome to private area - " + req.user + "!");
}).listen(1337);