❤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:'用户注册成功,欢迎你去登陆!'});});}});
});
测试成功 ! 当用户注册成功的时候,用户应该去进行登陆!