Node.JS中的基本HTTP身份validation?

我试图用NodeJS编写一个REST-API服务器,就像Joyent使用的服务器一样,除了我无法validation一个普通用户的身份validation外,一切正常。 如果我跳转到terminal,并执行curl -u username:password localhost:8000 -X GET ,我无法获取NodeJS http服务器上的值username:password。 如果我的NodeJS http服务器是类似的

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

,不应该得到值来自callback的req对象中的值username:password。 如何获得这些值,而不必使用Connect的基本httpauthentication ?

用户名:密码作为base64编码的string包含在授权标头

尝试这个:

 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

如果您使用express,则可以使用connect插件(包含在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); 

如果从外部服务添加授权在您的路线图中,您可以使用node-http-digest进行基本authentication或者每个authentication。

我使用此代码为我自己的启动网站与身份validation。

它做了几件事情:

  • 基本身份validation
  • 为/ route返回index.html
  • 在没有崩溃的情况下提供内容并且无声地处理错误
  • 运行时允许使用端口参数
  • 最小量的logging

在使用代码之前,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); }); 

你可以使用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); 

它可以很容易地实现在纯粹的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');