我使用JWT进行身份验证。身份验证将是一个中间件:
const jwt = require('jsonwebtoken');
require('dotenv').config();
module.exports = (req, res, next) => {
const token = req.header("auth-token");
if (!token) return res.status(401).send("Missing token. Access denied");
try {
const decoded = jwt.verify(token, process.env.jwtKey);
req.user = decoded;
next();
} catch (err) {
console.log(err);
res.status(400).send('Invalid token.');
}
};
现在,当我获得一个令牌并在头“auth-token”中使用它,并使用身份验证中间件发出get或post请求时,它总是给我“jsonWebtokenerror:invalid Signature”(jsonWebtokenerror:invalid Signature)
我这样使用中间件:
router.get('/:id', auth, async (req, res) => {
const user = await User.findOne({
_id: req.params.id,
});
if (!user) return res.status(404).send('User not found');
res.send(user);
})
这里是生成令牌的地方
router.post('/', async (req, res) => {
//check for validation errors
const { error } = validate(req.body);
if (error) return res.status(400).send(error.details[0].message);
let user = await User.findOne({ email: req.body.email });
if (!user) return res.status(404).send("Invalid email or password");
const validPassword = await bcrypt.compare(req.body.password, user.password);
if (!validPassword) return res.status(400).send("Invalid email or password");
res.json({ token: user.generateAuthToken(), status: "User is logged in" })
});
const validate = (req) => {
const schema = Joi.object({
email: Joi.string().min(6).max(255).email().required(),
password: Joi.string().min(6).max(255).required(),
});
return schema.validate(req);
};
module.exports = router;
您可以看到,当我在jwt.io调试器上发出请求时,使用了身份验证中间件,当我放入令牌its says its ok..那有什么要紧的?
所以我解决了这个问题,我有错误的密钥,我解码和我验证。