jwt认证
代码思路 :
- 客户端 —— 提交账号密码
- 服务端 —— 验证账号密码
- 密码通过 —— 用户信息加密为Token
- 客户端 —— Token存储到本地
- 客户端 —— 再次请求
- 请求头 —— Token发送到服务端
- 服务端 —— 解密Token还原用户信息
- 身份证成功 !
- 服务端 —— 用户对应的页面内容响应到浏览器
代码准备 :
api测试工具(例如:Apifox)
jwt替换包
-
express-jwt
-
express-unless
-
async
-
lodash.set
代码示例 :
/*
jsonwebtoken : 作用生成JWT字符串(在服务器中将用户的信息转成JWT字符串)
express-jwt : 将JWT字符串解析还原成JSON对象(从客户端保留的JWT加密字段 使用此包将用户的信息还原成真正的用户信息)
*/
const express = require('express')
const app = express()
const jwt = require('jsonwebtoken') // 生成JWT
const express_jwt = require('express-jwt') // 解析JWT
const cors = require('cors')
app.use(cors())
// 解析post表单数据的中间件
const body_parser = require('body-parser')
app.use(body_parser.urlencoded({ extended: false }))
// 自定义加密
const secret_key = 'Lock Jwt =.='
app.use(express_jwt({ secret: secret_key }).unless({ path: [/^\/api\//] }))
// API:登录界面
app.post('/api/login', function (req, res) {
const user = req.body
// 自定义 用户名和密码
const my_name = 'admin'
const my_password = '123456'
if (user.username === my_name && user.password === my_password) {
// jwt.sign 生成 JWT字符串 / expiresIn 有效期60秒
const token_str = jwt.sign({ username: user.username }, secret_key, { expiresIn: '60s' })
return res.send({
status: 200,
message: 'Loging Success !',
token: token_str
})
} else {
return res.send({
status: 400,
message: 'Loging Fail !'
})
}
})
// API:Token测试
app.get('/admin/getinfo', function (req, res) {
// req.user 获取用户信息
res.send({
status: 200,
message: 'Get user information success !',
data: req.user
})
})
// 使用全局错误处理中间件,捕获解析JWT失败后产生的错误
app.use((err, req, res, next) => {
console.log(res.data)
if (err.name === 'UnauthorizedError') {
return res.send({
status: 401,
message: 'Invalid Token: ' + err.message,
})
}
res.send({
status: 500,
message: "I don't know this error,so your have to solution to this problem at url:https://www.baidu.com/"
})
})
// 运行
app.listen(80, () => {
console.log('Title:Jwt Test\nHost:http://127.0.0.1\nPort:80')
});
代码运行 :
1.开启服务
2.输入用户名和密码
3.输入Token进行认证
提示 :Bearer+空格+Token字符串
session认证