使用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/