我有以下 JWT 有效负载: {"exp": 4724377561}(100 年后的某个日期)在 Go 中对其进行编码会产生ewogICAiZXhwIjogNDcyNDM3NzU2MQp9 使用jwt.io 的编码,但eyJleHAiOjQ3MjQzNzc1NjF9在签名时会产生不同的签名。我在测试装置中使用 jwt.io 的签名。我不想使用第 3 方 JWT 工具,以保持我的依赖性较小。我怀疑某种字符编码是这里的问题。为了保持测试的可读性,我在装置中使用纯文本 JSON。我使用测试装置的方式如下(省略其他测试用例):import ( "encoding/base64" "reflect" "testing")var testData = []struct { name string header string payload string signature string pass bool errorType reflect.Type}{{ name: "Succeed if token not expired", header: `{"typ":"JWT","alg":"HS256"}`, payload: `{"exp": 4724377561}`, signature: "JHtMKvPSMa5BD22BsbxiP1-ELRh1XkIKkarRSev0ZjU", pass: true,}}func TestParseJwt(t *testing.T) { HmacSecret = []byte("My super secret key") for _, tst := range testData { jwt64 := base64.RawURLEncoding.EncodeToString([]byte(tst.header)) + "." + base64.RawURLEncoding.EncodeToString([]byte(tst.payload)) + "." + tst.signature _, err := ParseJwt(jwt64) if tst.pass { if err != nil { t.Fatal(tst.name, err) } } else { // If an error was expected to be thrown, assert that it is the correct one. if reflect.TypeOf(err).String() != tst.errorType.String() { t.Fatal(tst.name, err) } } }}
2 回答
饮歌长啸
TA贡献1951条经验 获得超3个赞
区别仅在于库在应用 Base64 编码之前“压缩”JSON。
看这个例子:
ss := []string{
`{"exp": 4724377561}`,
`{"exp":4724377561}`,
}
for _, s := range ss {
fmt.Println(base64.RawURLEncoding.EncodeToString([]byte(s)), s)
}
输出(在Go Playground上尝试):
eyJleHAiOiA0NzI0Mzc3NTYxfQ {"exp": 4724377561}
eyJleHAiOjQ3MjQzNzc1NjF9 {"exp":4724377561}
第二个输出符合您的预期。要删除 Go 中无关紧要的空格,请使用json.Compact。
动漫人物
TA贡献1815条经验 获得超10个赞
ewogICAiZXhwIjogNDcyNDM3NzU2MQp9
被解码为
{ "exp": 4724377561 }
而 jwt.io 字符串被解码为
{"exp":4724377561}
- 2 回答
- 0 关注
- 120 浏览
添加回答
举报
0/150
提交
取消