3

我们有一个需要解码的 JWT 令牌,问题是我们正在使用TinyGo并且某些库不受支持,对于已经支持的 TinyGo / 核心 Go 库如何处理?我想打印“名称”值:

我无法得到名字,知道吗?

func main() {
    token := `eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c`
    base64String := base64.StdEncoding.EncodeToString([]byte(token))
    decodedData, err := base64.StdEncoding.DecodeString(base64String)
    if err != nil {
        panic(err)
    }

    name := decodedData["name"]

    fmt.Println(name)

}

解码后的令牌是:

PAYLOAD
{
  "sub": "1234567890",
  "name": "John Doe",
  "iat": 1516239022
}

请参阅此示例令牌https://jwt.io

4

1 回答 1

3

解码和获取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 Playground上尝试):

[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�IHNJ(]�O���lj~�:N�%_�u,×
于 2021-06-28T10:09:25.630 回答