Обычная HTTP-аутентификация в Node.JS? - PullRequest
44 голосов
/ 10 мая 2011

Я пытаюсь написать сервер REST-API с NodeJS, как тот, который используется Joyent , и все в порядке, за исключением того, что я не могу проверить аутентификацию обычного пользователя.Если я прыгаю в терминал и выполняю curl -u username:password localhost:8000 -X GET, я не могу получить значения username: password на http-сервере NodeJS.Если мой http-сервер NodeJS похож на

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

, не должен ли я получить значения username: password где-нибудь в объекте req , полученном из обратного вызова?Как я могу получить эти значения, не используя базовый http Connect auth ?

Ответы [ 7 ]

90 голосов
/ 11 мая 2011

Имя пользователя: пароль содержится в заголовке авторизации в виде строки в кодировке base64 .

Попробуйте это:

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

Подробную информацию о http авторизации можно найти на http://www.ietf.org/rfc/rfc2617.txt

37 голосов
/ 27 августа 2012

Если вы используете экспресс, вы можете использовать подключаемый модуль (входит в состав экспресс):

//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);
8 голосов
/ 10 мая 2011

Вы можете использовать node-http-digest для базовой аутентификации или Everyauth , если добавление авторизации от внешних сервисов входит в вашу план действий.

6 голосов
/ 18 ноября 2013

Я использую этот код для своих собственных стартовых сайтов с аутентификацией.

Он выполняет несколько функций:

  • базовый аутентификация
  • возвращает index.html для / route
  • обслуживать контент без сбоев и беззвучно обрабатывать ошибку
  • разрешить параметр порта при запуске
  • минимальное количество ведения журнала

Перед использованием кода,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);
});
3 голосов
/ 24 июня 2012

Среда restify (http://mcavage.github.com/node-restify/) включает анализатор заголовка авторизации для "базовой" и "сигнатурной" схем аутентификации.

1 голос
/ 08 августа 2017

Это может быть легко реализовано в чистом node.js без каких-либо зависимостей, это моя версия, основанная на этот ответ для express.js , но упрощенный, чтобы вы могли легко увидеть основную идею:

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 голос
/ 22 апреля 2016

Вы можете использовать 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...