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