eggjs + crypto-js 的 DES 加密实现重置密码接口?

实现过程

1.安装 crypto-js

npm install crypto-js -S

在这里插入图片描述

2.路由层 router.js 添加路径

// 重置用户密码
router.post('/api/user/resetPassword', verify_token, controller.user.resetPassword);

3.控制层 user.js 添加方法

'use strict';
const Controller = require('egg').Controller;
const CryptoJS = require("crypto-js");

function DES_decrypt(decryptStr) {
  return CryptoJS.DES.decrypt(
    {
      ciphertext: CryptoJS.enc.Hex.parse(decryptStr)
    },
    CryptoJS.enc.Utf8.parse("ABF"),// keyHex
    { 
      mode: CryptoJS.mode.ECB, 
      padding: CryptoJS.pad.Pkcs7
    } // option
  ).toString(CryptoJS.enc.Utf8);
}

class UserController extends Controller {
  // 重置密码
  async resetPassword() {
    const { ctx, app } = this;
    try {
      // 0、获取用户输入的 oldPassword newPassword
      const { oldPassword, newPassword } = ctx.request.body;
      const old_password = DES_decrypt(oldPassword);
      const new_password = DES_decrypt(newPassword);
      console.log('解密--old-->', oldPassword, old_password)
      console.log('解密--new-->', newPassword, new_password)
      // 1、获取请求头 authorization 属性,值为 token
      const token = ctx.request.header.authorization;
      // 2、用 app.jwt.verify(token, app.config.jwt.secret),解析出 token 的值
      const decode = await app.jwt.verify(token, app.config.jwt.secret);
      // 3、校验是否 token 可以,需要在鉴权中间件里加返回
      if(!decode) return;
      // 4、根据用户名,在数据库查找相对应的id操作
      const userInfo = await ctx.service.user.getUserByName(decode.username);
      // 5、校验是否通过
      if (old_password !== userInfo.password) {
        ctx.body = {
          status: 400,
          desc: '原密码错误',
          data: null
        };
        return;
      }
      // 6、通过 service 方法 resetPassword 修改 password 信息
      const result = await ctx.service.user.resetPassword({
        ...userInfo,
        password: new_password
      });
      // 返回 token
      ctx.body = {
        status: 200,
        desc: '更新成功',
        data: null
      };
    } catch (error) {
      ctx.body = {
        status: 500,
        desc: '更新失败',
        data: null
      }
    }
  }
}

module.exports = UserController;

4.服务层 user.js 添加方法

// 重置密码
async resetPassword(params) {
  const { app } = this;
  try {
    // 通过 app.mysql.update 方法更新 user 表, 通过 id 筛选用户
    const result = await app.mysql.update('user', 
      { ...params }, 
      { id: params.id }
    );
    return result;
  } catch(error) {
    console.log(error);
    return null;
  }
}

5.测试接口

我们在apifox上面新增接口,然后进行测试

在这里插入图片描述

首先我们先登录拿到token,然后用 kaimo313 这个账号,密码是 123456。修改为 123.

先拿到 DES 加密字符串

'123': newPassword: "a50d7e4459c234f1" 
'123456': oldPassword: "d18bb870a7d5664f"

在这里插入图片描述

参考资料

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凯小默

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值