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 ?

41
demandé sur Jonas 2011-05-10 18:23:26

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

84
répondu Rob Raisch 2018-05-11 14:53:32

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);
37
répondu Jeroen 2014-05-30 20:14:49

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.

8
répondu Phillip Kovalev 2011-05-10 15:26:46

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);
});
6
répondu Grant Li 2014-01-05 23:53:30

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

3
répondu Dave Pacheco 2012-06-24 18:09:24

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);
1
répondu gevorg 2016-04-22 10:19:00

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');
1
répondu Ebrahim Byagowi 2017-09-08 18:36:12