如何使用 Node.js 和 express 将 JWT 令牌共同绑定到每条路由中
How to do common binding of JWT token into each route using Node.js and express
我在 Node.js 和 express 应用程序中使用 JWT 令牌身份验证。但是对于每条路线,我都在调用验证令牌的方法,下面给出了我的代码。
route.js:
const express = require('express'),
controller = require('../controller/customer.controller'),
verify = require('../utill/verify.util.js'),
Router = express.Router();
class DemoProjectRouter {
getRouter() {
try{
Router.get('/', verify.verifyToken, controller.getCustomer.bind(controller));
Router.post('/add',verify.verifyToken, controller.addCustomer.bind(controller));
return Router;
}catch(error) {
console.log(error);
}
}
}
module.exports = new DemoProjectRouter();
在下面的文件中我正在验证令牌。
const jwt = require('jsonwebtoken');
const _ = require('lodash');
const jwtKey = "my_secret_key"
const jwtExpirySeconds = '2d';
class DemoProjectJWT {
async createJWT(username) {
try{
let obj = {};
obj['username'] = username;
const token = jwt.sign(obj, jwtKey, {algorithm: "HS256", expiresIn: jwtExpirySeconds});
return token;
}catch(error){
console.log(error);
}
}
async verifyToken(req, res, next) {
try{
let token = '';
if (_.get(req,['body', 'token'])) {
token = req.body.token;
}
if (_.get(req,['query', 'token'])) {
token = req.query.token;
}
if (_.get(req,['headers', 'x-access-token'])) {
token = req.headers['x-access-token'];
}
if (_.get(req,['cookies', 'token'])) {
token = req.cookies.token;
}
if (token === '' || token === null) {
let err = new Error('No token provided!');
err.status = 403;
res.send(err);
}else{
jwt.verify(token, jwtKey, (err, decode) => {
if (err) {
if (err.name === 'TokenExpiredError') {
console.log("token expired!");
let err = new Error('You are not authenticated!');
err.status = 401;
res.send(err);
}
}else{
req.decoded = decode;
next();
}
})
}
}catch(error) {
console.log(error);
}
}
}
module.exports = new DemoProjectJWT();
在这里,我在每个路由方法中绑定了我的令牌,但我需要编写任何通用方法,它将在每个路由中包含令牌以进行验证,这样如果我创建任何新的路由方法,我就不会再次添加 verify.verifyToken
对于 verification.for 每个用户请求它应该自动调用。
您需要将令牌验证处理程序注册为 router-level middleware:
Router.use(verify.verifyToken);
Router.get('/', controller.getCustomer.bind(controller));
Router.post('/add', controller.addCustomer.bind(controller));
您可以使用应用级中间件来完成。
但是请确保在该中间件中放置适当的逻辑,因为它会被所有路由调用。
app.use('*', (req, res, next) => {
if (verify.verifyToken()) {
next();
} else {
// Do something else
}
})
我在 Node.js 和 express 应用程序中使用 JWT 令牌身份验证。但是对于每条路线,我都在调用验证令牌的方法,下面给出了我的代码。
route.js:
const express = require('express'),
controller = require('../controller/customer.controller'),
verify = require('../utill/verify.util.js'),
Router = express.Router();
class DemoProjectRouter {
getRouter() {
try{
Router.get('/', verify.verifyToken, controller.getCustomer.bind(controller));
Router.post('/add',verify.verifyToken, controller.addCustomer.bind(controller));
return Router;
}catch(error) {
console.log(error);
}
}
}
module.exports = new DemoProjectRouter();
在下面的文件中我正在验证令牌。
const jwt = require('jsonwebtoken');
const _ = require('lodash');
const jwtKey = "my_secret_key"
const jwtExpirySeconds = '2d';
class DemoProjectJWT {
async createJWT(username) {
try{
let obj = {};
obj['username'] = username;
const token = jwt.sign(obj, jwtKey, {algorithm: "HS256", expiresIn: jwtExpirySeconds});
return token;
}catch(error){
console.log(error);
}
}
async verifyToken(req, res, next) {
try{
let token = '';
if (_.get(req,['body', 'token'])) {
token = req.body.token;
}
if (_.get(req,['query', 'token'])) {
token = req.query.token;
}
if (_.get(req,['headers', 'x-access-token'])) {
token = req.headers['x-access-token'];
}
if (_.get(req,['cookies', 'token'])) {
token = req.cookies.token;
}
if (token === '' || token === null) {
let err = new Error('No token provided!');
err.status = 403;
res.send(err);
}else{
jwt.verify(token, jwtKey, (err, decode) => {
if (err) {
if (err.name === 'TokenExpiredError') {
console.log("token expired!");
let err = new Error('You are not authenticated!');
err.status = 401;
res.send(err);
}
}else{
req.decoded = decode;
next();
}
})
}
}catch(error) {
console.log(error);
}
}
}
module.exports = new DemoProjectJWT();
在这里,我在每个路由方法中绑定了我的令牌,但我需要编写任何通用方法,它将在每个路由中包含令牌以进行验证,这样如果我创建任何新的路由方法,我就不会再次添加 verify.verifyToken
对于 verification.for 每个用户请求它应该自动调用。
您需要将令牌验证处理程序注册为 router-level middleware:
Router.use(verify.verifyToken);
Router.get('/', controller.getCustomer.bind(controller));
Router.post('/add', controller.addCustomer.bind(controller));
您可以使用应用级中间件来完成。
但是请确保在该中间件中放置适当的逻辑,因为它会被所有路由调用。
app.use('*', (req, res, next) => {
if (verify.verifyToken()) {
next();
} else {
// Do something else
}
})