想法:
我有一条受保护的路由“ / me”,并且“每次时间”用户尝试到达那里,他应该输入密码(即使该用户已经登录)。如果密码正确,则用户进入“ /我”路径。
问题:
我用快递。在“ / me”路由上有一个称为“ confirm-transaction”的中间件。并且当用户转到“ / me”路由时,该中间件会将用户重定向到“ / confirm-transaction?redirect = / me”,并且用户可以看到一个应在其中输入密码的字段。
在这一刻,我不知道该怎么办,因为如果密码正确,我会尝试将用户重定向到“ / me”路由(我从“?redirect = / me”参数获得此路由),但是中间件再次将他重定向到“ / confirm-transaction?redirect = / me”。而且用户永远无法进入“ /我”路线。
问题是:
如何解决这种情况?我知道如果密码正确,我应该使用“ next()”,但是我不能这样做,因为中间件进行了重定向并且没有更多的“ next()”
以下是一些代码:
const express = require('express');
const server = express();
const requestAuthorization = (req, res, next) => {
res.redirect(301, `/confirm-transaction?redirect=${req.originalUrl}`);
};
server.get('/me', requestAuthorization, (req, res) => {
res.status(200).send("this is /me route");
});
server.get('/confirm-transaction', (req, res) => {
res.status(200).sendFile("password.html");
// there is a form with field and button with POST method to '/confirm-transaction'
});
server.post('/confirm-transaction', (req, res) => {
if (req.query.password === 'testpassword') { // it is a fake password (for testing)
res.redirect(301, req.query.redirect);
}
res.redirect(301, `/confirm-transaction?redirect=${req.query.redirect}`);
});
答案 0 :(得分:1)
/me
盲目地重定向到/confirm-transaction
。
您可以做的是:
1.成功授权后,向用户发送令牌(或某种形式)。客户端将其存储,然后下一个请求应在标头中包含该令牌。
2.在requestAuthorization()
内部,检查请求标头是否具有有效令牌。如果是这样,请不要重定向,否则,请重定向。
注意:在这种情况下,您可能必须在标头中使用令牌进行重定向。
注意:您必须将令牌存储在有权将令牌与用户匹配的位置。