为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用小小令牌解码 JWT 令牌

如何使用小小令牌解码 JWT 令牌

Go
一只甜甜圈 2022-09-12 16:11:40
我们有一个需要解码的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
查看完整描述

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�IHNJ(]�O���lj~�:N�%_�u,×


查看完整回答
反对 回复 2022-09-12
  • 1 回答
  • 0 关注
  • 139 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号