使用Node和Express进行基本的HTTP身份validation4
它看起来像使用Express v3实现基本的HTTP身份validation是微不足道的:
app.use(express.basicAuth('username', 'password'));  版本4(我使用4.2)删除了basicAuth中间件,所以我有点卡住了。 我有下面的代码,但它不会导致浏览器提示用户input凭据,这是我想要的(以及我想象的旧方法): 
 app.use(function(req, res, next) { var user = auth(req); if (user === undefined || user['name'] !== 'username' || user['pass'] !== 'password') { res.writeHead(401, 'Access invalid for user', {'Content-Type' : 'text/plain'}); res.end('Invalid credentials'); } else { next(); } }); 
	
很多中间件在v4中被从Express核心中拉出来,并被放到单独的模块中。 基本的validation模块在这里: https : //github.com/expressjs/basic-auth-connect
你的例子只需要改变这个:
 var basicAuth = require('basic-auth-connect'); app.use(basicAuth('username', 'password')); 
 我用原始的basicAuth的代码来find答案: 
 app.use(function(req, res, next) { var user = auth(req); if (user === undefined || user['name'] !== 'username' || user['pass'] !== 'password') { res.statusCode = 401; res.setHeader('WWW-Authenticate', 'Basic realm="MyRealmName"'); res.end('Unauthorized'); } else { next(); } }); 
基本authentication与香草JavaScript (ES6)
 app.get('/highlysecuredarea/login', (req, res) => { // ----------------------------------------------------------------------- // authentication const auth = {login: 'yourlogin', password: 'yourpassword'} // change this const b64auth = (req.headers.authorization || '').split(' ')[1] || '' const [login, password] = new Buffer(b64auth, 'base64').toString().split(':') // Verify login and password are set and correct if (!login || !password || login !== auth.login || password !== auth.password) { res.set('WWW-Authenticate', 'Basic realm="nope"') // change this res.status(401).send('You shall not pass.') // custom message return } // ----------------------------------------------------------------------- // Access granted... // code here } 
为什么?
-   req.headers.authorization包含值“Basic <base64 string>”,但它也可以是空的,我们不希望它失败,因此奇怪的组合|| ''|| ''
-  节点不知道atob()和btoa(),因此Buffer
ES6 – > ES5
  const只是var ..sorting 
  (x, y) => {...}只是function(x, y) {...} 
  const [login, password] = ...split()只是两个var赋值之一 
灵感来源(使用软件包)
我使用http-auth在express 4.0中更改了基本authentication,代码是:
 var auth = require('http-auth'); var basic = auth.basic({ realm: "Web." }, function (username, password, callback) { // Custom authentication method. callback(username === "userName" && password === "password"); } ); app.get('/the_url', auth.connect(basic), routes.theRoute); 
似乎有多个模块来做到这一点,有些是不推荐使用的。
 这个看起来很活跃: 
  https://github.com/jshttp/basic-auth 
这是一个使用示例:
 // auth.js var auth = require('basic-auth'); var admins = { 'art@vandelay-ind.org': { password: 'pa$$w0rd!' }, }; module.exports = function(req, res, next) { var user = auth(req); if (!user || !admins[user.name] || admins[user.name].password !== user.pass) { res.set('WWW-Authenticate', 'Basic realm="example"'); return res.status(401).send(); } return next(); }; // app.js var auth = require('./auth'); var express = require('express'); var app = express(); // ... some not authenticated middlewares app.use(auth); // ... some authenticated middlewares 
 确保你把auth中间件放在正确的地方,任何中间件在那之前都不会被authentication。 
Express已经删除了这个function,现在build议你使用basic-auth库。
这里是一个如何使用的例子:
 var http = require('http') var auth = require('basic-auth') // Create server var server = http.createServer(function (req, res) { var credentials = auth(req) if (!credentials || credentials.name !== 'aladdin' || credentials.pass !== 'opensesame') { res.statusCode = 401 res.setHeader('WWW-Authenticate', 'Basic realm="example"') res.end('Access denied') } else { res.end('Access granted') } }) // Listen server.listen(3000) 
要发送一个请求到这个路由,你需要包含一个为基本身份validation格式化的授权头 。
 首先发送一个curl请求,你必须采用base64编码的name:pass或者在这种情况下, aladdin:opensesame ,它等于YWxhZGRpbjpvcGVuc2VzYW1l 
您的curl请求将如下所示:
  curl -H "Authorization: Basic YWxhZGRpbjpvcGVuc2VzYW1l" http://localhost:3000/