万恶之源:
阿里云:基于JWT的token认证
有需求需要连接java服务器的API,对接的小伙伴给出的教程如上。

仔细看完大致流程是服务端生成JWK(当然也可以用https://mkjwk.org 在线生成),客户端自行添加载荷和头加密并签名生成token用以校验。
但是文中只提供了java实现(keypair还拼错了一次),无法作为nodejs的参考。

查看了下如何用nodejs做JWS,很多文章说使用jsonwebtoken可以轻松做到,
但是实测组件并不能直接使用上文提供的JWK(json格式),反正我生成的token不能用。

所以,需要先使用crypto提取并转换密钥格式,再使用jwt组件。

下面是代码:

const crypto = require("crypto");
const jwt = require("jsonwebtoken");

//jwt字段具体含义从文心一言获悉,我本人一窍不通
let jwk = {
    "p": "xxxxxxxxxxx",//用于加密的大素数因子
    "kty": "RSA",//加密算法
    "q": "xxxxxxxxxxx",//生成椭圆曲线公钥的公钥
    "d": "xxxxxxxxxxx",//私钥
    "e": "AQAB",//指数
    "use": "sig",//使用目的
    "kid": "xxxxxxxxxxx",//标识符
    "qi": "xxxxxxxxxxx",//生成椭圆曲线私钥的公钥指数
    "dp": "xxxxxxxxxxx",//生成椭圆曲线私钥的私钥指数
    "alg": "RS256",//加密算法
    "dq": "xxxxxxxxxxx",//生成椭圆曲线公钥的私钥
    "n": "xxxxxxxxxxx"//生成椭圆曲线公钥的模数
};
//获取到私钥
const privateKey = crypto.createPrivateKey({ key: jwk, format: "jwk" }).export({ type: "pkcs1", format: "pem" });
//填写载荷,这个需要和接收方拟定
const payload = {
        "jti": "xxxx",//jwt id 需要提供一个唯一ID
        "iat": 1701138864,//签发时间
        "exp": 1701182064,//过期时间
        "nbf": 1701138804,//生效时间
        "sub": "",//用户
        "aud": ""//接收者
    }
 const token = jwt.sign(payload, privateKey ,{
        algorithm:"RS256",
        header:{}
    });

按上面的文章提示,生成的token可以在https://jwt.io/ 在线校验合法性。
提示:最好找接收方要一份加密后的token,确定payload需要的字段

PS:旧版本nodejs的crypto组件(此前用的大版本是16)的createPrivateKey可能不支持jwk格式,更新到LTS(20.10.0)后可用


papermoon
6 声望0 粉丝