web-dev-qa-db-fra.com

Authentification HTTP de base dans Node.JS?

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 ?

45

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

91
Rob Raisch

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);
37
Jeroen

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.

8
Phillip Kovalev

J'utilise ce code pour mes propres sites de démarrage avec authentification.

Cela fait plusieurs choses:

  • authentification de base
  • retourne index.html pour/route
  • servir le contenu sans planter et gérer l'erreur silencieusement
  • autoriser le paramètre de port lors de l'exécution
  • 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);
});
6
Grant Li

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".

3
Dave Pacheco

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');
1
Ebrahim Byagowi

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);
1
gevorg