Koa 用户登录与 Token 验证教程

387 阅读2分钟

Koa 用户登录与 Token 验证教程

本节课我们将深入学习如何在 Koa 框架中实现用户登录与 Token 验证。通过本教程,您将掌握如何使用 JWT 实现安全的用户身份验证。

环境配置

首先,确保您已安装以下工具和依赖:

  • Node.js
  • Koa
  • Mongoose
  • JSON Web Token (jsonwebtoken)
  • Joi
npm install koa koa-router mongoose jsonwebtoken joi

项目结构

项目结构如下:

project/
│
├── model/
│   ├── index.js
│   ├── userModel.js
│   ├── videoModel.js
│   ├── subscribeModel.js
│   ├── videoCommentModel.js
│   ├── videoLikeModel.js
│   ├── collectModel.js
│
├── util/
│   ├── jwt.js
│
├── validator/
│   ├── userValidate.js
│
├── controller/
│   ├── userController.js
│
└── router/
    ├── index.js

从之前的express项目复制并导出 Mongoose 模型

model/index.js 中导出模型:

module.exports = {
  User: mongoose.model('User', require('./userModel')),
  Video: mongoose.model('Video', require('./videoModel')),
  Subscribe: mongoose.model('Subscribe', require('./subscribeModel')),
  VideoComment: mongoose.model('VideoComment', require('./videoCommentModel')),
  VideoLike: mongoose.model('VideoLike', require('./videoLikeModel')),
  collectModel: mongoose.model('CollectModel', require('./collectModel'))
}

增加登录接口的校验

validator/userValidate.js 中增加登录校验:

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

module.exports.loginValidate = async (ctx, next) => {
  const schema = Joi.object({
    password: Joi.string().min(6).required(),
    email: Joi.string().email().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, '邮箱未被注册');
  }
  
  await next();
}

使用 JSON Web Token 实现登录

安装 jsonwebtoken 依赖:

npm i jsonwebtoken

创建 util/jwt.js 文件:

const jwt = require('jsonwebtoken');
const { promisify } = require('util');
const toJwt = promisify(jwt.sign);
const toVerify = promisify(jwt.verify);

module.exports.createToken = async userInfo => {
  return await toJwt({ userInfo }, 'koa-video', { expiresIn: '24h' });
}

module.exports.verifyToken = async token => {
  return await toVerify(token, 'koa-video');
}

在用户控制器中增加登录功能

controller/userController.js 中增加登录方法:

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

module.exports.login = async ctx => {
  const { email, password } = ctx.request.body;
  const user = await User.findOne({ email, password });
  
  if (!user) {
    ctx.throw(402, '邮箱或者密码不正确');
  }
  
  const token = await createToken({ id: user._id });
  ctx.body = { ...user._doc, token };
}

路由设置

router/index.js 中增加登录和验证 Token 的路由:

const Router = require('koa-router');
const { login } = require('../controller/userController');
const { loginValidate } = require('../validator/userValidate');
const { verifyToken } = require('../util/jwt');

const router = new Router();

router.post('/user/login', loginValidate, login);
router.get('/user/getUser', verifyToken(true), async ctx => {
  ctx.body = ctx.user;
});

module.exports = router;

总结

通过以上步骤,您已经成功在 Koa 项目中实现了用户登录和 Token 验证功能。我们使用 JWT 提供了安全的用户认证机制,并通过 Koa 的中间件体系结构实现了简洁明了的代码结构。