我正在尝试使用终端/bash 脚本创建 JWT 令牌。我目前有
data=$encoded_header.$encoded_payload
signature=$(echo -n "$data" | openssl dgst -sha256 -hmac dummy_secret -binary | openssl base64 -e -A | tr -d '=')
其中数据将打印有效的标头和有效负载,通过
.
连接(这些值仅存储在脚本前面的变量中。标头和有效负载很好)
当我粘贴完整 jwt 令牌的输出时(这只是
$data.$signature
)示例输出:
eyJ0eXAiOiAiSldUIiwgImFsZyI6ICJIUzI1NiJ9Cg.eyJleHAiOiAxNzI0MDczMzI1LCAiaXNzIjogImR1bW15X2tleSJ9Cg./LI0Qs6U1p8x1zRFCwUe2kHW224L9js3fVW3UjpxO 70
进入 https://jwt.io/ 我收到以下错误:
警告:您的 JWT 签名似乎未使用 base64url 正确编码 (https://tools.ietf.org/html/rcfc4648#section-5)。请注意,填充(“=”必须被省略,按照https://tools.ietf.org/html/rcfc4648#section-2
我查看了一些 openssl 文档,并认为我做得正确,但是这个错误让我有不同的想法。有谁知道正确的 bash 脚本命令以便为此 JWT 标头和有效负载创建有效签名?
警告:您的 JWT 签名似乎未使用 base64url 正确编码 (
https://tools.ietf.org/html/rcfc4648#section-5)。请注意,填充(“=”必须被省略,按照https://tools.ietf.org/html/rcfc4648#section-2
这意味着您的令牌编码不正确。 JWT 需要进行 Base64Url 编码,但您刚刚创建了一个 Base64 编码的令牌并删除了填充。 您还需要将
Invalid Signature
替换为
+
,将 -
替换为 /
。_
第二个非常常见的问题是许多人忘记提供在 jwt.io 上验证签名所需的秘密或密钥。如果不知道秘密,就无法验证签名。
下面是使用对称密钥生成 JWT 的完整示例。您还可以测试签名验证。 :) 我也包括了 iat 时间。
signature=$(echo -n "$data" | openssl dgst -sha256 -hmac dummy_secret -binary | openssl base64 -e -A | sed s/\+/-/g | sed 's/\//_/g' | sed -E s/=+$//)
# Test the script by changing the secret and running the script
# secret='your-secret'