jwt实现生成token

token是后端进行加密后的产物主要用于登录,本文记载从安装到实现的全部过程。(个人记录)

一、安装jwt和OpenSSL

jwt是认证方式:

npm install jsonwebtoken

openssl是加密方式:

OpenSSL安装教程

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(折磨我一上午的报错)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值