node.js - 用户无法在我的应用程序 Nodejs+Mysql+HBS 中保持登录状态
问题描述
我正在关注本教程:https ://www.youtube.com/watch?v=VavWEtI5T7c
问题是:当用户在身份验证后登录时,并没有让他保持登录状态,因此他无法访问个人资料页面。我购买了这个 youtuber 的完整软件包和完整课程,但它根本没有帮助,因为即使文件相同,会话也无法正常工作。
登录片段如下,如果你想要更多,这里是我的 github,所以你可以可视化所有项目 --> https://github.com/AlessioDeMarino/progetto_pwm
const mysql = require("mysql");
const jwt = require('jsonwebtoken');
const bcrypt = require('bcryptjs');
const { promisify } = require('util');
const db = mysql.createConnection({
host: process.env.DATABASE_HOST,
user: process.env.DATABASE_USER,
password: process.env.DATABASE_PASSWORD,
database: process.env.DATABASE
});
// ****** LOGIN *******
exports.login = async (req, res) => {
try {
//const { email, password } = req.body;
const email = req.body.email;
const password = req.body.password;
if (!email || !password) {
return res.status(400).render('login', {
message: 'Please provide an email and password'
})
}
db.query('SELECT * FROM USERS WHERE USER_EMAIL = ?', [email], async (error, results) => {
console.log(results);
if (!results || !(password == results[0].USER_PWD)) {
res.status(401).render('login', {
message: 'Email or Password is incorrect'
})
} else {
const id = results[0].id;
// qui gli dò il token
const token = jwt.sign({ id }, process.env.JWT_SECRET, {
expiresIn: process.env.JWT_EXPIRES_IN
});
console.log("The token is: " + token);
const cookieOptions = {
expires: new Date(
Date.now() + process.env.JWT_COOKIE_EXPIRES * 24 * 60 * 60 * 1000
),
httpOnly: true
}
res.cookie('jwt', token, cookieOptions);
res.status(200).redirect("/");
}
})
} catch (error) {
console.log(error);
}
}
路线如下图:
router.get('/login', (req, res) => {
res.render('login');
});
router.get('/profile', authController.isLoggedIn, (req, res) => {
console.log(req.user);
if (req.user) {
res.render('profile', {
user: req.user
});
} else {
res.redirect('/login');
}
在用户登录后应该看到配置文件选项卡的索引页面中:
<body>
<nav>
<h4>Node MySQL</h4>
<ul>
<li><a href="/">Home</a></li>
{{#if user }}
<li><a href="/profile">Profile</a></li>
<li><a href="/auth/logout">Logout</a></li>
{{else}}
<li><a href="/login">Login</a></li>
<li><a href="/register">Register</a></li>
{{/if}}
</ul>
</nav>
我真的不明白可能出了什么问题,因为我看到了 cookie,我看到了令牌,为什么我没有被保留?
提前致谢!
解决方案
首先,您可以显示获取配置文件页面的路线,它应该具有用于检查 cookie 和解码令牌的中间件,它可以识别谁已经登录。这里您仅显示签名令牌和返回它的逻辑。其次,您可以重构响应
res.cookie('jwt', token, cookieOptions);
res.status(200).redirect("/");
至
res.status(200).cookie('jwt', token, cookieOptions).redirect("/");
推荐阅读
- ios - Xcode 从旧版本转换为 Swift 4,导致参数标签过载问题
- javascript - 这是回到我原来的提示功能的正确循环吗?(javascript)
- javafx - JavaFX 饼图图例位置在快照上移动
- php - 如何在php中按键读取数组多维
- html-framework-7 - Framework7中是否有“更多选项”(垂直省略号)菜单组件?
- c# - C#如何将CheckBox的字符串值添加到参数中
- python - 类继承错误:子对象没有属性“a”
- go - 为什么在这个例子中我们返回一个指针而不是一个值?
- javascript - 一起使用下划线和不可变
- python - Kivy:每次触摸后在 FloatLayout 中添加图像(on_touch_down),但之前的所有图像都消失了