首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用TinyGo解码JWT令牌

如何用TinyGo解码JWT令牌
EN

Stack Overflow用户
提问于 2021-06-28 09:38:25
回答 1查看 719关注 0票数 3

我们有一个JWT令牌,我们需要解码,问题是我们使用的是TinyGo,有些库是不支持,对于已经被支持的TinyGo / core库,如何实现呢?我想打印“名称”值:

我不知道名字,知道吗?

代码语言:javascript
复制
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)

}

解码令牌是:

代码语言:javascript
复制
PAYLOAD
{
  "sub": "1234567890",
  "name": "John Doe",
  "iat": 1516239022
}

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-06-28 10:09:25

解码和获取name部件是很容易的。,但这并不能确保令牌是有效的,这意味着令牌的所有者才是真正的名称!

JWT令牌只包含与.连接的头部、有效载荷和签名部分的base64编码形式。因此,只需通过.拆分令牌,解码base64字符串,您就可以使用json.Unmarshal()将标头和播放部分转换为映射或结构。

您必须验证签名以确保名称是有效的。如果您不执行签名验证,令牌可能很容易被伪造成任何人。签名验证正是JWT所做的(除了解析和生成令牌)。如何做到这一点,检查JWT库的源代码。我还相信,有一些开源库可以处理JWT令牌,这些标记也可以与微型go一起工作。

解码部件并打印name的示例代码

代码语言:javascript
复制
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)
    }
}

哪个输出(在围棋游乐场上尝试):

代码语言:javascript
复制
[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,×
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68161012

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档