背景
在开发过程中,经常会遇见用jwt加密的接口,这类接口在使用apipost、postman这类接口工具调用的时候,很麻烦,需要弄一个鉴权token,而且这类token都是有时效性的,每次都需要新生成一个,我是一个效率很高的人(想偷懒),每次生成token太麻烦了,效率太低受不了,我就弄了下面的js脚本。(先上代码为敬)
// 默认15min过期
var key = "asdfghj1234567jhgfdssdfg";
var secret = "jhgfdsdfghj765432345t6yuhgf";
function base64url(source) {
// 编码源数据
var encodedSource = CryptoJS.enc.Base64.stringify(source);
// 移除特殊符号相关, 以及使用-替换+, 使用_替换/
encodedSource = encodedSource.replace(/=+$/, '');
encodedSource = encodedSource.replace(/\+/g, '-');
encodedSource = encodedSource.replace(/\//g, '_');
return encodedSource;
}
// jwt header
let header = JSON.stringify({
"alg": "HS256",
"typ": "JWT"
});
var signHeader = base64url(CryptoJS.enc.Utf8.parse(header));
//jwt payload 一般需要验证的东西都是放在下面参数的某些
//iss jwt签发者
//sub jwt所面向的用户
//aud 接收jwt的一方
//exp jwt的过期时间,这个过期时间必须要大于签发时间
//nbf 定义在什么时间之前,该jwt都是不可用的
//iat jwt的签发时间
//jti jwt的唯一身份标识,主要用来作为一次性token,从而回避重放攻击
let payload = JSON.stringify({
"iss": key,
// 开始时间
"iat": Math.floor(Date.now() / 1000),
// 过期时间 15min过期
"exp": Math.floor(Date.now() / 1000) + 15 * 60
});
var signPayload = base64url(CryptoJS.enc.Utf8.parse(payload));
// jwt signature = header + payload
var signSignature = signHeader + "." + signPayload;
var signature = base64url(CryptoJS.HmacSHA256(signSignature, secret));
// jwt token = head + payload + signature
var token = signSignature + "." + signature;
简单使用
至于这个脚本怎么用,我使用的是apipost(当时嫌弃postman英文的),我在生成jwt token之后会加上一句apt.variables.set("jwttoken", token);
,然后再把这个脚本放到apipost接口参数栏的“预执行脚本”里面(直接copy进去),这个语句的作用就是把生成jwt token放到“jwttoken”这个环境变量里面,然后在参数栏的“认证”选择bearer auth认证,里面的值输入{{jwttoken}},然后就正常调用接口就行。
简单说明
- 上面的jwt token 是用js语言生成的,在使用的时候注意CryptoJS类库的引用。
- 这个用js生成的jwt token是直接弄好了的,一般你修改payload里面的参数就行,代码里面也有备注。
- 如果是postman的话,
apt.variables.set("jwttoken", token);
,这句里面的apt换成postman就行,应该是这样的,作者不是一个勤劳的人,不想再下一个postman试了,凑合着看看,或者百度一下也行。
看到这里,想必“码友”也是一个爱偷懒效率却很高的人,点个赞呗!😜