token是后端进行加密后的产物主要用于登录,本文记载从安装到实现的全部过程。(个人记录)
一、安装jwt和OpenSSL
jwt是认证方式:
npm install jsonwebtoken
openssl是加密方式:
生成秘钥和公钥
在安装好OpenSSL之后,打开文件夹中的bin,然后下载秘钥
genrsa -out rsa_private_key.pem 2048
下载公钥
rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem
秘钥是需要进行 pkcs8 编码,在刚才的命令面板中输入
pkcs8 -topk8 -in rsa_private_key.pem -out pkcs8_rsa_private_key.pem -nocrypt
最后将这三个文件CV到自己项目中即可
二、使用
创建一个新的js文件,cv进去就行
const fs = require('fs')
const path = require('path')
const jwt = require('jsonwebtoken')
const crypto = require('crypto');
class Jwt {
constructor(data) {
this.data = data
}
// 生成token
generateToken () {
let data = this.data
console.log("传过来的id",data)
let created = Math.floor(Date.now() / 1000)
//注意秘钥的地址是自己的实际地址
let cert = fs.readFileSync(path.join(__dirname, '../../confings/pkcs8_rsa_private_key.pem'))
//console.log('私钥?:',cert)
//let secretOrPrivateKey = cert
let token = jwt.sign({
data,
exp: created + 60 * 30,
},
cert,
{algorithm: 'RS256'})
//console.log("token",token)
return token
}
// 校验token
verifyToken() {
let token = this.data;
//注意rsa_public_key.pem的地址
let cert = fs.readFileSync(path.join(__dirname, '../../confings/rsa_public_key.pem'))
let res;
try {
let result = jwt.verify(token, cert,
{algorithms: ['RS256']}) || {}
let {exp = 0} = result, current = Math.floor(Date.now() / 1000)
if (current <= exp) {
res = result.data || {}
}
} catch (e) {
res = 'err'
}
return res
}
}
module.exports= Jwt
三,成果展示:
四:自己踩的坑
1.下载秘钥的时候一定要2048,1024的秘钥不能用;
2.生成token的秘钥一定要用编码过后的秘钥,用其他的秘钥会报错:secretOrPrivateKey must be an asymmetric key when using RSA(折磨我一上午的报错)