zoukankan      html  css  js  c++  java
  • egg-jwt登录验证生成token

    egg-jwt 是一个生成token的插件
    token的规则:
    服务器返回的token数据基本结构是 Header.Payload.Signature, header、payload、signature三部分以'.'隔开。
    例如:
    1
    2
    3
    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);
      })
     
  • 相关阅读:
    菜单按钮及导航
    实现点击箭头切换图片页和相册滚动
    网页设计的基本原则
    网格系统
    表单系列2
    类与对象学习总结
    汉诺塔的最简的步骤思路
    3.31作业解答
    初学java 用if语句做几个小程序
    做三个java初期学习的练习Var1~3为头目标
  • 原文地址:https://www.cnblogs.com/lguow/p/13753908.html
Copyright © 2011-2022 走看看