当前位置: 首页 > news >正文

Node编写用户登录接口

目录

前言

服务器

编写登录接口API

使用sql语句查询数据库中是否有该用户

判断密码是否正确

生成JWT的Token字符串

配置解析token的中间件

配置捕获错误中间件

完整的登录接口代码


前言

本文介绍如何使用node编写登录接口以及解密生成token,如何编写注册接口已经在Node编写用户注册接口这篇文章中介绍,本文是建立在编写注册接口这篇文章的基础之上

同时也可以在在前端html页面中向服务器发送post登录请求这篇文章中了解登录请求

服务器

关于创建服务器,本文中和Node编写用户注册接口共用一个服务器,已经引入了router对象

// 导入express模块
const express = require('express')// 创建express服务器实例
const app = express()// 导入跨域cors
const cors = require('cors')// 全局挂载
app.use(cors())// 配置解析表单数据中间件
app.use(express.urlencoded({extended:false}))// 导入用户路由对象
const userRouter = require('./router/user')
app.use('/api',userRouter)// 启动服务器
app.listen(3007,()=> {console.log('running the http://127.0.0.1:3007');
})

编写登录接口API

使用sql语句查询数据库中是否有该用户
const userinfo = req.bodyconst sql = 'select * from ev_users where username = ?'db.query(sql, userinfo.username, function (err, results) {// 执行 SQL 语句失败if (err) {return res.send({status:1,message:err.message})}// 执行 SQL 语句成功,但是查询到数据条数不等于 1if (results.length !== 1) {return res.send({status:1,message:'登录失败'})}res.send('登录成功')})

使用postman模拟发送登录请求,查询是否有用户名为b

返回登录成功

数据库中有b用户

如果未注册

数据库中没有c用户

判断密码是否正确

调用了bcrypt.compareSync()方法,用来解密,因为在注册时已经把密码加密了,所以需要解密

bcrypt.compareSync(用户提交的密码,数据库中的密码)

// 判断密码是否正确const compareResult = bcrypt.compareSync(userinfo.password,results[0].password)if(!compareResult) return res.send({status:1,message:'密码错误'})res.send('登录成功')

验证b的密码是否正确

b的密码是000000

当把b的密码换成111111时,也就是错误密码

返回密码错误

生成JWT的Token字符串

关于JWT认证,可以浏览JWT认证这篇文章

生成token字符串时,要把密码和用户头像剔除,因为生成的token会保留在浏览器中,很容易泄露

// 剔除完毕之后,user 中只保留了用户的 id, username, nickname, email 这四个属性的值
const user = { ...results[0], password: '', user_pic: '' }

先安装jsonwebtoken

npm i jsonwebtoken

导入jwt

const jwt = require('jsonwebtoken')

导入成功后调用jwt.sign()生成JWT字符串

jwt.sign(用户的信息,加密的密钥,配置对象有效token的时间)

// 生成 Token 字符串const tokenStr = jwt.sign(user, jwtSecreKey, {expiresIn: '10h', // token 有效期为 10 个小时})

将生成的token字符串发送给客户端

在生成的的token字符串前拼接上"Bearer",固定用法

res.send({status: 0,message: '登录成功!',// 为了方便客户端使用 Token,在服务器端直接拼接上 Bearer 的前缀token: 'Bearer ' + tokenStr,})

使用postman模拟发送请求

配置解析token的中间件

将jwt字符串还原为JSON对象,在get请求时,可以获得用户信息

安装express-jwt

npm i express-jwt

导入

/ 导入解析token字符串
const exoressjwt = require('express-jwt')

解析token

// 使用 .unless({ path: [/^\/api\//] }) 指定哪些接口不需要进行 Token 的身份认证
app.use(expressjwt.expressjwt({secret:jwtSecreKey,algorithms:['HS256'],
}).unless({path:[/^\/api\//]}))
配置捕获错误中间件
// 错误中间件
app.use(function (err, req, res, next) {// 数据验证失败if (err instanceof joi.ValidationError) return res.send({status:1,message:err.message})// 捕获身份认证失败的错误if (err.name === 'UnauthorizedError') return res.send({satus:1,message:'身份认证失败'})// 未知错误res.send({status:1,message:err.message})})

完整的登录接口代码

// 导入express模块
const express = require('express')
// 导入数据库对象
const db = require('../db/index')// 导入加密模块
const bcrypt = require('bcryptjs')// 创建路由对象
const router = express.Router()// 导入JWT
const jwt = require('jsonwebtoken')
// 定义密钥
const jwtSecreKey = 'notbald'// 登录接口
router.post('/login',(req,res)=>{const userinfo = req.bodyconst sql = 'select * from ev_users where username = ?'db.query(sql, userinfo.username, function (err, results) {// 执行 SQL 语句失败if (err) {return res.send({status:1,message:err.message})}// 执行 SQL 语句成功,但是查询到数据条数不等于 1if (results.length !== 1) {return res.send({status:1,message:'登录失败'})}// 判断密码是否正确const compareResult = bcrypt.compareSync(userinfo.password,results[0].password)if(!compareResult) return res.send({status:1,message:'密码错误'})// 生成token字符串,展开运算符,剔除密码和用户头像const user = {...results[0],password:'',user_pic:''}// console.log(user);// 生成 Token 字符串const tokenStr = jwt.sign(user, jwtSecreKey, {expiresIn: '10h', // token 有效期为 10 个小时})res.send({status: 0,message: '登录成功!',// 为了方便客户端使用 Token,在服务器端直接拼接上 Bearer 的前缀token: 'Bearer ' + tokenStr,})})
})

解析token以及全局捕获错误中间件在服务器中

相关文章:

Node编写用户登录接口

目录 前言 服务器 编写登录接口API 使用sql语句查询数据库中是否有该用户 判断密码是否正确 生成JWT的Token字符串 配置解析token的中间件 配置捕获错误中间件 完整的登录接口代码 前言 本文介绍如何使用node编写登录接口以及解密生成token,如何编写注册接…...

vlookup函数踩坑(wps)

使用wps的朋友看过来 vlookup函数踩坑,vlookup(查找值,查找范围,返回值的索引,精确查找or模糊查找) 我们要查找的数据的那一列,必须是查找范围的第一列! 案例,看下面的…...

老卫带你学---leetcode刷题(8. 字符串转换整数 (atoi))

8. 字符串转换整数 (atoi) 问题: 请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C 中的 atoi 函数)。 函数 myAtoi(string s) 的算法如下: 读入字符串并丢弃无用的前导空…...

了解事件冒泡

事件冒泡是指在网页中,当某个元素触发了一个事件时,这个事件会逐级向上传播到它的父元素,直至达到文档树的根节点。这种传播方式被称为事件冒泡。 为什么会有事件冒泡? 事件冒泡是为了方便处理多个嵌套元素的事件而引入的机制。…...

线性代数1:线性方程和系统

Digital Collection (staedelmuseum.de) 图片来自施泰德博物馆 一、前言 通过这些文章,我希望巩固我对这些基本概念的理解,同时如果可能的话,通过我希望成为一种基于直觉的数学学习方法为其他人提供额外的清晰度。如果有任何错误或机会需要我…...

“第四十八天” 计算机组成原理

数据结构学完了,不过也就是匆匆过了一遍,后面肯定还是要重来的。现在开始学机组了。 计算机发展历程: 计算机硬件唯一能识别的数据是二进制的 0/1,而在计算机中用低/高电平表示 0 / 1,也就是通过电信号传递数据&#x…...

【算法|贪心算法系列No.4】leetcode55. 跳跃游戏 45. 跳跃游戏 II

个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【LeetCode】 🍔本专栏旨在提高自己算法能力的同时,记录一下自己的学习过程,希望…...

第九章 JDBC

文章目录 一. 单选题(共5题,50分)二. 判断题(共5题,50分) 一. 单选题(共5题,50分) (单选题) 下列选项,可用于存储结果集的对象是() A.…...

Kubernetes基础概念及架构和组件

目录 一、kubernetes简介 1、kubernetes的介绍与作用 2、为什么要用K8S? 二、kubernetes特性 1、自我修复 2、弹性伸缩 3、服务发现和负载均衡 4、自动发布(滚动发布/更新)和回滚 5、集中化配置管理和密钥管理 6、存储编排 7、任务批…...

04.Finetune vs. Prompt

目录 语言模型回顾大模型的两种路线专才通才二者的比较 专才养成记通才养成记Instruction LearningIn-context Learning 自动Prompt 部分截图来自原课程视频《2023李宏毅最新生成式AI教程》,B站自行搜索 语言模型回顾 GPT:文字接龙 How are __. Bert&a…...

UG NX二次开发(C#)-采用NXOpen完成对象的合并操作

文章目录 1、前言2、Ufun实现布尔和操作的函数2.1 函数说明2.2 源代码3、采用NXOpen实现布尔和操作的函数3.1 函数说明3.2 源代码4、测试结果4.1 采用UFun 与NXOpen的结果4.2采用UFun 与NXOpen的对比说明1、前言 在UG NX中开发过程中,创建特征对象的时候往往会用到布尔操作,…...

测开不得不会的python之re模块正则表达式匹配

学习目录 正则表达式介绍 正则表达式的常用符号 python的re模块 findall()函数 finditer()函数 match()函数 search()函数 split()函数 正则表达式的介绍 Python 通过标准库中的 re 模块来支持正则表达式。 正则表达式作为高级的文本模式匹配、抽取、和搜索。简单地说…...

selenium4 元素定位

selenium4 9种元素定位 ID driver.find_element(By.ID,"kw")NAME driver.find_element(By.NAME,"tj_settingicon")CLASS_NAME driver.find_element(By.CLASS_NAME,"ipt_rec")TAG_NAME driver.find_element(By.TAG_NAME,"area")LINK_T…...

sql高级教程-索引

文章目录 架构简介1.连接层2.服务层3.引擎层4.存储层 索引优化背景目的劣势分类基本语法索引结构和适用场景 性能分析MySq| Query Optimizerexplain 索引优化单表优化两表优化三表优化 索引失效原因 架构简介 1.连接层 最上层是一些客户端和连接服务,包含本地sock通…...

拼团小程序制作技巧大揭秘:零基础也能轻松掌握

随着拼团模式的日益流行,越来越多的商家和消费者开始关注拼团小程序的制作。对于没有技术背景的普通人来说,制作一个拼团小程序似乎是一项艰巨的任务。但实际上,选择一个简单易用的第三方平台或工具,可以轻松完成拼团小程序的制作…...

报错:The supplied javaHome seems to be invalid. I cannot find the java executable

AS 升级遇到的问题 问题 升级 Android Studio,碰到无法检测到 java The supplied javaHome seems to be invalid. I cannot find the java executable. Tried location: D:\Program Files\Android\Android Studio\jre\bin\java.exe 然后去网上找解决思路。 终于…...

关于 硬盘

关于 硬盘 1. 机械硬盘1.1 基本概念1.2 工作原理1.3 寻址方式1.4 磁盘磁记录方式 2. 固态硬盘2.1 基本概念2.2 工作原理 1. 机械硬盘 1.1 基本概念 机械硬盘即是传统普通硬盘,硬盘的物理结构一般由磁头与盘片、电动机、主控芯片与排线等部件组成。 所有的数据都是…...

Java反射实体组装SQL

之前在LIS.Core定义了实体特性,在LIS.Model给实体类加了表特性,属性特性,外键特性等。ORM要实现增删改查和查带外键的父表信息就需要解析Model的特性和实体信息组装SQL来供数据库驱动实现增删改查功能。 实现实体得到SQL的工具类&#xff0c…...

tensorrt安装使用教程

一般的深度学习项目,训练时为了加快速度,会使用多GPU分布式训练。但在部署推理时,为了降低成本,往往使用单个GPU机器甚至嵌入式平台(比如 NVIDIA Jetson)进行部署,部署端也要有与训练时相同的深…...

Java后端开发(十)-- idea(2022版)将 已push 的 远程仓库 的 多条commit记录 进行撤销

目录 1.多次 修改Test01类后,提交到本地仓库 。 2.多次重复 1 的步骤,多次commit成功后,在Git =》Log中会显示,commit记录...

零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?

一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)

HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

.Net框架,除了EF还有很多很多......

文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

Cesium1.95中高性能加载1500个点

一、基本方式&#xff1a; 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别

UnsatisfiedLinkError 在对接硬件设备中&#xff0c;我们会遇到使用 java 调用 dll文件 的情况&#xff0c;此时大概率出现UnsatisfiedLinkError链接错误&#xff0c;原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用&#xff0c;结果 dll 未实现 JNI 协…...

dedecms 织梦自定义表单留言增加ajax验证码功能

增加ajax功能模块&#xff0c;用户不点击提交按钮&#xff0c;只要输入框失去焦点&#xff0c;就会提前提示验证码是否正确。 一&#xff0c;模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...

渲染学进阶内容——模型

最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...

镜像里切换为普通用户

如果你登录远程虚拟机默认就是 root 用户&#xff0c;但你不希望用 root 权限运行 ns-3&#xff08;这是对的&#xff0c;ns3 工具会拒绝 root&#xff09;&#xff0c;你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案&#xff1a;创建非 roo…...

相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...

EtherNet/IP转DeviceNet协议网关详解

一&#xff0c;设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络&#xff0c;本网关连接到EtherNet/IP总线中做为从站使用&#xff0c;连接到DeviceNet总线中做为从站使用。 在自动…...