Express.js 4 - 在静态文件之前使用中间件进行身份验证

时间:2016-04-06 08:44:28

标签: node.js authentication express middleware static-files

在我的express应用中,我已使用此行设置从/public目录提供的静态文件:

app.use(express.static(__dirname + '/public'));

现在我需要在提供静态内容之前添加用于身份验证的中间件,并且如果未对用户进行身份验证以将其重定向到用于身份验证的路由(例如,/login)。 我不确定我该怎么做。有什么想法吗?

3 个答案:

答案 0 :(得分:9)

由于您没有指定它,我将假设您已经拥有某种身份验证系统。

在Express中,代码中的中间件顺序很重要:如果要在中间件2之前执行中间件1,则应将它们相应地放在代码中。由于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.

答案 1 :(得分:3)

查看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'));

答案 2 :(得分:0)

取决于您要查找的身份验证类型,但如果您只想要一些登录功能,则这就是您所需要的:http://passportjs.org/

它支持本地登录策略,以及一大堆第三方策略,如facebook,twitter等。

如果您需要其他更简单或自制的东西,只需在声明静态端点之前编写要使用的中间件,如果所有内容都签出则调用next(),如果用户需要重试则调用res.redirect。 p>