❤Node10-登录注册接口

❤Node10-登录注册接口​

接下来我们在node 之中实现一个/api/login 登录接口,并且从数据库user表中校验用的账号和密码是否存在,存在返回token。

1、用户登录接口开发​

(1) 登录接口编写尝试​

接下来我们利用登录接口返回我们的token认证,我们做一个简单的模拟

javascript


// 用户登录接口
app.post('/api/login', (req, res) => {let query = 'SELECT * FROM user';// 登录失败if (req.body.username !== 'admin' && req.body.password !== '123456') {return res.send({status: '400',message: '登录失败'})}// 登录成功// 格式:jwt.sign({用户信息},密钥,token有效时长)var tokenStr = jwt.sign({ username: req.body.username }, secretKey, { expiresIn: '2h' })res.send({status: 200,message: '登录成功',token: tokenStr})
});

整个流程是这样子的:

vue

请求接口,开始认证是否在白名单中
在白名单中,进行账号密码判断
失败=》返回信息
正确=》 jwt注册账号名,然后加密以后返回token

当我们输入正确的账号密码时:

JS

{"status": 200,"message": "登录成功","token": "eyJXXXXXXXXXJ1c2VybmFtZSI6ImFkbW1uIiwiaWF0IjoxN"
}

错误时:

JS

{"status": 200,"message": "登录成功","token": "eyJXXXXXXXXXJ1c2VybmFtZSI6ImFkbW1uIiwiaWF0IjoxN"
}

js

{"status": "400","message": "登录失败"
}

这里遇到了一下小问题,写的判断居然市失效了,最后清理了一下缓存,重新优化一下判断

javascript

// 用户登录接口
app.post('/api/login', (req, res) => {// let query = 'SELECT * FROM user';console.log(req.body,'req');console.log(req.body.username == 'admin');console.log(req.body.password == '123456');if (req.body.username == 'admin' && req.body.password == '123456') {// 登录成功console.log(111);// 先制作jwt字符串 记住千万不要把密码加密到 token 字符串中,这样容易被人破解密码// 格式:jwt.sign({用户信息},密钥,token有效时长)var tokenStr = jwt.sign({ username: req.body.username }, secretKey, { expiresIn: '2h' })res.send({status: 200,message: '登录成功',token: tokenStr})}else{// 登录失败console.log(222);res.send({status: '400',message: '登录失败'})}
});

ok! 问题成功解决!到这里我们的登录接口就已经开发成功了!

(2)数据库调用尝试​

接下来我们先设置一个固定的账号密码进行一下调用尝试:

这里需要住的的是账号密码自己取的值部分从哪里来,一开始我经常混淆req.body和req.query的取值部分,这里可以都打印出来看看取值的部分,免得错误,然后怎么找也发现不了问题!

javascript

// 用户登录接口
app.post('/api/login', (req, res) => {// let query = 'SELECT * FROM user';console.log(req.body,'req');console.log(req.body.username == 'admin');console.log(req.body.password == '123456');if (req.body.username == 'admin' && req.body.password == '123456') {// 登录成功console.log(111);// 先制作jwt字符串 记住千万不要把密码加密到 token 字符串中,这样容易被人破解密码// 格式:jwt.sign({用户信息},密钥,token有效时长)var tokenStr = jwt.sign({username: req.body.username },secretKey, { expiresIn: '24h' })res.send({code: 200,message: '登录成功',token: tokenStr,})}else{// 登录失败console.log(222);res.send({code: '400',message: '账号不存在!'})}});

然后对返回结果进行查看,没问题:

JS

{"status": 200,"message": "登录成功","token": "eyJhbxxxXVCJ9.eyJ1c2VybmFtZSI6ImFkbW1uIiwiaWF0IjoxN"
}

(2)数据库匹配账号密码​

接下来从数据库里面查询我们的账号密码是否匹配

javascript

// 用户登录接口
app.post('/api/login', (req, res) => {// let query = 'SELECT * FROM user';// console.log(req.body,'req');// console.log(req.body.username == 'admin');// console.log(req.body.password == '123456');const { username, password } = req.body;// if (req.body.username == 'admin' && req.body.password == '123456') {}let sql='SELECT * FROM user WHERE username = ?';// 查询数据库中是否存在匹配的用户名connectionpool.query(sql,[username],(error, results) => {if (error) throw error;// 检查查询结果是否为空if (results.length === 0) {return res.status(401).json({ message: '用户名不存在' });}console.log(results[0].passward,'results-passward');console.log('password',password);// const user = results[0];if(results[0].passward==password){var tokenStr = jwt.sign({username: req.body.username },secretKey, { expiresIn: '24h' });console.log('登录成功');res.send({code: 200,message: '登录成功',token: tokenStr,})}else{console.log('登录失败',user.password,password);return res.status(401).json({ message: '密码不正确',code:401 });}}); 
});

成功时候给与我们的提示:

JS

{"status": 200,"message": "登录成功","token": "eyJhbxxxXVCJ9.eyJ1c2VybmFtZSI6ImFkbW1uIiwiaWF0IjoxN"
}

失败时候给与我们的提示:

JS

{"code": 500,"message": "密码不正确"
}

2、用户注册接口开发​

(1)接口开发和思考​

先起个名:(用户注册接口名称为)'/api/register'

思考

用户的注册其实本质上不就是新用户的增加吗,所以我们这里其实本质上也是直接对于用户的一个增加,这里我们只需要将用户增加的接口迁移过来即可
这里需要注意的点就是:我们在增加直接应该先去数据库里面看一下用户是否已经存在,如果存在的话,那我们就应该让用户重新拟定自己的昵称,避免和数据库之中的重复!

先来看看我们数据库的指令需要什么

javascript

// 查询用户 
SELECT * FROM user WHERE username = admin//添加用户 
INSERT INTO user (name,username, password,state) VALUES (?,?,?,1)

接下来我们开始写一个注册用户的接口

javascript

// 用户注册接口
app.post('/api/register', (req, res) => {console.log(req.body,'req');const { username, password } = req.body;let sql='SELECT * FROM user WHERE username = admin';// 查询数据库中是否存在匹配的用户名connectionpool.query(sql,[username],(error, results) => {// console.log(results,'查询结果!');if (error) throw error;const name=username;const values = [name,username, password];// 准备 SQL 插入语句const insertSql = ``;connectionpool.query(insertSql, values, (err, results) => {console.log(results,'results-插入结果!');if (err) {console.error('Error querying database:', err);res.status(500).json({ error: 'Internal server error' });}res.json({code: '200',);});}); 
});

(2)优化存在用户的情况​

完善添加一下是否添加的用户已经跟数据库里面的用户重复的情况

javascript

// 用户注册接口
app.post('/api/register', (req, res) => {console.log(req.body,'req');const { username, password } = req.body;let sql='SELECT * FROM user WHERE username = ?';// 查询数据库中是否存在匹配的用户名connectionpool.query(sql,[username],(error, results) => {// console.log(results,'查询结果!');if (error) throw error;// 检查查询结果是否为空if (results.length !== 0) {res.json({code: 401,data: results,message:'用户名已经存在!'});}else{const name=username;const values = [name,username, password];// 准备 SQL 插入语句const insertSql = `INSERT INTO user (name,username, password,state) VALUES (?,?,?,1)`;connectionpool.query(insertSql, values, (err, results) => {console.log(results,'results-插入结果!');if (err) {console.error('Error querying database:', err);res.status(500).json({ error: 'Internal server error' });return;}res.json({code: '200',data: results,message:'用户注册成功,欢迎你去登陆!'});});}}); 
});

测试成功 ! 当用户注册成功的时候,用户应该去进行登陆!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/148227.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

科研绘图系列:R语言ggplot2画热图(heatmap)

文章目录 介绍加载R包导入数据数据预处理画图导出数据系统信息介绍 热图(Heatmap)是一种数据可视化技术,它通过颜色的变化来表示数据的大小或者密度。热图通常用于展示两个变量之间的关系,或者在二维空间上展示数据的分布情况。以下是热图可以表示的一些内容: 数据分布:…

「C++系列」动态内存

【人工智能教程】,前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。 点击跳转到网站:【人工智能教程】 文章目录 一、动态内存1. 使用new和delete①分配单个对象②分配对象数组 2. …

python全栈学习记录(十七)logging、json与pickle、time与datatime、random

logging、json与pickle、time与datatime、random 文章目录 logging、json与pickle、time与datatime、random一、logging二.json与pickle三.time与datatime四.random 一、logging logging模块用来记录日志信息。 import logging # 进行基本的日志配置 logging.basicConfig( fi…

图文深入理解SQL语句的执行过程

List item 本文将深入介绍SQL语句的执行过程。 一.在RDBMS(关系型DB)中,看似很简单的一条已写入DB内存的SQL语句执行过程却非常复杂,也就是说,你执行了一条诸如select count(*) where id 001 from table_name的非常简…

[WMCTF2020]Make PHP Great Again 2.01

又是php代码审计,开始吧. 这不用审吧,啊喂. 意思就是我们要利用require_once()函数和传入的file的value去读取flag的内容.,貌似呢require_once()已经被用过一次了,直接读取还不行,看一下下面的知识点. require_once() require…

WebLogic 漏洞复现

1、后台弱⼝令GetShell 默认账号密码:weblogic/Oracle123 weblogic常⽤弱⼝令:https://cirt.net/passwords?criteriaweblogic 这⾥注意, 单个账号错误密码5次之后就会⾃动锁定。 http://47.121.212.195:7001/console 2、登录后台后&#…

恒生科指八连涨,汽车股强势

9月20日电 周五,港股三大股指集体收涨。恒生指数涨1.36%报18258.57点,连续第六个交易日上涨;恒生科技指数涨1.43%报3703.84点,连续第八个交易日上涨,创逾两个月来新高;恒生中国企业指数涨1.21%报6381.5点&a…

项目扩展五:交互式:command-line interface版本的实现

项目扩展五:command-line interface版本的实现 一、CLI交互的设计1.为何要设计这个CLI交互2.具体设计1.启动服务2.选择信道3.选择虚拟机4.正式业务注意:1.消费者与生产者跟信道的关系2.消息处理回调函数的问题3.消息确认的问题 5.其他功能1.打印功能2.查…

STM32精确控制步进电机

目的:学习使用STM32电机驱动器步进电机,进行电机运动精确控制。 测试环境: MCU主控芯片STM32F103RCT6 ;A4988步进电机驱动器模块;微型2相4线步进电机10mm丝杆滑台,金属丝杆安装有滑块。 10mm二相四线微型…

机器学习之非监督学习(二)异常检测(基于高斯概率密度)

机器学习之非监督学习(二)异常检测(基于高斯概率密度) 0. 文章传送1.案例引入2.高斯正态分布3.异常检测算法4.异常检测 vs 监督学习5.算法优化6.代码实现 0. 文章传送 机器学习之监督学习(一)线性回归、多…

C语言中数组和字符串的联系

一、C语言中,数组和字符串 1、C语言中,定义一个数组后,数组名保存的是这个数组的首地址。类似一个指向数组第一个元素的指针,但是这个指针不能重新指向。2、字符串在C语言中是通过字符数组来实现的,也就是说字符串还是…

【小沐学CAD】3ds Max常见操作汇总

文章目录 1、简介2、二次开发2.1 C 和 3ds Max C SDK2.2 NET 和 3ds Max .NET API2.3 3ds Max 中的 Python 脚本2.4 3ds Max 中的 MAXScript 脚本 3、快捷键3.1 3Dmax键快捷键命令——按字母排序3.2 3dmax快捷键命令——数字键3.3 3dmax功能键快捷键命令3.4 3Dmax常用快捷键——…

Elasticsearch 完整格式的 URL 进行分词,有什么好的解决方案吗?

1、问题描述 我想对完整格式的 url 进行分词,请问有什么好的解决方案吗? 比如:https://www.abc.com/any/path?param_1some&param-2other#title 看了官方的分词器,感觉没啥合适的? 预处理的话,又不知道该怎么处理…

Unity对象池的高级写法 (Plus优化版)

唐老师关于对物体分类的OOD的写法确实十分好,代码也耦合度也低,但是我有个简单的写法同样能实现一样的效果,所以我就充分发挥了一下主观能动性 相较于基本功能,这一版做出了如下改动 1.限制了对象池最大数量,多出来的…

C++11 可变的模板参数

前言 本期我们接着继续介绍C11的新特性,本期我们介绍的这个新特性是很多人都感觉抽象的语法!它就是可变的模板参数! 目录 前言 一、可变的模板参数 1.1可变的参数列表 1.2可变的参数包 1.3可变参数包的解析 • 递归展开解析 • 逗号…

微服务Docker相关指令

1、拉取容器到镜像仓库 docker pull xxx //拉取指令到 镜像仓库 例如 docker pull mysql 、docker pull nginx docker images //查看镜像仓库 2、删除资源 2.1、删除镜像仓库中的资源 docker rmi mysql:latest //删除方式一:格式 docker rmi 要…

【解密 Kotlin 扩展函数】扩展函数的创建(十六)

导读大纲 1.1 为第三方的类添加方法: 扩展函数 1.1 为第三方的类添加方法: 扩展函数 Kotlin 的主题之一是与现有代码的平滑集成 即使是纯 Kotlin 项目,也是构建在 Java 库之上的 如 JDK、Android 框架和其他第三方框架 而当你将 Kotlin 集成到 Java 项目中时 你还要处理尚未或不…

python爬虫:将知乎专栏文章转为pdf

欢迎关注本人的知乎主页~ 实现思路 用户输入专栏ID: 代码首先提示用户输入一个知乎专栏的ID,默认值为 c_1747690982282477569。输入的ID用于构建API请求的URL。 发送HTTP请求: 使用 requests.get() 向知乎API发送GET请求,获取指定…

【QGIS入门实战精品教程】6.1:QGIS根据属性条件查询数据(SQL表达式)

文章目录 一、字段过滤二、高级过滤(表达式)一、字段过滤 对于单个字段的查询,可以采用字段过滤,例如,从县区数据中,根据NAME字段,查找出县级市玉门市。操作为:右键县区→打开属性表: 点击左下角,选择name字段。 输入玉门市,回车,选择查找除的属性表记录,此时图斑…

【Linux】入门【更详细,带实操】

Linux全套讲解系列,参考视频-B站韩顺平,本文的讲解更为详细 目录 1、课程内容 2、应用领域 3、概述 4、 Linux和Unix 5、VMware15.5和CentOS7.6安装 6、网络连接三种方式 7、虚拟机克隆 8、虚拟机快照 9、虚拟机迁移删除 10、vmtools 11、目录…