tutorial req nodejs node management headers auth http authentication node.js http-basic-authentication

http - req - passport js tutorial



Autenticación HTTP básica en Node.JS? (7)

El marco restify (http://mcavage.github.com/node-restify/) incluye un analizador de encabezado de autorización para esquemas de autenticación "básica" y "firma".

Intento escribir un servidor REST-API con NodeJS como el utilizado por Joyent , y todo está bien, excepto que no puedo verificar la autenticación de un usuario normal. Si salta a una terminal y hago curl -u username:password localhost:8000 -X GET , no puedo obtener los valores nombre de usuario: contraseña en el servidor http NodeJS. Si mi servidor http NodeJS es algo así como

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");

, ¿no debería obtener los valores nombre de usuario: contraseña en algún lugar del objeto de solicitud que proviene de la devolución de llamada? ¿Cómo puedo obtener esos valores sin tener que usar la autenticación http básica de Connect ?


El nombre de usuario: la contraseña se encuentra en el encabezado Autorización como una cadena codificada en base64 .

Prueba esto:

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'');

Puede encontrar detalles sobre la autorización http en http://www.ietf.org/rfc/rfc2617.txt


Puede usar node-http-digest para auth o everyauth básicos, si agrega autorización de servicios externos en su hoja de ruta.


Puedes usar el módulo 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);


Se puede implementar fácilmente en node.js puros sin dependencia, esta es mi versión que se basa en esta respuesta para express.js pero simplificada para que pueda ver la idea básica fácilmente:

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'');


Si usa Express, puede usar el complemento de conexión (incluido con 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);


Uso este código para mis propios sitios de inicio con auth.

Hace varias cosas:

  • auth básica
  • return index.html para / ruta
  • servir contenido sin bloquearse y manejar el error en silencio
  • Permitir parámetro de puerto cuando se ejecuta
  • cantidad mínima de registro

Antes de usar el código, 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); });