首页 > 解决方案 > 用户无法在我的应用程序 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,我看到了令牌,为什么我没有被保留?

提前致谢!

标签: node.jsauthenticationhandlebars.js

解决方案


首先,您可以显示获取配置文件页面的路线,它应该具有用于​​检查 cookie 和解码令牌的中间件,它可以识别谁已经登录。这里您仅显示签名令牌和返回它的逻辑。其次,您可以重构响应

    res.cookie('jwt', token, cookieOptions);
    
    res.status(200).redirect("/");

res.status(200).cookie('jwt', token, cookieOptions).redirect("/");

推荐阅读