node.Js + jwt 基于token的登录验证

node.js中的token验证----以登录为例

目的:在服务端实现客户端请求携带token的验证。
方法:使用第三方JWT(jsonwebtoken )模块生成并验证token。

一. 准备工作

1.密匙生成:安装密匙工具openssl,下载地址:http://slproweb.com/products/Win32OpenSSL.html;按要求安装完成,在安装目录打开工具(如:C:\OpenSSL-Win64\bin\openssl.exe)如下:

node.Js + jwt 基于token的登录验证_第1张图片
输入命令行 genrsa -out d://jwt.pem 1024 生成私匙文件 jwt.pem

node.Js + jwt 基于token的登录验证_第2张图片
执行命令行 rsa -in d://my/jwt/jwt.pem -pubout -out jwt_pub.pem 将私匙装换成我们需要的公匙文件
node.Js + jwt 基于token的登录验证_第3张图片

二.服务端搭建token工具

执行 npm install jsonwebtoken 安装jwt模块
在public/untils下新建jwt.js(token工具)文件,结构如下:
node.Js + jwt 基于token的登录验证_第4张图片
代码如下:

// 引入模块依赖
const fs = require("fs");
const path = require("path");
const jwt = require("jsonwebtoken");
// 创建 token 类
class Jwt {
  constructor(data) { //data token生成需要传入的key值 可作为唯一标识的值
    this.data = data;
  }

  //生成token
  generateToken() {
    let data = this.data;
    let created = Math.floor(Date.now() / 1000);
    let cert = fs.readFileSync(path.join(__dirname, "../pem/public_key.pem")); //私钥 可以自己生成
    let token = jwt.sign(
      {
        data,
        exp: created + 60 * 60 // 过期时间1小时
      },
      cert,
      { algorithm: "RS256" }
    );
    return token;
  }

  // 校验token
  verifyToken() {
    let token = this.data;
    let cert = fs.readFileSync(path.join(__dirname, "../pem/public_key.pem")); //公钥 可以自己生成
    let res;
    try {
      let result = jwt.verify(token, cert, { algorithms: ["RS256"] }) || {};
      let { exp = 0 } = result,
        current = Math.floor(Date.now() / 1000);
      if (current <= exp) {
        res = result.data || {};
      } else {
        res = "err";
      }
    } catch (e) {
      res = "err";
    }
    return res;
  }
}
module.exports = Jwt;

三.引入token工具实现token生成并返回给客户端

引入token工具
node.Js + jwt 基于token的登录验证_第5张图片
在第一次生成token的请求进行处理(如:登录):
node.Js + jwt 基于token的登录验证_第6张图片

四.客户端请求服务端时,验证token

首先在请求前拦截,制定需要token验证的路由:

//验证token
app.use(function(req, res, next) {
  // 需要进行token校验的路由
  if (req.url == "/user/getUserInfo") {
    let token = req.headers.authorization; // 客服端请求带入token的地方
    let jwt = new JwtUtil(token);
    let result = jwt.verifyToken();
    // 如果考验通过就next,否则就返回登陆信息不正确
    if (result == "err") {
      res.send({ code: 401, msg: "身份验证失败,请重新登录" });
    } else {
      next();
    }
  } else {
    next();
  }
});

在需要验证token的请求处获取token中的key值:

//获取个人信息
router.get("/getUserInfo", (req, res) => {
  //获取用户名称
  let token = req.headers.authorization;
  let jwt = new JwtUtil(token);
  var $userId = jwt.verifyToken().data; // 此处的data为你登录时传入的key值
  var sql = "select * from user where " + "userId=?";
  pool.query(sql, [$userId], (err, result) => {
    if (err) throw err;
    if (result.length > 0) {
      res.send({ code: 200, data: result[0] });
    } else {
      res.send({ code: 400, msg: "获取资料失败" });
    }
  });
});

至此服务端token验证完成。

你可能感兴趣的:(node,token)