Базовая проверка подлинности HTTP в Node.JS?
Я пытаюсь написать REST-API-сервер с NodeJS, как тот, который используется Joyent, и все в порядке, t проверить обычную аутентификацию пользователя. Если я перейду на терминал и сделаю 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-адрес?
Ответы
Ответ 1
Имя пользователя: пароль содержится в заголовке авторизации в виде строки с кодировкой 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(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
Ответ 2
Если вы используете экспресс, вы можете использовать подключаемый плагин (включен в экспресс):
//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);
Ответ 3
Вы можете использовать node-http-digest для базового auth или everyauth, если добавление авторизации из внешних служб находится в вашей дорожной карте.
Ответ 4
Я использую этот код для своих собственных стартовых сайтов с auth.
Он выполняет несколько действий:
- basic auth
- return 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);
});
Ответ 5
В растровой структуре (http://mcavage.github.com/ node-restify/) используется анализатор заголовков авторизации для "основных" и "сигнатурных" схем аутентификации.
Ответ 6
Вы можете использовать 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);
Ответ 7
Он может быть легко реализован в чистом 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');