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