zoukankan      html  css  js  c++  java
  • 使用EggJS开发接口(三)登录验证之egg-jwt 及 crypto加密

    egg-jwt 是一个生成token的插件
    token的规则:
    服务器返回的token数据基本结构是 Header.Payload.Signature, header、payload、signature三部分以'.'隔开。
    例如:
    eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
    eyJ1c2VyTmFtZSI6ImNlc2hpemhhbmdodTAyIiwiaWF0IjoxNTU1MjEyMzg1LCJleHAiOjE1NTUyMTU5ODV9.
    K53kd6cERhp6H4mtd8jCzA2bQtJTsdA2Kh3hzbXMXbU
    
    header: 一个json对象,描述JWT的元数据
    payload: 一个 JSON 对象,用来存放实际需要传递的数据
    signature: 对header和payload两部分的签名,防止数据被篡改
    安装:
    npm i egg-jwt --save
    // 或
    yarn add egg-jwt
    
    导入到egg项目里:
    // 在config/plugin.js里面添加
    exports.jwt = {
      enable: true,
      package: 'egg-jwt',
    },
    // 或者,在config/plugin.js的module.exports里面添加
    jwt: {
      enable: true,
      package: 'egg-jwt',
    },
    
    配置:
    // 在config/config.default.js的module.exports里面添加
    config.jwt = {
      secret: '123456',
    };
    
    通过 jwt 生成 token:
    app/controller/user.js
    // 登录
    async login() {
      const { ctx, app } = this;
      // post请求传来的参数
      const { name } = ctx.request.body;
      // 判断数据库里面是否存在该用户
      const user = await ctx.service.user.login(name);
    
      if(user){
        // 用户存在,生成token
        const token = app.jwt.sign({
          name: user.name,
        }, app.config.jwt.secret);
    
        ctx.body = {
          code: 200,
          message: '登录成功',
          data: { id: user.id },
          token
        }
      }
    }
    
    配置需要鉴权(校验token)的路由
    app/router.js
    'use strict';
    
    /**
     * @param {Egg.Application} app - egg application
     */
    module.exports = app => {
      const { router, controller, jwt } = app;
      router.post('/user/register', controller.user.register);
      router.post('/user/login', controller.user.login);
      // 添加日志 需要鉴权
      router.post('/diary/add', jwt, controller.diary.add);
    };
    

    前端页面调用方式更改:

    // 新增日志
    axios.post('http://127.0.0.1:7001/diary/add', fieldsValue)
      .then((res) => {
        const { data } = res;
        if(data.code === 200){
          message.success(data.message || '操作成功');
        }else{
          message.error(data.message || '操作失败');
        }
      })
      .catch((err) => {
        console.log(err);
      })
    

    改为

    // 添加日志
    let token = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoiMTIzIiwiaWF0IjoxNTgzODM5NDk5fQ.aqKI-IN9Os0v197FMKLoJzihg7UrjgMS1s-cWWt7KSM';
    
    axios({
      method: 'post',
      url: 'http://127.0.0.1:7001/diary/add',
      data: fieldsValue,
      headers: {
        Authorization: `Bearer ${token}`
      }
    })
      .then((res) => {
        const { data } = res;
        if(data.code === 200){
          message.success(data.message || '操作成功');
        }else{
          message.error(data.message || '操作失败');
        }
      })
      .catch((err) => {
        console.log(err);
      })
    

    注:密码的md5加密及验证

    引用:crypto 已存在,不需要再次安装

    const crypto = require('crypto');
    

    加密:password 需要加密的内容

    password = crypto.createHash('md5').update(password).digest('hex');
    

    封装:

    app/service/user.js

    // 专门对数据进行md5加密的方法,输入明文返回密文
    getMd5Data(data) {
      return crypto.createHash('md5').update(data).digest('hex');
    }
    

    .

      

  • 相关阅读:
    【solr专题之三】Solr常见异常
    python清除数据库错误日志
    【LeetCode OJ 136】Single Number
    ZOJ 1649 Rescue(有敌人迷宫BFS)
    HDU 1885
    hdu 2594 Simpsons’ Hidden Talents
    _DataStructure_C_Impl:链串
    Errors occurred during the build. Errors running builder 'Integrated External Tool Builder' on proje
    logo切图大小相应的尺寸
    再记作品展
  • 原文地址:https://www.cnblogs.com/crazycode2/p/12445934.html
Copyright © 2011-2022 走看看