Express.js 4 - 在静态文件之前使用中间件进行身份验证
Express.js 4 - use middleware for authentication before static files
在我的 express
应用程序中,我使用以下行将静态文件设置为从 /public
目录提供服务:
app.use(express.static(__dirname + '/public'));
现在我需要在提供静态内容之前添加一个用于身份验证的中间件,如果用户未通过身份验证将被重定向到一个路由进行身份验证(例如,/login
)。
我不太确定我该怎么做。有什么想法吗?
查看 Passport。
Passport 有多种身份验证策略。
这是一个基本 HTTP 身份验证的示例:
var express = require('express');
var passport = require('passport');
var BasicStrategy = require('passport-http').BasicStrategy;
var db = require('./db');
// Configure the Basic strategy for use by Passport.
//
// The Basic strategy requires a `verify` function which receives the
// credentials (`username` and `password`) contained in the request. The
// function must verify that the password is correct and then invoke `cb` with
// a user object, which will be set at `req.user` in route handlers after
// authentication.
passport.use(new BasicStrategy(
function(username, password, cb) {
db.users.findByUsername(username, function(err, user) {
if (err) { return cb(err); }
if (!user) { return cb(null, false); }
if (user.password != password) { return cb(null, false); }
return cb(null, user);
});
}));
// Create a new Express application.
var app = express();
var authenticate = passport.authenticate('basic', {
session: false,
failureRedirect: '/login'
});
app.use(authenticate, express.static(__dirname + '/public'));
取决于您正在寻找哪种身份验证,但如果您只想要一些登录功能,这就是您所需要的:http://passportjs.org/
它支持本地登录策略,以及一大堆第三方策略,如 facebook、twitter 等。
如果您需要其他东西,更简单的或自制的,只需在声明静态端点之前编写一个要使用的中间件,并在一切检查完毕后调用 next() ,如果用户需要,则调用 res.redirect重试。
由于您没有指定,我假设您已经拥有某种身份验证系统。
在 Express 中,中间件在代码中的顺序很重要:如果你想让中间件 1 在中间件 2 之前执行,你应该在你的代码中相应地放置它们。由于 express.static
是 中间件,如果你想在提供静态文件之前进行身份验证,你可以在调用 express.static
之前简单地编写你的身份验证中间件
app.use(function (req, res, next) {
if (!userAuthenticated(req)) {
return res.redirect('/login');
}
next();
});
app.use(express.static(__dirname + '/public'));
我假设您有一个 userAuthenticated
函数,例如检查 HTTP 请求是否包含有效的访问令牌。
在我的 express
应用程序中,我使用以下行将静态文件设置为从 /public
目录提供服务:
app.use(express.static(__dirname + '/public'));
现在我需要在提供静态内容之前添加一个用于身份验证的中间件,如果用户未通过身份验证将被重定向到一个路由进行身份验证(例如,/login
)。
我不太确定我该怎么做。有什么想法吗?
查看 Passport。
Passport 有多种身份验证策略。
这是一个基本 HTTP 身份验证的示例:
var express = require('express');
var passport = require('passport');
var BasicStrategy = require('passport-http').BasicStrategy;
var db = require('./db');
// Configure the Basic strategy for use by Passport.
//
// The Basic strategy requires a `verify` function which receives the
// credentials (`username` and `password`) contained in the request. The
// function must verify that the password is correct and then invoke `cb` with
// a user object, which will be set at `req.user` in route handlers after
// authentication.
passport.use(new BasicStrategy(
function(username, password, cb) {
db.users.findByUsername(username, function(err, user) {
if (err) { return cb(err); }
if (!user) { return cb(null, false); }
if (user.password != password) { return cb(null, false); }
return cb(null, user);
});
}));
// Create a new Express application.
var app = express();
var authenticate = passport.authenticate('basic', {
session: false,
failureRedirect: '/login'
});
app.use(authenticate, express.static(__dirname + '/public'));
取决于您正在寻找哪种身份验证,但如果您只想要一些登录功能,这就是您所需要的:http://passportjs.org/
它支持本地登录策略,以及一大堆第三方策略,如 facebook、twitter 等。
如果您需要其他东西,更简单的或自制的,只需在声明静态端点之前编写一个要使用的中间件,并在一切检查完毕后调用 next() ,如果用户需要,则调用 res.redirect重试。
由于您没有指定,我假设您已经拥有某种身份验证系统。
在 Express 中,中间件在代码中的顺序很重要:如果你想让中间件 1 在中间件 2 之前执行,你应该在你的代码中相应地放置它们。由于 express.static
是 中间件,如果你想在提供静态文件之前进行身份验证,你可以在调用 express.static
app.use(function (req, res, next) {
if (!userAuthenticated(req)) {
return res.redirect('/login');
}
next();
});
app.use(express.static(__dirname + '/public'));
我假设您有一个 userAuthenticated
函数,例如检查 HTTP 请求是否包含有效的访问令牌。