eggjs 怎么使用 egg-jwt 进行用户鉴权实现登录功能?

Posted 凯小默

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了eggjs 怎么使用 egg-jwt 进行用户鉴权实现登录功能?相关的知识,希望对你有一定的参考价值。

鉴权过程

在实现登录接口时,我们先了解一下大致的鉴权过程:

  1. 用户输入账号密码调用登录接口发起请求
  2. 服务端通过 egg-jwt 插件,结合自定义的加密字符串,生成一个 token 令牌
  3. 然后,接口响应返回 token
  4. 网页端获取到 token 之后,需要将其存在浏览器本地
  5. 之后每次发起请求,无论是获取数据,还是提交数据,都需要将 token 带上,用来标识
  6. 比如发起接口请求账单数据
  7. 服务端通过 egg-jwt 插件解密 token
  8. 解密之后就可以拿到用户信息,从而去查找用户的账单数据
  9. 然后,接口响应返回对应的账单数据

准备 egg-jwt 插件

安装 egg-jwt 插件

npm i egg-jwt -S

使用方法可以参考:https://github.com/okoala/egg-jwt#readme

配置 egg-jwt 插件

1、在 config/plugin.js 下添加插件:

jwt: 
  enable: true,
  package: 'egg-jwt'

2、在 config/config.default.js 下添加自定义加密字符串

  // jwt 配置
  config.jwt = 
    secret: 'kaimo313', // 自定义加密字符串,secret 是在服务端的,不要泄露
  ;

实现登录接口

1、简单逻辑校验

/controller/user.js 下新建 login 方法,需要判断有没有该用户;找到用户,判断密码是否输入正确

// 登录
async login() 
  try 
    const  ctx, app  = this;
    // 获取登录时的 username, password
    const  username, password  = ctx.request.body;
    // 根据用户名,在数据库查找相对应的id操作
    const userInfo = await ctx.service.user.getUserByName(username);
    // 1、没找到说明没有该用户
    if (!userInfo || !userInfo.id) 
      ctx.body = 
        status: 500,
        desc: '账号不存在',
        data: null
      
      return
    
    // 2、找到用户,并且判断输入密码与数据库中用户密码
    if (userInfo && password != userInfo.password) 
      ctx.body = 
        status: 500,
        desc: '账号密码错误',
        data: null
      
      return
    
   catch (error) 
    ctx.body = 
      status: 500,
      desc: '登录失败',
      data: null
    
  

2、egg-jwt 怎么生成 token

github 网站 https://github.com/okoala/egg-jwt,找到 How To Create A Token

生成 token 之后,在返回给客户端

const token = app.jwt.sign(
  id: userInfo.id,
  username: userInfo.username,
  exp: Math.floor(Date.now() / 1000) + (24 * 60 * 60) // token 有效期为 24 小时
, app.config.jwt.secret);
// 返回 token
ctx.body = 
  status: 200,
  desc: '登录成功',
  data:  token 
;

3、添加登录路由

在路由 router.js 脚本中添加:

'use strict';

/**
 * @param Egg.Application app - egg application
 */
module.exports = app => 
  const  router, controller  = app;
  // 注册路由
  router.post('/api/user/register', controller.user.register);
  // 登录路由
  router.post('/api/user/login', controller.user.login);
;

4、测试登录接口

用 Postman 去测试一下接口是否可行,这里我才用 Apifox 去测试,后面我在单独出一篇介绍一下怎么用 Apifox 生成接口文档。如果登录接口调用成功,效果如下:


    "status": 200,
    "desc": "登录成功",
    "data": 
        "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6NSwidXNlcm5hbWUiOiJrYWltbzMxMyIsImV4cCI6MTY0MjU5NTc2MywiaWF0IjoxNjQyNTA5MzYzfQ.BZuaRvEU7_SuqtMU8OtR5fRsa5QSSm0x26i4ZfWwGO0"
    

以上是关于eggjs 怎么使用 egg-jwt 进行用户鉴权实现登录功能?的主要内容,如果未能解决你的问题,请参考以下文章

eggjs 怎么使用 egg-jwt 实现登录验证中间件?

eggjs 怎么实现获取用户信息接口?

一篇文章教你如何使用egg-jwt生成jwt+校验+错误拦截+设置过期时间

eggjs 怎么实现更新用户信息接口去更新个性签名?

eggjs 怎么实现用户注册功能?

eggjs 里链接 mysql 返回数据有 RowDataPacket 应该怎么处理?