JWT认证机制(Node.js)
***jwt:全称jsonwebtoken***是一种身份认证机制,其基本原理图如下:
效果展示:
代码实现:
//导入express模块
const express = require('express')
//创建web服务器app
const app = express()
//解析body表单数据中间件
app.use(express.urlencoded({ extended: false }))
app.use(express.json())
//导入跨域中间件
const cors = require('cors')
app.use(cors())
//001,导入jwt中间件
const jwt = require('jsonwebtoken')//生成 JWT 字符串
const expressJWT = require('express-jwt')//将 JWT 字符串解析还原成 JSON 对象
const { use } = require('express/lib/router')
//002,创建密钥
const secretKey = 'secretKey'
//只要配置成功了 express-jwt 这个中间件,就可以把解析出来的用户信息,挂载到 req.user 属性上
app.use(expressJWT({ secret: secretKey }).unless({ path: [/^\/api\//,'test'] }))
//003,生成 JWT 字符串
app.post('/api/login', (req, res) => {
//判断用户是否登录成功
const userinfo = req.body
if(userinfo.username !== 'admin'||userinfo.password !== '00000')
{
return res.send({
status:400,
msg:'登录失败'
})
}
res.send({
status: 200,
message: '登录成功',
// jwt.sign() 生成 JWT 字符串
// 参数:用户信息对象、加密密钥、配置对象-token有效期
// 尽量不保存敏感信息,因此只有用户名,没有密码
token: jwt.sign({ username: userinfo.username }, secretKey, { expiresIn: '300s' })
})
})
//创建测试接口(有权限)
app.get('/test',(req,res)=>{
console.log(req.user);
res.send({
status:200,
msg:'登录成功',
token:req.user
})
})
//错误中间件的配置
app.use((err,req,res,next)=>{
if(err.name === 'UnauthorizedError')
{
return res.send({
status:1,
err:'UnauthorizedError'
})
}
res.send({
status:1,
err:'未知错误'
})
next()
})
//服务器启动
app.listen(8080, () => {
console.log('服务器成功启动');
})
具体实现步骤:
(1),导入jwt相关中间件
//001,导入jwt中间件
const jwt = require(‘jsonwebtoken’)//生成 JWT 字符串
const expressJWT = require(‘express-jwt’)//将 JWT 字符串解析还原成 JSON 对象
(2),创建密钥
//002,创建密钥
const secretKey = 'secretKey’
(3),利用expressJWT将解析出来的jwt串挂载到use上。
//只要配置成功了 express-jwt 这个中间件,
//就可以把解析出来的用户信息,挂载到
//req.user 属性上
app.use(expressJWT({ secret: secretKey })
.unless({ path: [/^\/api\//,'test'] }))
注意:.unless({path:[这里传一个匹配数组]}); 如[/^\/api\//,'test']
演示图:
(4),生成 JWT 字符串
(5),测试接口写法
注意:解析的jwt搭载到use上,所以要获取可以使用:req.user
(6),中间件的写法
中间件在之前的文章简单介绍,在这里不赘述。
补充说明:
小编:O_O