我试图理解在网页之间切换时,app.get()在调用函数时是如何工作的。
我已经创建了一个用户登录页面,它为用户分配一个令牌并在函数中检查它。
我使用app.post('/login', login);调用登录函数,该函数将用户对象发送到服务器。创建令牌后,我希望在检查令牌后在函数中呈现下一个页面。(参见下面的代码)
然而,我并不真正理解app.get('/', checkToken, getProfilePage)是如何被调用的。因为我不认为它会被称为。
我看过一些解释HTTP请求的网站,但我很难找出它们在app.js中是如何链接在一起的。
App.js
app.post('/login', login);
app.get('/', authorize.checkToken, getProfilePage);
function login(req, res, next) {
userService.login(req.body, (err, user) => {
if (err) {
res.redirect('error.ejs');
console.log(error.message);
}
console.log(user);
if (!user) {
res.status(400).json({ success: false, message: 'Username or
password is incorrect' });
}
else {
res.json(user);
}
})
}下一个登录函数分配令牌,并在上面用作中间件:
function login({ username, password }, callback) {
grabUsers((err, users) => {
let user = users.find(u => u.username === username && u.password
=== password);
if (user) {
const token = jwt.sign({ username: username }, config.secret,
{ expiresIn: '24h'
}
);
const { password, ...userWithoutPassword } = user;
user = {
...userWithoutPassword,
success: true,
message: 'Authentication successful!',
token: token
}
};
callback(null,user);
})}
authorize.js内幕
let jwt = require('jsonwebtoken');
const config = require('./config.js');
let checkToken = (req, res, next) => {
console.log("check token running...");
let token = req.headers['x-access-token'] ||
req.headers['authorization']; // Express headers are auto
converted to lowercase
if (token.startsWith('Bearer ')) {
// Remove Bearer from string
token = token.slice(7, token.length);
}
if (token) {
jwt.verify(token, config.secret, (err, decoded) => {
if (err) {
return res.json({
success: false,
message: 'Token is not valid'
});
} else {
req.decoded = decoded;
next();
}
});
} else {
return res.json({
success: false,
message: 'Auth token is not supplied'
});
}
};
module.exports = {
checkToken: checkToken }getProfilePage函数:
module.exports = {
getProfilePage: (req, res) => {
res.render('profile.ejs');
}
}因此,我的登录表单将发布到/login,一旦验证通过,我将检查令牌,然后调用getProfilePage。但是,在发布和验证登录数据之后,如何调用app.get()呢?
发布于 2019-07-26 07:43:17
你没有从你的应用程序调用路由,你需要做的是重定向到它: res.redirect('/');
发布于 2019-07-26 08:01:04
我认为您尝试对用户进行身份验证的方式存在问题。在我看来,你在authorization头中发送了一个令牌,这是你访问API时的一种常见做法。虽然不确定如何/何时生成令牌并设置此标头...
无论如何,这种方法对于授权是很好的,但是对于身份验证就不是那么好了。
在/login请求成功后,您应该设置身份验证cookie (用户会话)。为简单起见,您可以只生成一个编码了userId的JWT,并将其用作此cookie值(让我们称其为user-session)。
现在,每次用户发出请求时,cookie将随其一起发送,您可以从该JWT解码userId。(同样的事情,但现在您将从req.cookies['user-session']而不是req.headers['authorization']获取令牌)。
但是在发布和验证登录数据之后,如何调用app.get()呢?
如果您正在使用AJAX (即window.location.replace('/')),则可以在收到成功的/login响应后立即从客户端导航到此页面;如果您在没有使用AJAX的情况下提交表单,则可以在成功登录时使用res.redirect('/')而不是res.json(user)。
重定向强制浏览器立即向您指定的网址发出另一个请求,到那时您已经设置了user-session cookie,即您将能够检索userId并返回正确的个人资料页面。
https://stackoverflow.com/questions/57211350
复制相似问题