【问题标题】:Express.js 4 - use middleware for authentication before static filesExpress.js 4 - 在静态文件之前使用中间件进行身份验证
【发布时间】:2016-07-26 13:08:43
【问题描述】:

在我的express 应用程序中,我设置了静态文件,以便从/public 目录中使用这一行:

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

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

【问题讨论】:

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


    【解决方案1】:

    查看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】:

      取决于您正在寻找哪种身份验证,但如果您只是想要一些登录功能,这就是您所需要的:http://passportjs.org/

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

      如果您需要其他东西,更简单或自制,只需在声明静态端点之前编写一个要使用的中间件,如果一切顺利,则调用 next(),如果用户需要重试,则调用 res.redirect。

      【讨论】:

        【解决方案3】:

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

        在 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.

        【讨论】:

        • 太棒了!感谢您的解决方案!我正在考虑类似的事情,但我不确定实施以及此时我是否能够进行这种重定向。再次感谢!
        • 谢谢!您的回答帮助我解决了静态文件问题,同时也帮助我更好地理解了快速中间件的工作原理。现在一切都有意义
        猜你喜欢
        • 2021-01-20
        • 1970-01-01
        • 2011-10-04
        • 2018-01-25
        • 1970-01-01
        • 2014-09-07
        • 2021-08-30
        • 1970-01-01
        相关资源
        最近更新 更多