首页 > 编程语言 >NodeJS分别实现token、cookie登录注册鉴权(KOA2)

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

时间:2023-09-28 17:23:53浏览次数:38  
标签:const name NodeJS require ctx token cookie user

源码

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
//对得到的用户信息进行验证即可

效果

在这里插入图片描述

 

标签:const,name,NodeJS,require,ctx,token,cookie,user
From: https://www.cnblogs.com/sexintercourse/p/17736197.html

相关文章

  • nodejs学习01-安装
    参考:nodeJS压缩版安装与配置 注意:最新版本不支持win7有问题,我win7用的 node-v11.15.0-win-x86历史版本下载:https://registry.npmmirror.com/binary.html?path=node/......
  • 有人说SaToken吃相难看,你怎么看。
    前言今天摸鱼逛知乎,偶然看到了一个回答,8月份的,是关于SaToken的,一时好奇就点了进去。好家伙,因为一个star的问题,提问的人抱怨了许多,我有些意外,就仔细看了下面的评论,想知道一部分人的看法。案发现场大体上,分为两派。一派是对于强制star尤为反感,乃至因爱生恨(打个问号)?......
  • Spring Security 基于 JWT Token 的接口安全控制
    现在的网站开发,基本上都是前后端分离,后端提供api接口并进行权限控制。使用SpringSecurity框架可以大大简化权限控制的代码实现。对于后端接口而言,为了能够实现多节点负载均衡部署,更好的方案是不再使用Session了,绝大多数情况下,通过提交JWTToken来进行身份认证。本篇博客......
  • 【项目心得】在nest中使用fastify-cookie
    包安装确保你在nest项目中安装了 fastify, @fastify/cookie, @nestjs/platform-fastify 等包npmifastify@fastify/cookie@nestjs/platform-fastify fastify的引入和fastify-cookie的注册src/main.tsasyncfunctionbootstrap(){constlogger:Logger=new......
  • 关于JWT Token 自动续期的解决方案
    前言在前后端分离的开发模式下,前端用户登录成功后后端服务会给用户颁发一个jwttoken。前端(如vue)在接收到jwttoken后会将token存储到LocalStorage中。后续每次请求都会将此token放在请求头中传递到后端服务,后端服务会有一个过滤器对token进行拦截校验,校验token是否过期,如果t......
  • Angular APP_INITIALIZER Injection Token 的使用方法介绍
    import{APP_INITIALIZER}from'@angular/core'这行代码在Angular中的作用是导入名为APP_INITIALIZER的常量,它来自Angular核心模块@angular/core。APP_INITIALIZER是一个重要的Angular特性,它用于执行一系列初始化操作,通常用于配置应用程序之前执行一些必要的任务。......
  • 什么是 JSON Web Token
    JSONWebToken(JWT),又称为JSON令牌,是一种用于在网络应用之间安全地传输信息的开放标准(RFC7519)。它采用了一种紧凑的、自包含的方式来表示信息,通常用于身份验证和授权。JWT的设计目标是确保信息的完整性和安全性,同时具备易于使用和传输的特点。JWT的结构JWT由三个部分组成,它们之......
  • Angular 应用开发中 Injection Token 的使用方法介绍
    Angular是一个流行的前端JavaScript框架,它提供了一种强大的方式来构建单页应用程序(SPA)。在Angular中,依赖注入(DependencyInjection,DI)是一项关键的功能,它允许我们有效地管理应用程序中的依赖关系。Angular的依赖注入系统使用InjectionToken来实现某些特殊的依赖注入需求。在本文中,......
  • kubepi加入集群,生成token
    防丢失https://www.cnblogs.com/Chinori/p/17506348.html kubectlcreatesakubepi-user--namespacekube-systemkubectlcreateclusterrolebindingkubepi-user--clusterrole=cluster-admin--serviceaccount=kube-system:kubepi-userkubectl-nkube-systemcreatetoke......
  • Cookie和Session的区别
    在工作中,我们经常会遇到Cookie和Session这两个概念。对于它们的区别,也是面试中被问到的高频题目。因此,在本文中将简要介绍一下Cookie和Session之间的区别。 存储位置:Cookie存储在客户端(浏览器),而Session存储在服务器端。 安全性:cookie不是很安全,别人可以分析存放在本地的cook......