Authentification HTTP de base dans le noeud.JS?
j'essaie d'écrire un serveur REST-API avec NodeJS comme celui utilisé par Joyent, et tout est ok sauf que je ne peux pas vérifier l'authentification d'un utilisateur normal. Si je saute d'un terminal et faire curl -u username:password localhost:8000 -X GET
, Je ne peux pas obtenir les valeurs username: password sur le serveur http NodeJS. 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 Worldn');
}).listen(1337, "127.0.0.1");
, ne devrais-je pas obtenir les valeurs de nom d'utilisateur:mot de passe quelque part dans le req l'objet qui vient du rappel ? Comment puis-je obtenir ces valeurs sans avoir à utiliser l'authentification http de base de Connect<!--4 ?
7 réponses
le nom d'utilisateur:password est contenu dans l'en-tête D'autorisation comme une chaîne base64.
essaye ceci:
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');
Les détails sur l'autorisation http se trouvent à http://www.ietf.org/rfc/rfc2617.txt
si vous utilisez express, vous pouvez utiliser le plugin connect (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 basique ou everyauth, si l'ajout d'une autorisation de services externes est dans votre carnet de route.
j'utilise ce code pour mes propres sites de démarrage avec auth.
Il n'plusieurs choses:
- autorisation de base
- retour index.code html pour / route
- servir du contenu sans s'écraser et silencieux gérer l'erreur
- autoriser le port paramètre lors de l'exécution
- la quantité minimale de journalisation
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 cadre restify (http://mcavage.github.com/node-restify/) inclut un analyseur d'en-tête d'autorisation pour les schémas d'authentification "de base" et "de signature".
Vous pouvez utiliser http-auth module
// 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);
il peut être implémenté facilement dans le noeud pur.js sans dépendance, c'est ma version qui est basée sur cette réponse express.js mais simplifié pour que vous puissiez voir l'idée de base facilement:
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');