node.js 在 cookie 中找不到“auth_token”。不断抛出 TypeError

Posted

技术标签:

【中文标题】node.js 在 cookie 中找不到“auth_token”。不断抛出 TypeError【英文标题】:node.js cannot find 'auth_token' in cookies. Keeps throwing TypeError 【发布时间】:2021-11-19 03:40:26 【问题描述】:

我正在尝试在访问静态页面之前验证用户是否拥有 Json Web 令牌。下面是我必须这样做的代码。我的问题是我无法在浏览器 cookie 中找到 JWT。我最终得到一个 TypeError,你会在这篇文章的底部找到。我知道我的代码可以正常工作,因为我可以使用邮递员手动将 jwt 令牌添加到标头中并且可以正常工作。

verifyToken.js

const jwt = require('jsonwebtoken');

module.exports = function(req,res,next)
        const token = req.cookies.auth_token;
        if (!token) 
            return res.status(403).send('Access Denied');
        
        try
            const verified = jwt.verify(token, process.env.TOKEN_SECRET);
            req.user = verified;
            return next();
         catch (err) 
            res.clearCookie('token');
            res.status(403).send('Invalid Token');
        
    ;

auth.js

const router = require('express').Router();
const User = require('../model/User');
const jwt = require('jsonwebtoken');
const bcrypt = require('bcryptjs');
const registerValidation, loginValidation = require('../validation');
const  redirect  = require('express/lib/response');

//Register New User
router.post('/register', async (req,res) => 

    //Validate the data before creating user
    const error = registerValidation(req.body);
    if (error) return res.status(400).send(error.details[0].message);

    //Checking if user already exist in database
    const emailExist = await User.findOne(email: req.body.email);
    if(emailExist) return res.status(400).send('Email already exists');

    //Hash the password for secruity
    const salt = await bcrypt.genSalt(10);
    const hashedPassword = await bcrypt.hash(req.body.password, salt);

    //Create a new user
    const user = new User(
        name: req.body.name,
        email: req.body.email,
        password: hashedPassword
    );
    res.redirect('/login')
    try
        const savedUser = await user.save();
        res.send(user: user._id);
    catch(err)
        res.status(400).send(err);
    
);

//Login
router.post('/login', async (req,res) => 
    const error = loginValidation(req.body);
    if (error) return res.status(400).send(error.details[0].message);

    //Checking if eamil exist in database
    const user = await User.findOne(email: req.body.email);
    if(!user) return res.status(400).send('Email or password does not exists');

    //Check if password is correct
    const validPass= await bcrypt.compare(req.body.password, user.password);
    if(!validPass) return res.status(400).send('Invalid password')
    
    //Creat and assign json web token
    const token = jwt.sign(_id: user._id, process.env.TOKEN_SECRET);

 res.cookie('auth_token', token, 
        httpOnly: true,
        // secure: false,
        // maxAge: 1000000,
        // signed: true,
    )
    //res.header('auth-token', token);
    //Redirects you to welcome page after successful login
    res.redirect('/welcome');
);

module.exports = router;

TypeError:无法读取未定义的属性“auth_token” 在 module.exports (D:\coding-stuff\Web Dev\Node.js\Node.js_Authenticator\routes\verifyToken.js:4:35) 在 Layer.handle [as handle_request] (D:\coding-stuff\Web Dev\Node.js\Node.js_Authenticator\node_modules\express\lib\router\layer.js:95:5) 在下一个(D:\coding-stuff\Web Dev\Node.js\Node.js_Authenticator\node_modules\express\lib\router\route.js:137:13) 在 Route.dispatch (D:\coding-stuff\Web Dev\Node.js\Node.js_Authenticator\node_modules\express\lib\router\route.js:112:3) 在 Layer.handle [as handle_request] (D:\coding-stuff\Web Dev\Node.js\Node.js_Authenticator\node_modules\express\lib\router\layer.js:95:5) 在 D:\coding-stuff\Web Dev\Node.js\Node.js_Authenticator\node_modules\express\lib\router\index.js:281:22 在 Function.process_params (D:\coding-stuff\Web Dev\Node.js\Node.js_Authenticator\node_modules\express\lib\router\index.js:335:12) 在下一个(D:\coding-stuff\Web Dev\Node.js\Node.js_Authenticator\node_modules\express\lib\router\index.js:275:10) 在 urlencodedParser (D:\coding-stuff\Web Dev\Node.js\Node.js_Authenticator\node_modules\body-parser\lib\types\urlencoded.js:91:7) 在 Layer.handle [as handle_request] (D:\coding-stuff\Web Dev\Node.js\Node.js_Authenticator\node_modules\express\lib\router\layer.js:95:5)

编辑:

const jwt = require('jsonwebtoken');
const router = require('express')();
const cookieParser = require('cookie-parser');
router.use(cookieParser());
module.exports = function(req,res,next)
        const token = req.header('Cookie');
        if (!token) 
            return res.status(403).send('Access Denied');
        
        try
            const verified = req.header('Cookie');
            req.user = verified;
            // const verified = jwt.verify(token, process.env.TOKEN_SECRET);
            // req.user = verified;
             next();
         catch (err) 
            res.clearHeader;
            res.status(403).send('Invalid Token');
        
    ;

此代码的唯一问题是它仅检查响应标头中是否存在 cookie,而不是该 cookie 是否包含有效的 JWT。我现在的问题是如何使这段代码更具体地寻找有效的 JWT?

【问题讨论】:

你在其他路由器之前使用 router.use(express.cookieParser()) 吗? 确保已导入 const express = require('express') @AmanurRahman 不,我没有在任何其他路由器之前使用 router.use(express.cookieParser()) 。我也进口了快递。 【参考方案1】:

您需要使用cookie-parser

const router = require('express')();
const cookieParser = require('cookie-parser')
const User = require('../model/User');
const jwt = require('jsonwebtoken');
const bcrypt = require('bcryptjs');
const registerValidation, loginValidation = require('../validation');
const  redirect  = require('express/lib/response');

router.use(cookieParser())
...

要使 .cookies 可用,假设您使用的是节点 14.x,也可能值得使用可选链接

例如

const token = req?.cookies?.auth_token;

【讨论】:

这修复了我的 TypeError 但我不认为它实际上是在我的 cookie 中寻找 auth_token 因为当我像以前那样使用 PostMan 时它不再起作用我只是被拒绝访问,这意味着有! cookie 中的标记。即使我在浏览器中查看时也有。 嘿@AlexanderMurdock 如果没有完整的源代码,真的很难给你一个更好的答案,看起来你有很多活动部件,所以我在这里创建了一个工作示例:github.com/JamesMahy/SO-69338984-cookie-jwt-problem 有也是您可以使用的自述文件中的公共邮递员集合。

以上是关于node.js 在 cookie 中找不到“auth_token”。不断抛出 TypeError的主要内容,如果未能解决你的问题,请参考以下文章

Node.Js-如果在MongoDB中找不到匹配的文档,则返回1

vue-cli v3 与 node.js firebase 函数,firebase 托管(错误:在函数源目录中找不到 npm 包)

仍然需要使用带有 passport.js 的 cookie-parser 吗?

在 Angular 2 中找不到引用的文件

无服务器:在 ubuntu 16.04 中找不到命令

aws + serverless + webpack => 在 prod 中找不到模块 xxx