首先安装jsonwebtoken,命令:npm i jsonwebtoken --save
代码如下所示:
const fs = require('fs') // 文件模块
const path = require('path') // 路径模块
const jwt = require('jsonwebtoken') // 引入jsonwebtoken模块
class Jwt {
// 获取调用方法的传值
constructor(data) {
this.data = data
}
// 生成token
generateToken () {
let data = this.data
// 获取时间转成时间戳
let created = new Date().getTime()
// 私钥,引入生成的私钥
let cert = fs.readFileSync(path.join(__dirname, '/rsa_private_key.pem'))
let token = jwt.sign({
token :data,
validityTime: created + 3000000,// 自定义token 的有效时间
}, cert, { algorithm: 'RS256' })
return token
}
// 校验token
verifyToken () {
const token = this.data;
// 公钥
const cert = fs.readFileSync(path.join(__dirname, '/rsa_public_key.pem'))
try {
// 解密生成的token
const result = jwt.verify(token, cert, { algorithms: ['RS256'] }) || {}
// 获取生成token的时间
const { validityTime, token } = result
// 获取当前时间
const current = new Date().getTime()
// 判断是否失效
if (current <= validityTime) {
return {
status: 200,
token
}
} else {
return {
status: 403,
msg: 'token失效'
}
}
} catch (err) {
return {
status: 400,
msg: '请填写正确的token'
}
}
}
}
私钥和公钥的生成
为了增加密钥的复杂性,我使用了RSA256加密jwt,借助openssl来创建RSA256密钥对:方法如下:
先下载安装openssl,链接参考
打开openssl.exe
生成私钥的命令:genrsa -out private.pem 2048
公钥生成的命令:rsa -in private.pem -inform pem -out public.key -outform der -pubout
在这里是提供的私钥是:
-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgQDEFsVzaDaAACpuzaxeLxLsSIwZZitsWDFsUB3W6e917NBQYoT0
IcBd5ftaXvlEK8uPFz/x9rFjxJJwHXtE06W+YNB5w/HIdrZTj/dNH/zDrXge+PXs
hQ1igJ9CSypDdbo4rxYXjiDopVsJLkKCxmW7lcY6mhZNIY1RxkDcHqW2kQIDAQAB
AoGAA0Ihm85SgYP/MIIoaBQ+K0D1WwKwnAdHIvad2FFg0kPSHlPUw72/1Y+ZwqGr
YK+dnU4UmO+xeOfuSwCiaL1flqfHdey1xipkI7yn3Z0oH4+yQ922JHqnchxBw/ut
ElYtaNkysPnL75g1dEOkL9aCJmNz9s3mpihOgVuMUThpyTUCQQD3nfA4rs+ZppF5
xCbX052y80NMbL9A4cwtaJ7WyqXuX1TDXjawFxMrVvXi54D4aE/5PcnKp2Eg8Rwu
4R6KrbgrAkEAyro/OB1jjNQEqXO7jRmzEVzDOznpJDehrb9lwqRBUdEg5fMTw7r9
pBVcJWbiJAgF6n76IKnpqXm7VpGhqsUSMwJBAOOoA9o5bojXydxn6UZ5Ov3yBifX
u6cNckk1bQQR4KjeYPIWRrVzIZ6xHvR03/CDBzQiCMsXRIei5cR8GTZrLW0CQCGA
MZ5GTQMirjqKY33nt02xNJn+8eYIQ3GA5YIKvriUhIk7aBK6Pdv1o6qSm+A0azXb
Ed5/9ZsKAMlHe53Kvz0CQA5A2iSUvyGkb5z/TEwTXUoiGTYPzEqOJxTiLZuDy15A
DXwpqpfZX6Rf1izaj8iX0fo5A8ziZ4JEz/1uu6Kq4Ag=
-----END RSA PRIVATE KEY-----
在这里提供的公钥是:
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDEFsVzaDaAACpuzaxeLxLsSIwZ
ZitsWDFsUB3W6e917NBQYoT0IcBd5ftaXvlEK8uPFz/x9rFjxJJwHXtE06W+YNB5
w/HIdrZTj/dNH/zDrXge+PXshQ1igJ9CSypDdbo4rxYXjiDopVsJLkKCxmW7lcY6
mhZNIY1RxkDcHqW2kQIDAQAB
-----END PUBLIC KEY-----