万恶之源:
阿里云:基于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)后可用
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。