1 回答

TA貢獻1810條經驗 獲得超4個贊
解碼和獲取零件很容易。但這并不能確保令牌有效,這意味著令牌的所有者確實是名稱所說的!name
JWT 令牌僅包含標頭、有效負載和簽名部分的 base64 編碼形式,通過 .因此,只需將令牌拆分為 ,解碼 base64 字符串,您就可以使用 json。Unmarshal()
將標題和播放加載部分轉換為地圖或結構。.
.
您必須驗證簽名以確保名稱有效。如果您不執行簽名驗證,則令牌很容易被偽造為任何人。簽名驗證正是 JWT 庫所做的(除了解析和生成令牌)。如何做到這一點,檢查JWT庫的來源。我也相信有一些開源庫可以處理JWT令牌,這些令牌也可以與tiny-go一起使用。
用于解碼部件并打印的示例代碼:name
token := `eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c`
for i, part := range strings.Split(token, ".") {
fmt.Printf("[%d] part: %s\n", i, part)
decoded, err := base64.RawURLEncoding.DecodeString(part)
if err != nil {
panic(err)
}
fmt.Println("decoded:", string(decoded))
if i != 1 {
continue // i == 1 is the payload
}
var m map[string]interface{}
if err := json.Unmarshal(decoded, &m); err != nil {
fmt.Println("json decoding failed:", err)
continue
}
if name, ok := m["name"]; ok {
fmt.Println("name:", name)
}
}
哪些輸出(在Go游樂場上嘗試):
[0] part: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
decoded: {"alg":"HS256","typ":"JWT"}
[1] part: eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ
decoded: {"sub":"1234567890","name":"John Doe","iat":1516239022}
name: John Doe
[2] part: SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
decoded: I?J?IH?(]?O????~?:N?%_?u,×
- 1 回答
- 0 關注
- 124 瀏覽
添加回答
舉報