zoukankan      html  css  js  c++  java
  • egg.js jwt 几步实现加解密

    1. 安装

    npm install --save egg-cors egg-jwt

    2. 配置

    // config/config.default.js
    config.jwt = { secret: '123456', enable: true, // default is false match: '/jwt', // optional expiresIn: '24h', }; // 安全配置 (https://eggjs.org/zh-cn/core/security.html config.security = { csrf: { enable: false, ignoreJSON: true, }, domainWhiteList: [ 'http://localhost:8080' ], // 允许访问接口的白名单 }; // 跨域配置 config.cors = { origin: '*', allowMethods: 'GET,HEAD,PUT,POST,DELETE,PATCH', };

    3. 路由

    'use strict';
    
    module.exports = app => {
      const { router, controller: { login }, middleware } = app;
      const jwt = middleware.jwtCheck(app.config.jwt);
    
      router.post(`login`, login.index); // 登录得到 token 等用户信息
      router.get(`login/test`, jwt, login.test); // 解码验证
    };

    4. 登录得到 token 等用户信息

    请求(post):http://localhost:7001/login

    // controller/login.js
    'use strict';
    
    const Controller = require('../core/baseController');
    class HomeController extends Controller {
    
      // 登录,验证,成功发token
      async index() {
        const { ctx, app } = this;
        const req = ctx.request.body;
        const errArr = app.validator.validate({
          username: 'string',
          password: 'string',
        }, req);
    
        if (errArr) { // 非空验证
          this.$error(JSON.stringify(errArr));
          return;
        }
    
        try {
          // 查库验证
          const data = await ctx.model.User.findAll({ where: req });
    
          if (data.length > 0) {
    
            const user = data[0];
            const { jwt: { secret, expiresIn } } = app.config;
            // 需传 secret 过期时间
            const token = app.jwt.sign({
              id: user.id,
            }, secret, {
              expiresIn,
            });
    
            this.$success({ token, user });
    
          } else {
            this.$error('用户名或密码不正确');
          }
        } catch (err) {
          this.$error(err);
        }
    
      }
    
      async test() {
        const { ctx } = this;
        ctx.body = { code: 201, msg: '验证成功', data: ctx.state.user };
        console.log('
    
     user +++', ctx.state.user);
      }
    
    }
    
    module.exports = HomeController;

    5. 解码验证

    请求(get):http://localhost:7001/login/test

    // middleware/jwtCheck.js
    '
    use strict'; module.exports = options => { return async function jwtErr(ctx, next) { const headerStr = ctx.request.header.authorization; if (headerStr) { try { // 解码token,需传加密时的 secret const decode = ctx.app.jwt.verify(headerStr, options.secret); ctx.state.user = decode; // 信息存一下,这步很重要,业务里要用 await next(); } catch (error) { ctx.status = 401; // 翻译错误码 let message = error.message; ctx.body = { code: -1, msg: message, }; return; } } else { ctx.status = 401; ctx.body = { code: -1, msg: 'no header token', }; return; } }; };

    以上几步,用 egg-jwt  实现登录获取 token ,然后传 token 验证身份,并存在 ctx.state.user  为后面业务里用

    .

  • 相关阅读:
    Passbook教程中生成pass时遇到的“Couldn't find a passTypeIdentifier in the pass”
    几个app maker的网站
    forever start Error: Cannot find module './daemon.v0.10.26'
    [Effective Objective-C 读书笔记] 第1章 几条基本写法 (2~5条)
    在linux环境下配置node:node + npm + forever
    [技术翻译] 构建现代化的Objective-C (下)
    [技术翻译]构建现代化的 Objective-C (上)
    NSDate与 NSString 、long long类型的相互转化
    Java对象的序列化与反序列化:默认格式及JSON格式(使用jackson)
    基本网络请求
  • 原文地址:https://www.cnblogs.com/xiangsj/p/13614556.html
Copyright © 2011-2022 走看看