JWT已过期,nodejs API中出现意外响应



当我试图在node.js服务器中使用私有api时,我遇到了一个问题,这是我遵循的过程

  1. 注册(如果用户没有帐户(或登录(已经有帐户(
  2. 它生成令牌,我将其传递到标头res.header('access_token': token)
  3. 我复制这个令牌并将其粘贴到我的私有api的头部分(我现在正在使用poster测试它(,以验证用户是否登录
  4. 在我的路由中,我使用中间件将其转为私有,验证用户是否可以使用资源jwt.verify(authorization[1], process.env.SEED_AUTH)(SEED_AUTH是我存储在服务器中的令牌机密(

这是当我出现错误时,中间件无法验证用户并向我抛出此错误jwt expired

这是我的路线

const UsersController = require('../controllers/users.controller')
const AuthorizationMiddleware = require('../middlewares/authorization.middleware')
exports.routesConfig = (app) => {
app.post('/api/users',[
AuthorizationMiddleware.verifyValidJWT
], UsersController.insert)
}

这是我的中间件

const jwt = require('jsonwebtoken')
require('../config/env.config')
exports.verifyValidJWT = (req, res, next) => {
if (req.headers['access-token']) {
try {
let authorization = req.headers['access-token'].split(' ');
if (authorization[0] !== 'Bearer') {
return res.status(401).json({
ok: false,
err: "Unauthorized, Need a valid token"
});
} else {
console.log(authorization[1]);
req.jwt = jwt.verify(authorization[1], process.env.SEED_AUTH);
return next();
}
} catch (error) {
return res.status(403).json({
ok: false,
err: "Forbidden, need a valid token -> " + error.message
});
}
} else {
return res.status(401).json({
ok: false,
err: "Need to recieve a valid token"
});
}
}

最后是API用户控制器。插入

我想用这个api创建一个新用户。

为了更好地理解,这是我的登录API

const User = require('../models/users.model')
const { signUpValidation, logInValidation } = require('../middlewares/auth.validation.data')
const bcrypt = require('bcrypt')
const jwt = require('jsonwebtoken')
exports.logIn = async (req, res) => {
let body = req.body;
//Validation
const { error } = logInValidation(body)

if (error) {
return res.status(400).json({
ok: false,
err: error.details[0].message
})
}
//Check if the email already exists in the database
const user = await User.findOne({ email: body.email })
if (!user) {
return res.status(400).json({
ok: false,
err: "Invalid Email or password!"
})
}
const validPass = await bcrypt.compareSync(body.password, user.password)
if (!validPass) {
return res.status(400).json({
ok: false,
err: "Invalid Email or password!"
})
}

const token = jwt.sign(
{
_id: user._id,
email: user.email
},
process.env.SEED_AUTH,
{
expiresIn: process.env.TOKEN_EXPIRY
}
)

res.header('access-token', token).json({
ok: true,
user: {
id: user._id,
email: user.email
}
});
} 

注册和登录验证我使用这些中间件来验证它是否是一封有效的电子邮件,以及字母数最少的名称。。。

我的process.env.TOKEN_EXPIRY设置为300(我知道,这是以秒为单位的(,我已经尝试过通过使用更大的数字

(API在没有中间件的情况下工作(。

我没有看到的问题是什么。谢谢你的帮助。

process.env变量是字符串,而不是数字。根据jsonwebtoken文档,字符串默认为毫秒,数字默认为秒。因此,将TOKEN_EXPIRY从300 更改为300000

相关内容

最新更新