Koa数据验证和JWT实现

本文介绍了如何在Koa框架中使用express-validator和Joi进行数据验证,包括用户注册时的格式检查和邮箱唯一性验证。同时,文章详细讲解了JWT的使用,涉及token生成、验证以及在不同接口中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Koa数据验证和JWT实现

数据验证

在express 中可以使用 express-validator 的中间件去对数据进行格式验证处理,在koa 中我们可以使用 joi,其实这个无关框架,在express 中也是可以用的
尝试使用他来写一个 注册数据验证的中间件

const { User } = require('../model/index')
const Joi = require('joi')

module.exports.registerValidate = async (ctx, next) => {
  const schema = Joi.object({
    username: Joi.string().required(),
    password: Joi.string().min(6).required(),
    email: Joi.string().email().required(),
    phone: Joi.required()
  }).validate(ctx.request.body)

  if (schema.error) {
    ctx.throw(400, schema.error) // 直接向客户端抛出默认报错
  }

  const emailValidate = await User.findOne({email:ctx.request.body.email})
  
  if(emailValidate){
    ctx.throw(400,'邮箱已经被注册')
  }
  // console.log(schema);
  await next()
}

router/index.js

const { registerValidate, loginValidate } = require('../middleware/userValdate')
//...

router.post('/user/register', registerValidate, userController.register)

JWT

npm install jsonwebtoken
utils/jwt.js

const jwt = require('jsonwebtoken')
const { promisify } = require('util')
const tojwt = promisify(jwt.sign)
const verify = promisify(jwt.verify)

// 验证token 
module.exports.verifyToken = function (required = true) {
  return async (ctx, next) => {
    var token = ctx.headers.authorization
    token = token ? token.split("Bearer ")[1] : null
    if(token){
      try {
        var userInfo =  await verify(token,'koa-viode')
        ctx.user = userInfo
        await next()
      } catch (error) {
        ctx.throw(402,error)
      }
    }else if(required){
      ctx.throw(402,'无效的token')
    }else{
      await next()
    }
  }
}

// 生成token
module.exports.createToken = async userInfo => {
  var token = await tojwt({ userInfo }, 'koa-viode', {
    expiresIn: 60 * 60 * 24
  })
  return token
}

在登陆时创建token

const { User, Subscribe } = require('../model')
const { createToken } = require('../util/jwt')


// 用户登录
module.exports.login = async ctx => {
  var dbback = await User.findOne(ctx.request.body)
  if (!dbback) {
    return ctx.throw(402, "邮箱或者密码不正确")
  }
  var token = await createToken(dbback._doc)
  dbback._doc.token = token
  ctx.body = dbback._doc

}

在其他接口种验证token:

router/index.js

const { verifyToken } = require('../util/jwt')
//....

router.get('/user/getuser/:userid', verifyToken(false), userController.getuser)
router.get('/user/subscribe/:subscribeid', verifyToken(true), userController.subscribe)
router.get('/user/subscribelist', verifyToken(true), userController.subscribeList)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值