[实现前后端分离]Node.js中使用JWT认证加密/解密

什么是JWT认证?

json web token

使用一段字符串,用来进行用户身份认证的凭证,该字符串分成三段分别是头部,载荷,签证

JWT认证原理

以用户登录为实例,客户端第一次请求服务器会携带用户名和密码,请求到达服务器之后首先验证用户名和密码是否正确

登录成功之后服务器需要做两件事情

1.将用户的信息经过加密生成Token字符串

2.将加密好的Token字符串响应给客户端

客户端获取到服务器响应回来的Token字符串存储到LocalStorage中,再次发送请求时,需要通过请求头的Authorization字段将Token发送给服务器

服务器拿到Token字符串之后再还原成用户的信息对象进行认证,用户认证成功之后,再把当前用户信息相应给客户端

JWT组成

JWT字符串由三部分组成,分别是头部,载荷,签证,这三部分使用英文状态下的”.”分隔

组成Token的字符串是经过加密的,其中第二部分载荷(Payload)才是存放有效信息的地方,例如存放用户信息

第一部分头部(Header)和第三部分签证(Signature)是为了增强Token的安全性所设置的

如何使用

安装包

//生成token的包
npm install jsonwebtoken
//解密token的包 版本有很大的区别,高版本可以查阅官方文档
npm i express-jwt@5.3.3

定义secret密钥,新建一个全局文件config.js,全局共享字符串

module.exports = {
//secretKey可以自己定义
    secretKey: 'Myki1ler!@!'
}

在路由中引入jwt和全局配置的密钥

const config = require('../config')

const jwt = require('jsonwebtoken')

在请求中使用jwt.sign生成密钥,建议将下方代码复制后格式化浏览


router.post('/login', (req, res) => {
    const userInfo = req.body
    if (userInfo.username !== 'admin' || userInfo.password !== '123') {
        return res.send({status: 1, msg: "用户名或密码错误"})
    }
//主要代码开始
    res.send({
        status: 0, msg: '登陆成功', token: jwt.sign({
//加密项
            username: userInfo.username
        }, 
//密钥
config.secretKey, {
            // Token有效期
            expiresIn: '1000s'
        })
    })
})

Apifox请求效果

JWT解密

在app.js中导入express-jwt的包

const expressJWT = require('express-jwt')
//使用app.use加上你配置的全局密钥 正则解释:以api开头的都不需要权限认证
//同样需要避坑 代码是按顺序执行的所有中间件要在路由前使用
app.use(expressJWT({secret: config.secretKey}).unless({path: [/^\/api\//]}))

express-jwt中间件配置成功之后,使用req.user对象访问从token字符串中解析出来的用户信息

注意:正常来说req中是没有user对象的,只有当expressJWT()中间件配置成功之后,req中才有了user对象,user对象中就包含了解析完成的用户信息

演示就直接在app.js中写入了

定义一个接口

app.get('/getData', (req, res) => {
    const userInfo = req.user
    res.send({
        status: 0,
        msg: '获取用户信息成功',
        data: userInfo
    })
})

测试

在apifox发起登录请求获取token

在Auth中设置BearerToken类型填写token测试

完结撒花🎉

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。
0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索