登录
首页 >  Golang >  Go问答

在Go/Golang中生成JWT负载时的base64编码结果不一致

来源:stackoverflow

时间:2024-03-08 21:09:33 151浏览 收藏

偷偷努力,悄无声息地变强,然后惊艳所有人!哈哈,小伙伴们又来学习啦~今天我将给大家介绍《在Go/Golang中生成JWT负载时的base64编码结果不一致》,这篇文章主要会讲到等等知识点,不知道大家对其都有多少了解,下面我们就一起来看一吧!当然,非常希望大家能多多评论,给出合理的建议,我们一起学习,一起进步!

问题内容

我有以下 jwt 有效负载: {"exp": 4724377561}(100 年后的某个日期)

在 go 中对其进行编码会产生 ewogicaizxhwijogndcyndm3nzu2mqp9 然而,使用 jwt.io 它被编码为 eyjlehaiojq3mjqznzc1njf9 ,这在签名时会产生不同的签名。我在测试装置中使用 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)
            }
        }
    }
}

解决方案


区别仅在于库在应用 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}

第二个输出符合您的预期。要删除 go 中无关紧要的空格,请使用 json.Compact

转换回 https://www.base64decode.org/ 上的编码字符串会告诉您发生了什么:

ewogicaizxhwijogndcyndm3nzu2mqp9

被解码为

{
"exp": 4724377561
}

而 jwt.io 字符串被解码为

{"exp":4724377561}

所以 https://jwt.io 在编码之前修剪所有空格和换行符。

终于介绍完啦!小伙伴们,这篇关于《在Go/Golang中生成JWT负载时的base64编码结果不一致》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~golang学习网公众号也会发布Golang相关知识,快来关注吧!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>