我正在尝试在MacOS上使用命令行工具创建JSON Web Token (JWT),但在签名部分遇到了问题。
我受到了这个代码片段的极大启发:https://gist.github.com/indrayam/dd47bf6eef849a57c07016c0036f5207
我的JWT包含:
{"alg":"HS256","typ":"JWT"}
负载:
{"email":"jordan@example.com"}
我的hmac密钥是:
bigsecretisveryhardtoguessbysneakypeopleright
或者以Base64编码:
Ymlnc2VjcmV0aXN2ZXJ5aGFyZHRvZ3Vlc3NieXNuZWFreXBlb3BsZXJpZ2h0Cg==
我在使用以下网站进行验证:https://jwt.io/
我发现如果我使用我的密钥的base64版本将所有内容输入到该网站中,它会生成以下JWT,成功地通过我正在测试的网站进行验证:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6ImpvcmRhbkBleGFtcGxlLmNvbSJ9.C3MVjfmnul8dLNIgiv6Dt3jSefD07Y0QtDrOZ5oYSXo
在Bash中,我尝试了以下内容:
jwt_header=$(echo -n '{"alg":"HS256","typ":"JWT"}' | base64 | sed s/\+/-/g | sed 's/\//_/g' | sed -E s/=+$//)
payload=$(echo -n '{"email":"jordan@example.com"}' | base64 | sed s/\+/-/g |sed 's/\//_/g' | sed -E s/=+$//)
hmac_signature=$(echo -n "${jwt_header}.${payload}" | openssl dgst -sha256 -hmac "${key}" -binary | openssl base64 -e -A | sed s/\+/-/g | sed 's/\//_/g' | sed -E s/=+$//)
jwt="${jwt_header}.${payload}.${hmac_signature}"
它产生了以下结果:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6ImpyZWVkQGV4dG9sZS5jb20ifQ.o426f0XDnsUwActVt14Cr3X3IUqPwfv6yaN5nRaZhew
这个网站不接受作为有效签名的东西。因此,我不确定在openssl命令中做错了什么,以致于没有获得一个有效的HS256签名。