如何在 Express 中使用 basic-auth 中间件定向到默认登录页面
How to direct to default landing page with basic-auth middleware in Express
我正在尝试为 Express 上的整个站点添加基本授权。如果用户输入正确的凭据,那么我希望显示标准登录页面。如果不是,则应将用户带到 "access denied" 页面。我正在尝试弄清楚如何更改 basic-auth middleware 示例以实现此目的:
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 !== 'john' || credentials.pass !== 'secret') {
res.statusCode = 401
res.setHeader('WWW-Authenticate', 'Basic realm="example"')
res.end('Access denied')
} else {
res.end('Access granted')
}
})
如果我使用 next();
而不是 res.end()
,我会收到 undefined
错误。
var server = http.createServer(function (req, res, next) {
var credentials = auth(req)
if (!credentials || credentials.name !== 'john' || credentials.pass !== 'secret') {
res.statusCode = 401
res.setHeader('WWW-Authenticate', 'Basic realm="example"')
res.end('Access denied')
} else {
next();
}
})
我的路线是这样的:
app.use('/api/things', require('./api/thing'));
// . . .
// All other routes should redirect to the index.html
app.route('/*')
.get(function(req, res) {
res.sendFile(path.resolve(app.get('appPath') + '/index.html'));
});
next
是 connect
的构造,后者是 Express Web 服务器下的中间件库。但是您正在将自己的处理程序函数传递给 http 服务器。您应该让 http 服务器使用 express 应用程序来处理请求。那么express的中间件就很简单了。
var http = require('http');
var auth = require('basic-auth');
var app = require('express')();
var server = http.Server(app);
server.listen(3000);
app.get('/', ensureCredentials, function(req, res){
res.sendFile(path.resolve(app.get('appPath') + '/index.html'));
})
app.all('*', function(req, res){
res.redirect('/');
})
function ensureCredentials(req, res, next){
// do logic
if(){
res.status(403).send('Unauthorized')
} else {
next();
}
}
重要的是要了解 Express 在使用 res.send(), res.json(), res.end(), res.redirect()
发送响应后不会执行任何中间件。因此,在一种情况下(/
具有错误的身份验证),ensureCredentials
函数发送 403 而 app.get('/')
处理程序将不会是 运行。在另一种情况下,auth 签出,next()
被调用,app.get('/')
处理程序是 运行.
我正在尝试为 Express 上的整个站点添加基本授权。如果用户输入正确的凭据,那么我希望显示标准登录页面。如果不是,则应将用户带到 "access denied" 页面。我正在尝试弄清楚如何更改 basic-auth middleware 示例以实现此目的:
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 !== 'john' || credentials.pass !== 'secret') {
res.statusCode = 401
res.setHeader('WWW-Authenticate', 'Basic realm="example"')
res.end('Access denied')
} else {
res.end('Access granted')
}
})
如果我使用 next();
而不是 res.end()
,我会收到 undefined
错误。
var server = http.createServer(function (req, res, next) {
var credentials = auth(req)
if (!credentials || credentials.name !== 'john' || credentials.pass !== 'secret') {
res.statusCode = 401
res.setHeader('WWW-Authenticate', 'Basic realm="example"')
res.end('Access denied')
} else {
next();
}
})
我的路线是这样的:
app.use('/api/things', require('./api/thing'));
// . . .
// All other routes should redirect to the index.html
app.route('/*')
.get(function(req, res) {
res.sendFile(path.resolve(app.get('appPath') + '/index.html'));
});
next
是 connect
的构造,后者是 Express Web 服务器下的中间件库。但是您正在将自己的处理程序函数传递给 http 服务器。您应该让 http 服务器使用 express 应用程序来处理请求。那么express的中间件就很简单了。
var http = require('http');
var auth = require('basic-auth');
var app = require('express')();
var server = http.Server(app);
server.listen(3000);
app.get('/', ensureCredentials, function(req, res){
res.sendFile(path.resolve(app.get('appPath') + '/index.html'));
})
app.all('*', function(req, res){
res.redirect('/');
})
function ensureCredentials(req, res, next){
// do logic
if(){
res.status(403).send('Unauthorized')
} else {
next();
}
}
重要的是要了解 Express 在使用 res.send(), res.json(), res.end(), res.redirect()
发送响应后不会执行任何中间件。因此,在一种情况下(/
具有错误的身份验证),ensureCredentials
函数发送 403 而 app.get('/')
处理程序将不会是 运行。在另一种情况下,auth 签出,next()
被调用,app.get('/')
处理程序是 运行.