【问题标题】:Conditionally load router middleware Express JS有条件地加载路由器中间件 Express JS
【发布时间】:2023-03-25 18:16:01
【问题描述】:

我有一个 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 加载”,但端点 /login 和 /logout 仍然可以访问。

当我评论整个部分时

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

那么端点没有被加载。

有人可以澄清一下,如果这不是应该使用 next('route') 的方式。

【问题讨论】:

    标签: javascript node.js express


    【解决方案1】:

    从我的脑海中,尝试添加一个 isAuthenticated (无论你相当于什么)检查到您列出的 /login 和 /logout 路由代码。如果已通过身份验证,请重定向到受保护的页面,否则将登录表单(或注销的东西..)返回给用户。 :)

    【讨论】:

      【解决方案2】:

      我认为如果您对每个请求都使用中间件“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();
          };
      }
      

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

      祝你好运!

      【讨论】:

      • 你好 GuilloteL,当用户通过外部服务进行身份验证时,我们的应用程序被加载到容器中,我们根本不需要登录和注销路由。另一个服务为我们管理登录和注销。因此,如果身份验证已经完成,我根本不希望这些路由可以访问。
      猜你喜欢
      • 2017-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-09
      • 1970-01-01
      • 2019-05-25
      • 1970-01-01
      • 2021-02-24
      相关资源
      最近更新 更多