【发布时间】: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()) 。我也进口了快递。
标签: javascript node.js express cookies jwt