NodeJs使用jwt生成token以及使用express-jwt校验和解密token

摘要:
=0){//当数据库有当前用户时,它返回tokenlettoken=jwt.sign;res.send}else{res.send}}catch{//p抛出异常并将其发送到错误中间件以处理console.log;next;}})//注册接口路由器。post('/register',异步(req,res,next)=˃{let{用户名,密码,昵称}=req-body;尝试{//查询当前用户名不在数据库中(使用异步方法后,必须使用await方法返回值,否则返回promise对象)letuser=awaitquerySql(“select*fromuserwhereusername=?”,[用户名]);//res的存在意味着如果(user&&user.length!=0){res.send}else{//加密密码password=md5;//异步并等待insert data awaitquerySql(“insert intuser(用户名、密码、昵称)value(?

/注:校验token,获取headers⾥里里的Authorization的token方法,要写在路由加载之前,静态资源之后

app.use(expressJWT({
  secret: PRIVATE_KEY
}).unless({
  path: ['/api/user/register','/api/user/login'] //⽩白名单,除了了这⾥里里写的地址,其他的URL都需要验证
}));

一、生成token

1、安装jsonwebtoken

npm install jsonwebtoken -S

 

2、在公共文件中定义一个秘钥和过期时间(单位是秒)

module.exports = {
    "PRIVITE_KEY":"我是秘钥",
    "EXPIRESD":60*60*24
}

3、在需要生成token的页面引入jsonwebtoken(路由页面)

// jwt生成token
var {PRIVITE_KEY,EXPIRESD} = require("../utils/store")
const jwt = require("jsonwebtoken");

//jwt.sign()方法可生成token,第一个参数写的用户信息进去(可以写其他的),第二个是秘钥,第三个是过期时间
let token = jwt.sign({username},PRIVITE_KEY,{expiresIn:EXPIRESD});

 

  NodeJs使用jwt生成token以及使用express-jwt校验和解密token第1张

 

 

二、校验和解密token此方法写在静态资源加载之后,不然静态资源不能访问)

1、安装express-jw

npm install express-jwt

2、校验token,获取headers⾥里里的Authorization的token

前端token值格式 Bearer+token    这是express-jwt规定的前端格式
在入口文件app.js中引入express-jw以及token加密时使用的秘钥
const expressJWT = require('express-jwt');
var { PRIVITE_KEY } = require("./utils/store");
//使用此方法拦截所有请求看token是否正确(此方法写在静态资源加载之后,不然静态资源不能访问)
app.use(expressJWT({
  secret: PRIVATE_KEY
}).unless({
  path: ['/api/user/register','/api/user/login'] //⽩白名单,除了了这⾥里里写的地址,其他的URL都需要验证
}));

在app.js中的错误中间件定义token的处理
  // error handler
  app.use(function (err, req, res, next) {
      if (err.name === 'UnauthorizedError') {
        // 这个需要根据⾃自⼰己的业务逻辑来处理理
        res.status(401).send({code:-1,msg:'token验证失败'});
    }else {
      // set locals, only providing error in development
      res.locals.message = err.message;
      res.locals.error = req.app.get('env') === 'development' ? err : {};

      // render the error page
      res.status(err.status || 500);
      res.render('error');
    }
  });
 

 
在路由接口中可以使用req.user拿到token解密的值
 
 
 

 

路由页面如下

var express = require('express');
var router = express.Router();

var querySql = require("../db/index");
// md5加密key和方法
var {key} = require('../utils/store');
var {md5} = require("../utils/index")
// jwt生成token
var {PRIVITE_KEY,EXPIRESD} = require("../utils/store")
const jwt = require("jsonwebtoken");


// 登录接口
router.post("/login",async (req,res,next) => {
  try {
    // 对应前台的传参
    let {username,password} = req.body;
    // 跟数据库对应,看是否存在当前用户
    password = md5(`${password}${key}`);
    let result = await querySql("select * from user where username = ? and password = ?",[username,password]);
    if(result && result.length != 0){
      // 数据库有当前用户时返回token
      let token = jwt.sign({username},PRIVITE_KEY,{expiresIn:EXPIRESD});
      res.send({
        code:0,
        msg:"登录成功",
        token:token
      })
    }else {
      res.send({
        code:-1,
        msg:"用户名或者密码错误"
      })
    }
  } catch (error) {
    // p抛出异常并交由错误中间件处理
    console.log(error);
    next(error);
  }
})
// 注册接口
router.post('/register', async (req, res, next)=>{
  let {
    username,
    password,
    nickname
  } = req.body;
  try {
    // 查询当前用户名在不在数据库中(使用async方法后必须使用await方法才有值返回,不然返回promise对象)
    let user = await querySql("select * from user where username = ?", [username]);
    // 存在res即是数据库中有数据
    if (user && user.length != 0) {
      res.send({
        code: -1,
        msg: "用户已注册"
      })
    } else {
      // 对密码进行加密
      password = md5(`${password}${key}`);
      // async 和 await 向数据库插入数据
      await querySql("insert into user(username,password,nickname) values (?,?,?)", [username, password, nickname]);
      res.send({
        code: 0,
        msg: "注册成功"
      })
    }
  } catch (error) {
    console.log(error)
    next(error)
  }
});

// 查询用户信息接口
router.get("/info",async (req,res,next)=>{
  // 通过username获取用户信息
  console.log(req.user)
  let {username} = req.body;
  try {
    let userInfo = await querySql("select * from user where username = ?",[username]);
    res.send({
      code:0,
      userInfo:userInfo
    })
  } catch (error) {
    console.log(error);
    next(error);
  }  
})

module.exports = router;

  

app.js写法如下

var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');
var cors = require("cors");
// 使用express-jwt来进行token的解密和验证
const expressJWT = require('express-jwt');
var { PRIVITE_KEY } = require("./utils/store");
var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users')
var app = express();
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');
// 处理跨域
app.use(cors())
// 日志
app.use(logger('dev'));
// 使用post请求
app.use(express.json());
app.use(express.urlencoded({
  extended: false
}));
// 使用cookie
app.use(cookieParser());
// 访问静态资源目录
app.use(express.static(path.join(__dirname, 'public')));
// 校验token,获取headers⾥里里的Authorization的token,要写在路由加载之前,静态资源之后
app.use(expressJWT({
  secret: PRIVITE_KEY
}).unless({
  path: ['/api/user/register', '/api/user/login'] //⽩白名单,除了了这⾥里里写的地址,其他的URL都需要验证
}));

// 使用路由
app.use('/', indexRouter);
app.use('/api/user', usersRouter);

// catch 404 and forward to error handler
app.use(function (req, res, next) {
  next(createError(404));
});

// error handler
app.use(function (err, req, res, next) {
  if (err.name === 'UnauthorizedError') {
    // 这个需要根据⾃自⼰己的业务逻辑来处理理
    res.status(401).send({code:-1,msg:'token验证失败'});
  }else {
    // set locals, only providing error in development
    res.locals.message = err.message;
    res.locals.error = req.app.get('env') === 'development' ? err : {};

    // render the error page
    res.status(err.status || 500);
    res.render('error');
  }
});

module.exports = app;

  

 

免责声明:文章转载自《NodeJs使用jwt生成token以及使用express-jwt校验和解密token》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇mysql之排序查询GPU与CPU下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

node和npm的安装和镜像源的修改

在node官网下载https://nodejs.org/en/ 直接下载msi的文件,需要配置环境变量 我的电脑-->属性-->高级系统配置-->环境变量-->用户变量,在用户变量中配置 配置如下: -->新建 NODE_HOME X:Program Files odejs (注:node的目录) -->新建 NODE_...

Django学习笔记之安全

CSRF攻击 CSRF攻击概述 CSRF(Cross Site Request Forgery, 跨站域请求伪造)是一种网络的攻击方式,它在 2007 年曾被列为互联网 20 大安全隐患之一。其他安全隐患,比如 SQL 脚本注入,跨站域脚本攻击等在近年来已经逐渐为众人熟知,很多网站也都针对他们进行了防御。然而,对于大多数人来说,CSRF 却依然是一个陌生的...

nodejs之SVG转图片下载方案

本文介绍在nodejs基础上。怎样实现将svg转为png并下载的功能。 所需Webkit和node module简单介绍: phantomjs:一个基于WebKit的server端JavaScript API,它基于 BSD开源协议公布。PhantomJS无需浏览器的支持就可以实现对Web的支持。且原生支持各种Web标准,如DOM 处理、JavaScr...

苹果APNs’ device token特性和过期更新

APNs全名是Apple Push Notification Service。用iPhone的应该都习惯了,每次安装完一个新应用启动后,几乎都会弹出个警告框,“XXX应用”想要给您发送推送通知。这个警告框的权限申请就是为了APNs推送,用户授权后,应用提供商就可以通过APNs给用户推送消息。APNs的工作机制简单来说可以分为两步,第一步是注册推送服务从AP...

node.js安装环境的检查和配置

第一步到https://nodejs.org/download/   下载对应开发环境的安装包。 第二步安装下载的node-v0.12.5-x64.msi安装包 第三步检查是否安装成功 cmd 进入后输入命令 node -v  回车能得到nodejs版本号 输入node 回车再输入console.log('aaaaa') 回车能正常显示输出 写一个js文件...

微信分享接口的java开发的一些小步骤

1.配置接口信息进行验证 代码如下:     /**     * 访问没认证的地址跳转     *     * @param request     * @return 登录页面     * @throws Exception     */    @RequestMapping(value = "/checkWxDomainUrl", method =...