NodeJS分别实现token、cookie登录注册鉴权(KOA2)

发布时间 2023-09-28 17:15:50作者: 漫思

源码

https://github.com/NaCl-131/node-study.git

npm install koa
npm i nodemon -D # 保存自动更新
npm i koa-router # 路由
npm i koa-body #解析post的传参
npm i mysql2 sequelize #mysql和一个ORM工具
npm i jsonwebtoken #JWT
npm i dotenv #.env文件
npm i koa-session #session

token

入口

main.js引入:

const koa = require('koa');
const app = new koa();
const koaBody = require("koa-body");
app.use(koaBody())
const router = require("../src/router/user.route")

app.listen(8080, () => {
})

app.use(router.routes())

 

路由引入:

const Router = require('koa-router')
const {
    register,
    login
} = require('../sequelize/controller/user.controller')
const {
    userDelete
} = require("../sequelize/controller/other.controller");
const router = new Router();
// const router = new Router({ prefix: '/users' })
// 注册接口
router.post('/register', register)
// 登录接口
router.post('/login', login)

module.exports = router

操作

创建三个文件:controller,model,service。
分别作用是进行主要操作,数据库管理,进行数据库操作。
控制层:

const {
  createUser,
  UserExistJudge,
  UserPasswordJudge
} = require('../service/user.service')
class UserController {
  async register(ctx, next) {
    // 1. 获取数据
    // console.log(ctx.request.body)
    const {
      user_name,
      password
    } = JSON.parse(ctx.request.body)
    // 2. 操作数据库
    const isUserExist = await UserExistJudge(user_name)
    if (isUserExist) {
      ctx.body = {
        code: 0,
        message: '用户名已存在',
        result: {},
      }
    } else {
      const res = await createUser(user_name, password);
      ctx.body = {
        code: 0,
        message: '用户注册成功',
        result: {
          id: res.id,
          user_name: res.user_name,
        },
      }
    }

  }
  async login(ctx, next) {
    const {
      user_name,
      password
    } = JSON.parse(ctx.request.body)
    const isUserExist = await UserExistJudge(user_name);
    if (isUserExist) {
      //登录成功
      let UserInfo = await UserPasswordJudge(user_name, password);
      if (UserInfo.UserPasswordTrue) {
        ctx.body = {
          code: 0,
          message: '登录成功!',
          result: {
            id: UserInfo.id,
            user_name: UserInfo.user_name,
            token: UserInfo.token
          },
        }
      } else {
        ctx.body = {
          code: 0,
          message: '密码错误!',
          result: {},
        }
      }

    } else {
      ctx.body = {
        code: 0,
        message: '用户名不存在!',
        result: {},
      }
    }

  }
}
module.exports = new UserController()

服务层:

const User = require('../model/user');
const jwt = require('jsonwebtoken');
const {
  TOKEN_SECRET
} = require('../../config/config.default')
class UserService {
  // 插入用户数据
  async createUser(user_name, password) {
    // 插入数据
    const res = await User.create({
      // 表的字段
      user_name: user_name,
      password: password
    })
    console.log(res)
    return res.dataValues
  }
  // 判断用户是否存在
  async UserExistJudge(user_name) {
    const res = await User.findAll({
      where: {
        user_name: user_name
      }
    })
    if (res.length !== 0) {
      return true;
    } //用户名存在
    else return false; //不存在
  }
  // 判断用户密码
  async UserPasswordJudge(user_name, password) {
    const user = await User.findAll({
      where: {
        user_name
      }
    })
    const token = await getToken({
      user_name,
     // password,密码不要放进token
      is_admin: user[0].is_admin
    })
    return {
      UserPasswordTrue: user[0].password === password,
      user_name: user[0].user_name,
      id: user[0].id,
      token: token
    }
  }
  //验证用户token
  async tokenVerify(token) {
    return jwt.verify(token, TOKEN_SECRET);
  }
}
let getToken = async (body) => {
  const token = jwt.sign(body, TOKEN_SECRET);
  return token;
}
module.exports = new UserService()

数据库:

const {
  DataTypes
} = require('sequelize')
const seq = require('../line')
// 创建模型(Model zd_user -> 表 zd_users)
const User = seq.define('zd_user', {
  // id 会被sequelize自动创建, 管理
  user_name: {
    type: DataTypes.STRING,
    allowNull: false,
    unique: true,
    comment: '用户名, 唯一',
  },
  password: {
    type: DataTypes.CHAR(64),
    allowNull: false,
    comment: '密码',
  },
  is_admin: {
    type: DataTypes.BOOLEAN,
    allowNull: false,
    defaultValue: 0,
    comment: '是否为管理员, 0: 不是管理员(默认); 1: 是管理员',
  },
})
// 强制同步数据库(创建数据表)
// User.sync({ force: true })
module.exports = User

 

效果:

注册:

在这里插入图片描述

 登录:

在这里插入图片描述

cookie

入口

在main.js引入session中间件:

const CONFIG = require('../src/config/Cookie.config')
const app = new koa();
app.keys = ['KEYFORSESSION'];
app.use(session({
    key: 'SESSIONID', //cookie key 
    //这是session的配置文件,其他配置项可以查找koa-session的官网
}, app));

 

操作

登录实现session绑定到cookie:

ctx.session.user_name = UserInfo.user_name;
//这里只需要在登录操作验证完账号密码后,使用ctx.session.xxx绑定
//你想绑定的字段即可(不要有敏感信息)

 

登录后的其他操作,可以使用中间件做拦截:

const user_name =ctx.session.user_name 
//koa-session把原生cookie的操作已经封装好了,不需要去get或set
//对得到的用户信息进行验证即可

效果

在这里插入图片描述