解码JWTs的简单命令行功能

206 阅读1分钟

最近我遇到了很多JSON网络令牌(JWTs),我经常想用一种快速的方法来查看其中编码了哪些信息。一个简单的解决方案是访问jwt.io,它有一个交互式JWT解码器。然而,由于一些原因,我并不喜欢这种解决方案。

  1. 其中一些JWTs包含敏感信息。我不想把它们粘贴到一个可能被泄露(意外或其他)的网站。
  2. 访问一个网页,向下滚动,然后粘贴到一个文本框中,这可能很麻烦,尤其是我倾向于非常注重命令行。

简而言之,我想要一个简单的方法,从命令行中对JWT进行本地解码。我一直都是jq的粉丝,我想它可以做到这一点。我一般不关心签名的验证问题。我只想看到内容。

经过一些搜索和阅读文档,我写了一个简单的函数,并添加到我的~/.zshrc

jwt-decode() {
  jq -R 'split(".") |.[0:2] | map(@base64d) | map(fromjson)' <<< $1
}

我像这样使用它:

% jwt-decode eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
[  {    "alg": "HS256",    "typ": "JWT"  },  {    "sub": "1234567890",    "name": "John Doe",    "iat": 1516239022  }]

唯一的依赖是jq ,它很容易安装(例如Mac上的brew install jq )。这个命令在. ,对每一块进行base64解码,把它们解析成JSON,然后打印出来。