仅使用 Express 框架对某些 URL 使用 HTTP 基本身份验证
Using HTTP basic auth for certain URLs only with Express framework
我有一个使用Express框架和http-auth模块设计的node.js应用程序,如下:
var auth = require('http-auth');
var express = require('express');
// ...
var mywebapp = express();
// ...
if (usebasicauth) {
var basic = auth.basic({realm:"MyRealm", file:"/srv/config/passwd"});
mywebapp.use(auth.connect(basic));
}
mywebapp.use('/js', express.static(__dirname + '/files/js'));
mywebapp.use('/css', express.static(__dirname + '/files/css'));
// ...
但是,我不想保护 /js
和 /css
目录下可用的资产。这是我尝试做的:
if (usebasicauth) {
var basic = auth.basic({realm:"MyRealm", file:"/srv/config/passwd"});
mywebapp.use(function(req, res, next) {
if (/^\/(css|js)/.test(req.url)) {
next();
}
else {
auth.connect(basic);
}
});
}
尝试访问 /css
和 /js
下的 URL 按预期工作;但是,其他网址永远不会加载。
如何使其他网址按预期工作?
mywebapp.use
的顺序很重要。
如果您有第一个 mywebapp.use(auth.connect(basic));
那么它将用于每个请求
但如果您更改顺序,它将通过静态并且仅用于它之后的任何内容。
中间件函数按添加顺序处理。
所以下面应该做你想做的。
// no auth for statics
mywebapp.use('/js', express.static(__dirname + '/files/js'));
mywebapp.use('/css', express.static(__dirname + '/files/css'));
// auth reguired from here
mywebapp.use(auth.connect(basic));
如果您将 mywebapp.use(auth.connect(basic));
放在 express.static 之上,它也会要求对其进行身份验证。
// auth reguired from here
mywebapp.use(auth.connect(basic));
// auth required for statics as well
mywebapp.use('/js', express.static(__dirname + '/files/js'));
mywebapp.use('/css', express.static(__dirname + '/files/css'));
你也可以这样做https://gist.github.com/gevorg/7168d5f02c1ca5362b2a#file-specific-path-js
// Express module.
var express = require('express');
// Authentication module.
var auth = require('http-auth');
var basic = auth.basic({
realm: "Simon Area.",
file: __dirname + "/../data/users.htpasswd" // gevorg:gpass, Sarah:testpass ...
});
// Application setup.
var app = express();
app.use(function(req, res, next) {
if ('/specific/path' === req.path) {
next();
} else {
(auth.connect(basic))(req, res, next);
}
});
// Setup route.
app.get('/', function(req, res){
res.send("Hello from express - " + req.user + "!");
});
// Setup guest route.
app.get('/specific/path', function(req, res){
res.send("Hello from express - guest!");
});
// Start server.
app.listen(1337);
这个问题的公认答案是不可取的,因为路线顺序可能很重要!
更好的方法是将 basic-auth 作为路由定义的第二个参数传递:
app.get('/admin', auth.connect(basic), (req, res) => {
res.send(`Hello from admin area - ${req.user}!`);
});
或
app.use('/admin', auth.connect(basic), myCustomRoute);
我有一个使用Express框架和http-auth模块设计的node.js应用程序,如下:
var auth = require('http-auth');
var express = require('express');
// ...
var mywebapp = express();
// ...
if (usebasicauth) {
var basic = auth.basic({realm:"MyRealm", file:"/srv/config/passwd"});
mywebapp.use(auth.connect(basic));
}
mywebapp.use('/js', express.static(__dirname + '/files/js'));
mywebapp.use('/css', express.static(__dirname + '/files/css'));
// ...
但是,我不想保护 /js
和 /css
目录下可用的资产。这是我尝试做的:
if (usebasicauth) {
var basic = auth.basic({realm:"MyRealm", file:"/srv/config/passwd"});
mywebapp.use(function(req, res, next) {
if (/^\/(css|js)/.test(req.url)) {
next();
}
else {
auth.connect(basic);
}
});
}
尝试访问 /css
和 /js
下的 URL 按预期工作;但是,其他网址永远不会加载。
如何使其他网址按预期工作?
mywebapp.use
的顺序很重要。
如果您有第一个 mywebapp.use(auth.connect(basic));
那么它将用于每个请求
但如果您更改顺序,它将通过静态并且仅用于它之后的任何内容。
中间件函数按添加顺序处理。
所以下面应该做你想做的。
// no auth for statics
mywebapp.use('/js', express.static(__dirname + '/files/js'));
mywebapp.use('/css', express.static(__dirname + '/files/css'));
// auth reguired from here
mywebapp.use(auth.connect(basic));
如果您将 mywebapp.use(auth.connect(basic));
放在 express.static 之上,它也会要求对其进行身份验证。
// auth reguired from here
mywebapp.use(auth.connect(basic));
// auth required for statics as well
mywebapp.use('/js', express.static(__dirname + '/files/js'));
mywebapp.use('/css', express.static(__dirname + '/files/css'));
你也可以这样做https://gist.github.com/gevorg/7168d5f02c1ca5362b2a#file-specific-path-js
// Express module.
var express = require('express');
// Authentication module.
var auth = require('http-auth');
var basic = auth.basic({
realm: "Simon Area.",
file: __dirname + "/../data/users.htpasswd" // gevorg:gpass, Sarah:testpass ...
});
// Application setup.
var app = express();
app.use(function(req, res, next) {
if ('/specific/path' === req.path) {
next();
} else {
(auth.connect(basic))(req, res, next);
}
});
// Setup route.
app.get('/', function(req, res){
res.send("Hello from express - " + req.user + "!");
});
// Setup guest route.
app.get('/specific/path', function(req, res){
res.send("Hello from express - guest!");
});
// Start server.
app.listen(1337);
这个问题的公认答案是不可取的,因为路线顺序可能很重要!
更好的方法是将 basic-auth 作为路由定义的第二个参数传递:
app.get('/admin', auth.connect(basic), (req, res) => {
res.send(`Hello from admin area - ${req.user}!`);
});
或
app.use('/admin', auth.connect(basic), myCustomRoute);