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。