有条件地加载路由器中间件Express JS

时间:2018-05-25 23:42:24

标签: javascript node.js express

我有一个Express JS代码,我在其中加载了一个中间件,用于定义路由器上的某些端点。端点特定于用户登录和注销。我正在添加新的身份验证,在这种情况下,我从其他服务收到我的身份验证令牌。当我从其他服务收到令牌时,我不希望加载这些终点。

这是我的server.js文件

let app = express();
const authEndpoints = require('auth');  // this defines router endpoints
const alreadyAuth = require('checkHeaders'); // this middleware checks if request 
// already has the auth headers and set res.locals.alreadyAuthenticated to true else false

app.use('/', alreadyAuth);
app.use('/',function(req, res, next) {
  if(res.locals.alreadyAuthenticated === false)
    next();
else {
   console.log('authentication already exists skipping authEndpoints loading');
   next('route');
   }
}, authEndpoints); // login, logout

//continue here
app.use('/',nextMiddleware);

auth.js文件

'use strict';

const express = require('express');
const path = require('path');
const router = express.Router();
router.get('/login', (req, res) => {
  // some code
  res.sendFile('login.html');
}
router.get('/logout', (req, res) => {
  // some code
});

module.exports = router;

我看到控制台日志打印'身份验证已经存在,跳过authEndpoints loading'但仍然可以访问端点/登录和/注销。

当我评论整个部分时

app.use('/',function(req, res, next) {
  if(res.locals.alreadyAuthenticated === false)
    next();
else {
   console.log('authentication already exists skipping authEndpoints loading');
   next('route');
   }
}, authEndpoints); // login, logout

然后没有加载端点。

有人可以澄清如果不是这样的话('路线')应该使用。

2 个答案:

答案 0 :(得分:0)

从我的脑海中,尝试添加一个isAuthenticated(无论你的等价物),检查你列出的/ login和/ logout路由代码。如果它经过身份验证,请重定向到受保护的页面,否则返回用户登录表单(或注销事物..)。 :)

答案 1 :(得分:0)

我认为如果你使用中间件" alreadyAuth"对于每个请求,无论路线如何:

app.use(alreadyAuth);

通过这种方式,您可以检查每个路由的每个请求中的标头。在" checkHeaders"中间件,如果未经过身份验证,则必须使用if语句将用户重定向到登录页面,并在已经过身份验证的情况下使用next()。

let checkHeaders = function(req, res, next) {
    //some code that check headers
    if(isAuthenticate === false) {
        res.redirect("/login");
    } else {
        next();
    };
}

现在,如果用户未经过身份验证,则无法访问此中间件之后的所有端点。因此,您可以使用注销端点,或其他任何内容。

祝你好运!