我有以下 JWT 有效負(fù)載:?{"exp": 4724377561}(100 年后的某個日期)在 Go 中對其進(jìn)行編碼會產(chǎn)生ewogICAiZXhwIjogNDcyNDM3NzU2MQp9?使用jwt.io 的編碼,但eyJleHAiOjQ3MjQzNzc1NjF9在簽名時會產(chǎn)生不同的簽名。我在測試裝置中使用 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貢獻(xiàn)1951條經(jīng)驗 獲得超3個贊
區(qū)別僅在于庫在應(yīng)用 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}
第二個輸出符合您的預(yù)期。要刪除 Go 中無關(guān)緊要的空格,請使用json.Compact。

動漫人物
TA貢獻(xiàn)1815條經(jīng)驗 獲得超10個贊
ewogICAiZXhwIjogNDcyNDM3NzU2MQp9
被解碼為
{ "exp":?4724377561 }
而 jwt.io 字符串被解碼為
{"exp":4724377561}
- 2 回答
- 0 關(guān)注
- 162 瀏覽
添加回答
舉報
0/150
提交
取消