❤Nodejs 第十章(用户信息token登录使用和开发)
1、安装
安装jsonwebtoken和express-jwt第三方包
yarn add jsonwebtoken express-jwt --save
2、创建一个基本的服务器
//导入express
const express = require('express')
//创建服务器对象
const app = express()
//启动服务器
app.listen(8888,function(){
console.log('express server running at http://127.0.0.1:8888')
})
3、导入 jsonwebtoken 和 express-jwt 第三方包
//身份认证部分包
import jwt from 'jsonwebtoken' // 1.导入jsonwebtoken生成 jwt 字符串的包
import expressJWT from 'express-jwt' // 2.导入将客户端发送过来的 JWT 字符串,解析还原成 JSON 对象的包
4、创建一个密钥
const secretKey = 'aflowerdemon is No1 ^_^' //密钥里边的字符可以自定义
注册将客户端发送过来的 jwt 字符串,解析还原成 JSON 对象的中间件 express-jwt
注意:
1.这边将jwt字符串解析出来的信息会被挂载到req.user属性上,可以通过req.user属性获取到信息。
2.下边的unless({path[]})中是不需要 token访问权限的路径。
3. 这边注意一下,你的登录请求路径,放一定在unless({path[]})中,让它无需token权限,否则你会一直请求失败(这个坑我踩过)如下边代码所示:
5、定义接口认证和接口白名单
path之中是不需要进行token认证的接口
// token认证
app.use(
expressJWT.expressjwt({ secret: secretKey, algorithms: ["HS256"] }).unless({
// path: [/^\/api\//],
path: [
'/',
'/api/login',
'/api/register',
'/api/resetPwd'
]
})
);
接下来我们尝试访问用户接口
告诉我们没有授权访问信息
我们简单写一个白名单中的登录接口如下:
// 用户登录接口
app.post('/api/login', (req, res) => {
let query = 'SELECT * FROM user';
connectionpool.query(query, (err, results) => {
console.log(err,'err');
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 ? results[0] : {},
});
});
});
访问一下试试
返回的结果如下图所示:可以看出我们的接口可以正常访问
不在白名单的接口是无法进行访问的,访问就是未授权!
5、登录接口
接下来我们利用登录接口返回我们的token认证,我们做一个简单的模拟
// 用户登录接口
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
})
});
整个流程是这样子的:
请求接口,开始认证是否在白名单中
在白名单中,进行账号密码判断
失败=》返回信息
正确=》 jwt注册账号名,然后加密以后返回token
当我们输入正确的账号密码时:
错误时:
这里遇到了一下小问题,写的判断居然市失效了,最后清理了一下缓存,重新优化一下判断
// 用户登录接口
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! 问题成功解决!