使用中间件保护 Expressjs 路由
Protect Expressjs routes using Middleware
晚上好!我会先说如果这不可能,我愿意接受其他建议。
我正在使用 MERN 堆栈创建一个非常简单的发票应用程序。我只想通过在路由之前添加一些中间件来保护后端的路由。我正在使用 Auth0 进行身份验证。我想对 header referer
URL 做一个简单的比较,但是当页面第一次被重定向时,它有 authorization_code
和 state
附加到 URL,然后当页面刷新时,它是正常的 URL,没有附加代码和状态。有没有办法获取状态和authorization_code?我也尝试过 cookie 验证,但问题是在重定向完成之前不会给出 cookie,因此中间件不断发送错误。
我是应用程序身份验证层的新手,所以如果有更好的方法来做到这一点,我会洗耳恭听。我也在考虑改用访问令牌,只是将获取访问令牌的逻辑放在中间件中。
// server.js
app.use(
expressSession({
secret: process.env.SESSION_SECRET,
resave: false,
saveUninitialized: false,
})
);
app.use(express.json());
app.use(cors());
app.use(express.static(path.join(__dirname, 'build')));
app.use('/', cookieValidationMiddleware,refererValidationMiddleware, StoreInvoiceRouter); // route that has the middleware
app.use('/', saveLoggedInUserMiddleware, UserInvoicesRouter);
app.use('/', UpdateUserProfileRouter);
app.get('*', async (req,res) => {
res.sendFile(path.join(__dirname, 'build', 'index.html'));
});
//CookieValidation (not actually the cookie)
var cookie = require('cookie');
const cookieValidation = (req,res,next) => {
const headerHost = req.headers.host;
const host = `localhost:8080`;
if(headerHost === host) {
console.log('[cookieValidation] Header: hosts match');
next();
} else {
console.log('[cookieValidation] Header: Hosts do not match');
return;
}
};
module.exports = cookieValidation;
// RefererValidation (not referer validation anymore)
// TODO Change the code below to get the authorization code from the URL to use or find another method to protect this route.
const refererValidation = (req,res,next) => {
if(req.sessionID) {
console.log('[refererValidation] Session Valid');
next()
} else {
console.log('[refererValidation] Session IDs do not match');
return;
}
};
module.exports = refererValidation;
如果情况是第一个 URL 在 URL 中具有状态和身份验证,然后客户端获得重定向并且您希望从重定向中获得相同的信息,那么您有一对选择:
您可以将状态和身份验证信息放入重定向 URL,这样当重定向返回到您的服务器时,它就在重定向 URL 中。
假设第一个和第二个 URL 是同一个域,您可以将状态和身份验证信息添加到该客户端的会话对象(您表明您已经在使用express-session 所以你有一个会话为每个客户端)。然后,当重定向 URL 请求到达时,您可以从会话对象中获取该信息。
同样,假设第一个和第二个 URL 是同一个域,您可以在对第一个 URL 的响应中添加一个 cookie,它将包含您想要的任何信息需要第二个 URL,如果需要,该信息可以在服务器端加密。
如果使用两个 URL 跨域,那么您可以在服务器上创建自己的跨域会话对象,将其插入到具有唯一性的服务器端 Map 对象中创造了 sessionID 作为键,并将该 sessionID 放在重定向的 URL 中。然后,当你得到第二个 URL 时,你可以从 URL 中获取 sessionID,在你的服务器端 Map 中查找与之关联的数据,并让这些数据可供你的服务器使用.
晚上好!我会先说如果这不可能,我愿意接受其他建议。
我正在使用 MERN 堆栈创建一个非常简单的发票应用程序。我只想通过在路由之前添加一些中间件来保护后端的路由。我正在使用 Auth0 进行身份验证。我想对 header referer
URL 做一个简单的比较,但是当页面第一次被重定向时,它有 authorization_code
和 state
附加到 URL,然后当页面刷新时,它是正常的 URL,没有附加代码和状态。有没有办法获取状态和authorization_code?我也尝试过 cookie 验证,但问题是在重定向完成之前不会给出 cookie,因此中间件不断发送错误。
我是应用程序身份验证层的新手,所以如果有更好的方法来做到这一点,我会洗耳恭听。我也在考虑改用访问令牌,只是将获取访问令牌的逻辑放在中间件中。
// server.js
app.use(
expressSession({
secret: process.env.SESSION_SECRET,
resave: false,
saveUninitialized: false,
})
);
app.use(express.json());
app.use(cors());
app.use(express.static(path.join(__dirname, 'build')));
app.use('/', cookieValidationMiddleware,refererValidationMiddleware, StoreInvoiceRouter); // route that has the middleware
app.use('/', saveLoggedInUserMiddleware, UserInvoicesRouter);
app.use('/', UpdateUserProfileRouter);
app.get('*', async (req,res) => {
res.sendFile(path.join(__dirname, 'build', 'index.html'));
});
//CookieValidation (not actually the cookie)
var cookie = require('cookie');
const cookieValidation = (req,res,next) => {
const headerHost = req.headers.host;
const host = `localhost:8080`;
if(headerHost === host) {
console.log('[cookieValidation] Header: hosts match');
next();
} else {
console.log('[cookieValidation] Header: Hosts do not match');
return;
}
};
module.exports = cookieValidation;
// RefererValidation (not referer validation anymore)
// TODO Change the code below to get the authorization code from the URL to use or find another method to protect this route.
const refererValidation = (req,res,next) => {
if(req.sessionID) {
console.log('[refererValidation] Session Valid');
next()
} else {
console.log('[refererValidation] Session IDs do not match');
return;
}
};
module.exports = refererValidation;
如果情况是第一个 URL 在 URL 中具有状态和身份验证,然后客户端获得重定向并且您希望从重定向中获得相同的信息,那么您有一对选择:
您可以将状态和身份验证信息放入重定向 URL,这样当重定向返回到您的服务器时,它就在重定向 URL 中。
假设第一个和第二个 URL 是同一个域,您可以将状态和身份验证信息添加到该客户端的会话对象(您表明您已经在使用express-session 所以你有一个会话为每个客户端)。然后,当重定向 URL 请求到达时,您可以从会话对象中获取该信息。
同样,假设第一个和第二个 URL 是同一个域,您可以在对第一个 URL 的响应中添加一个 cookie,它将包含您想要的任何信息需要第二个 URL,如果需要,该信息可以在服务器端加密。
如果使用两个 URL 跨域,那么您可以在服务器上创建自己的跨域会话对象,将其插入到具有唯一性的服务器端 Map 对象中创造了 sessionID 作为键,并将该 sessionID 放在重定向的 URL 中。然后,当你得到第二个 URL 时,你可以从 URL 中获取 sessionID,在你的服务器端 Map 中查找与之关联的数据,并让这些数据可供你的服务器使用.