Express框架实现JWT

JWT

JSON Web Token是一个开放标准(RFC 7519),它定义了一种紧凑的、自包含的方式,用于作为JSON对象在各方之间安全地传输信息。该信息可以被验证和信任。
 
JWT由三部分组成
1.Header:由两部分组成:token的类型(“JWT”)和加密算法的名称(SHA256,RSA等)。
2.Payload:包含声明(要求)。声明是关于实体(通常是用户)和其他数据的声明。简单来说就是存储在token中用户自定义的数据。
3.Signature:密钥。
 

Express中生成JWT

首先安装第三方包 jsonwebtoken

npm install jsonwebtoken

然后下载Openssl
下载完成后打开输入

openssl genrsa -out rsa_private.pem  生成私钥
openssl rsa -in rsa_private.pem -pubout -out rsa_public.pem 生成公钥

(好像应该只需要私钥就行了
将私钥的文件即rsa_private.pem复制到项目文件中。
 
下面是生成jwt的代码

exports.createToken = (username, id) => {
    const private = fs.readFileSync(path.join(__dirname, '../secret/jwt.pem'))
    return jwt.sign({//首先是payload的模块,里面可以添加自己定义的字段,以便后续获得。
        id: id,
        username: username
    }, private, {//private就是密钥
        expiresIn: '1h',//此处为options 的设置。 可以指定加密算法(默认为RS256)和token持续时间。
        algorithm: 'RS256'
    })
}

此函数的返回内容为token
 

Express中进行鉴权

鉴权的操作在app.js中实现。
首先需要下载和引入express-jwt

npm install express-jwt

采用中间件的方式实现鉴权,代码如下

app.use(jwt({
    secret: fs.readFileSync(path.join(__dirname, './secret/jwt.pem')),
    algorithms: ['RS256'],
}).unless({path: ['/', '/login', '/register', /^\/questionnaires\/.*\/submit/, /^\/questionnaires\/.*\/write/]}))

secret中的文件仍为生成token时所用的密钥文件,
加密算法最好明确指定,不然有的可能会出错。
unless中的path为不需要进行鉴权的路由,同时支持正则路由(如示例中的路由分别为/questionnaires/:id/submit,/questionnaires/:id/write),需要注意的是正则路由不需要添加单引号,静态路由需要写单引号。

如下代码实现鉴权失败后统一返回的信息:

app.use(function (err, req, res, next) {
    if (err.name === 'UnauthorizedError') {
        res.status(403).send({
            code: 0,
            msg: "未验证身份"
        })
    }else {
        next()
    }
})

放置在鉴权操作的代码块下方。
 
此时前端需要进行请求时的token类型为Bearer Token,即在Headers中的Authorization内的值需要设置为 'Bearer '+token (Bearer后面有一空格)例如:Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjYwZTQ2MTdkZDZkOWM4MDlmNGQ4NmMzMyIsInVzZXJuYW1lIjoienoiLCJpYXQiOjE2MjU3NDg0NjksImV4cCI6MTYyNTc1MjA2OX0.WInO8cw_ImnDkoTV6YLwcC7ZUavzySDt-vN8fx1ozCrXKq_Vn1yP9wDIOVtPQehk7SmdnQF2Z6DvJrf0dij43FV3Nqem5TovzYa1qQBfGqi44qshLJQC3xH33KunQ5Lmf0oHiN_i-0NmEqNREbTBMIN8cBInMGPcRHf1XzAP1bk。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值