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 请求是否包含有效的访问令牌。

Read more about middlewares.