我有一个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
然后没有加载端点。
有人可以澄清如果不是这样的话('路线')应该使用。
答案 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();
};
}
现在,如果用户未经过身份验证,则无法访问此中间件之后的所有端点。因此,您可以使用注销端点,或其他任何内容。
祝你好运!