node.js - 验证路由器文件中的 jwt 令牌
问题描述
我创建了一个在 mysql 数据库上执行一些查询的 Rest Api。该 api 是通过 oclif 构建的 cli a 访问的。我正在尝试在执行查询之前验证令牌。我想在同一个文件(routes.js)中进行验证。该文件如下所示:
module.exports = app => {
const entry = require("../controlers/entry.controller.js");
const sql = require("../models/db.js");
const bcrypt = require('bcrypt');
var express=require('express');
// Retrieve a single Entry with Id
var fs=require('fs');
var privateKey = fs.readFileSync('private.key');
var jwt=require('express-jwt');
app.use(
jwt({
secret: privateKey,
credentialsRequired: false,
getToken: function fromHeaderOrQuerystring (req) {
if (req.headers.authorization && req.headers.authorization.split(' ')[0] === 'Bearer') {
return req.headers.authorization.split(' ')[1];
} else if (req.query && req.query.token) {
return req.query.token;
}
return null;
}
}));
app.get("/entry/:Id", entry.findOne);
app.post("/energy/api/Login", function(req,res){
var jwt=require('jsonwebtoken');
sql.query(`SELECT user,pass,quota,apikey,email FROM users WHERE user=?`,[req.query.username],(err,res1) => {
//console.log(res1);
const password=res1[0].pass;
const e=res1[0].email;
const a=res1[0].apikey;
const q=res1[0].quota;
const p=res1[0].privileges;
if(bcrypt.compareSync(req.query.passw,password)){
var jwt=require('jsonwebtoken');
var privateKey = fs.readFileSync('private.key');
var token = jwt.sign({user:req.query.user ,passw: req.query.passw,email: e, quota: q,apikey: a,privileges: p }, privateKey, { algorithm: 'HS256' });
res.status(200).send(token);
}
else res.status(400).send("Bad Request");
});
});
在登录部分,我创建令牌并将其返回给 CLI。然后 cli 执行以下操作:
axios.defaults.headers.common['X-OBSERVATORY-AUTH']="Bearer " + token;
await cli.anykey();
//create new user
if (`${flags.newuser}` !== "undefined" && `${flags.passw}` !== "undefined" && `${flags.email}` !== "undefined" && `${flags.quota}` !== "undefined" ){
let hash = bcrypt.hashSync(`${flags.passw}`,10);
await axios.post('https://localhost:8765/energy/api/Admin/users?username=' +`${flags.newuser}` +'&passw=' + hash +'&email=' + `${flags.email}` +'"a=' + `${flags.quota}`);
}
但是,当 routes.js 文件获取 post 命令时,它会像这样处理它:
app.put("/energy/api/Admin/users/:username",async function(req,res){
if (req.params.username !== "undefined" && req.query.email !== "undefined" && req.query.quota !== "undefined"){
console.log(req.params.username);
sql.query(`UPDATE users SET pass=?,email=?,quota=? WHERE user=?`,[req.query.passw,req.query.email,req.query.quota,req.params.username],(err,res) => {
if (err) {
console.log("error: ", err);
result(err, null);
return;
}
});
}
res.send("Successful");
});
我想添加一些中间件来验证令牌,并检查参数配额是否 >0 以及是否将其减一。我怎样才能做到这一点?
声明:这段代码是用node.js,express.js写的
解决方案
首先,您的代码没有模块化。而且您必须编写路由中间件来保护路由而不是全局中间件
我认为这个项目将帮助您理解jwt,express 代码( https://github.com/ahari884/simple-node-boilerplate ) 请检查它你会发现如何为 express 中的路由编写 jwt 身份验证
推荐阅读
- python - 在子类中覆盖时使用父属性设置器
- dart - 如何从颤振(charts_flutter)在饼图上添加图例?
- javascript - 如何为我的 Wordpress 网站更改此加载栏的颜色?
- python - 如何一次性检测和删除熊猫数据帧每一列的异常值?
- intellij-idea - JetBrains IDE(IDEA、PhpStorm、WebStorm 等)中的 Sass linting
- css - 半圆形背景CSS
- c - 如何在 Enlightment 库中手动折叠框架
- apache-spark - Hadoop SequenceFile 和 TextFile 之间没有大小差异?
- jquery - 使用 jQuery 在 TinyMCE 编辑器中选择元素
- java - 使用 JPanel 列表制作表格(应用百分比大小列)