如何用jq从JSON中的JWT令牌提取声明并替换原令牌?
使用jq提取JWT声明并替换原令牌字段
你可以通过以下jq命令实现需求,核心思路是拆分JWT、解码中间的声明部分,再将声明合并到原JSON对象并移除原token字段:
( .token | split(".")[1] # 拆分JWT,取出中间的声明部分 | gsub("-";"+") | gsub("_";"/") # 将Base64URL编码转换为标准Base64 | (4 - (length % 4)) % 4 as $pad # 计算需要补充的等号数量(Base64长度需为4的倍数) | . + ("=" * $pad) # 补全Base64填充符 | @base64d # Base64解码为字符串 | fromjson # 转换为JSON对象 ) as $claims # 将解码后的声明存入变量$claims | del(.token) + $claims # 删除原token字段,合并声明到原对象
示例验证
输入JSON:
{ "id": 7, "time": "now", "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoiYm9iYnkiLCJjb2xvciI6ImJsdWUiLCJ0cmVlIjoiZWxtIn0K.9JCVXpkI6ICc5RnIsIiN1IzUIJiOicGbhJye" }
执行命令后输出:
{ "id": 7, "time": "now", "name": "bobby", "color": "blue", "tree": "elm" }
步骤说明
- 拆分JWT:通过
split(".")将令牌拆分为头部、声明、签名三个部分,取索引为1的中间部分。 - 编码转换:JWT使用Base64URL编码,需替换特殊字符为标准Base64的对应字符。
- 补全填充符:标准Base64要求长度为4的倍数,计算并补充缺失的
=。 - 解码与转JSON:将处理后的Base64字符串解码为JSON格式的声明对象。
- 合并对象:删除原token字段,将声明对象的键值对合并到原JSON中。
内容的提问来源于stack exchange,提问作者David Conrad
相关产品推荐
相关产品推荐

