koa2 + JWT 实现登陆验证「终于解决」

koa2 + JWT 实现登陆验证「终于解决」jwt技术点实现的功能如下1、server端会在前端访问部分接口时做权限认证,server端会声明不需要jwt权限验证的接口,比如login登录接口,对于需要jwt权限验证的接口,如果前端无权限,则s

jwt技术点实现的功能如下

1、server端会在前端访问部分接口时做权限认证,server端会声明不需要jwt权限验证的接口,比如login登录接口,对于需要jwt权限验证的接口,如果前端无权限,则server端会返给前端401状态码
2、用户登录成功后,server端就会返回给前端一个加密了的有保质期的字符串,字符串中存储着用户登录的信息,这个字符串就是token,前端拥有未过期的token,就表明前端有访问有权限认证的接口的权限
3、接下来用户再发送网络请求调用server端接口时,就会携带token,用来表明自己的身份

koa-jwt的验证方式

请求头中设置 authorization为Bearer + token,Bearer后有空格
koa-jwt的默认验证方式:
{'authorization': "Bearer " + token}

koa-jwt 搭配 jsonwebtoken 的使用

1. 安装依赖

npm install jsonwebtoken koa-jwt --save

2. 密钥设置 

conf/db 文件中

let SECRET = 'blog-nodejs' // token 密钥module.exports = {
  SECRET
}

3. 中间件 请求验证token

app.js 文件中

// 导入
const koajwt = require('koa-jwt')
const { SECRET } = require('./conf/db')

// 中间件对token进行验证
app.use(async (ctx, next) => {
  return next().catch((err) => {
    if (err.status === 401) {
      ctx.body = new UnauthorizedModel()
    } else {
      throw err
    }
  })
})

4. 不需要验证的接口

app.js 文件中

app.use(koajwt({ secret: SECRET }).unless({
  path: [
    /^\/api\/login/, // 登陆接口
    /^\/api\/register/ // 注册
  ]
}))

5. 登陆签发token

登陆接口中

// 导入
const { SECRET } = require('../conf/db')
const jsonwebtoken = require('jsonwebtoken')

const res = await login(username, password)
// 登陆成功
if (res.username) {
  // 存储用户信息
  let info = {
    id: res.id,
    name: res.username,
    realname: res.realname,
  }

  let data = {
    Bearer: 'Bearer ',
    // 签发 token,1天
    token: jsonwebtoken.sign(
      info,
      SECRET,
      { expiresIn: '1d' }
    )
  }
  ctx.body = new SuccessModel(data, '登陆成功')
} else {
  ctx.body = new ErrorModel('用户名或密码错误')
}

6. 解密token, 获取个人信息

1\. 封装解密函数 payload.js 文件中

const { SECRET } = require('../conf/db')
const jsonwebtoken = require('jsonwebtoken')
const util = require('util')
// 将jwt.verify函数promise化
const verify = util.promisify(jsonwebtoken.verify)  

module.exports = async function getPayload (ctx) {
  const token = ctx.header.authorization
  const payload = await verify(token.split(' ')[1], SECRET)
  return payload
}

2\. 获取个人信息接口中

// 导入
const getPayload = require('../utils/payload')
// 获取
const payload = await getPayload(ctx)
console.log(payload)

前端:axios请求

axios.defaults.baseURL = 'http://localhost:8000'

axios.interceptors.request.use(config => {
  config.headers.Authorization = 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoiemhhbmdzYW4iLCJpYXQiOjE2MDA3MDAxOTYsImV4cCI6MTYwMDcwMzc5Nn0.6QDQto-bwYH27n_JgEzZv4BhVSvoKl_xi3xgQ-ZQdAs'
  return config
})

axios.get('/api/blog/list').then((res) => {
  console.log(res.data)
})

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/13238.html

(0)

相关推荐

  • 使用Float或Real数据类型的危险

    使用Float或Real数据类型的危险SQL Prompt根据数据库的对象名称、语法和代码片段自动进行检索,为用户提供合适的代码选择。自动脚本设置使代码简单易读–当开发者不大熟悉脚本时尤其有用。SQL Prompt安装即可使用,能大幅…

    2023-02-20
    145
  • Oracle字符集不匹配导入dmp文件报错「建议收藏」

    Oracle字符集不匹配导入dmp文件报错「建议收藏」在做文件迁移的时候在本地导出了一份dmp的备份文件,结果导入服务器的数据库的时候报错 这个时候我们可以执行以下sql查看一下服务器的数据库字符集是什么 select * from nls_databa

    2023-05-13
    139
  • 2021你集五福了吗?背后的Web3D引擎Oasis Engine正式开源!

    2021你集五福了吗?背后的Web3D引擎Oasis Engine正式开源!相信大家已经体验了今年支付宝五福的活动,无论是今年的五福首页还是打年兽游戏都是由蚂蚁互动图形引擎(代号:Oasis Engine)驱动的。 Oasis Engine 是蚂蚁集团 Web 3D 互动图形引擎,同时也是阿里巴巴互动技术方向的首选 Web 3D 引擎,已于 2 月 1…

    2023-11-11
    106
  • 同事想用递归,被我一个深度遍历打断施法「终于解决」

    同事想用递归,被我一个深度遍历打断施法「终于解决」本文会探索深度遍历思想在实际业务中的应用,使用栈管理数据,并一步步图解深度遍历中二叉树和栈的变化,相比于递归实现,代码复杂度和空间复杂度要低而且易于理解,减少栈溢出风险。

    2023-08-17
    110
  • Python模块:简化代码组织和可重用性

    Python模块:简化代码组织和可重用性Python 是一种非常强大和灵活的编程语言。

    2023-12-31
    150
  • 全面了解mysql锁机制(InnoDB)与问题排查「建议收藏」

    全面了解mysql锁机制(InnoDB)与问题排查「建议收藏」MySQL/InnoDB的加锁,一直是一个常见的话题。例如,数据库如果有高并发请求,如何保证数据完整性?产生死锁问题如何排查并解决?下面是不同锁等级的区别 表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高 ,并发度最低。 页面锁:开销和加锁时间界于表锁和行…

    2023-04-03
    128
  • 数据库自学笔记(1)-

    数据库自学笔记(1)-最近在自学看 数据库系统概论 这本书,总结一下遇到的问题。 1.广义笛卡尔积(Extende cartesian product): 属于 关系代数 里面的 传统的集合运算。其他的为union,exc

    2023-01-23
    146
  • sqlserver安装完成但失败_sql server 2008安装出现错误

    sqlserver安装完成但失败_sql server 2008安装出现错误最近安装SQL 2019遇到这个问题,试过网上几乎所有办法,都安装不上。最后在微软社区提问解决了,由于这个问题不常见,并且网上几乎没有正确的解决方案,因此将我的解决过程及经验记录分享一下,也为后来者提

    2023-05-09
    150

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注