Полезная нагрузка кодирования JWT Go / Golang base64 дает разные результаты - PullRequest
1 голос
/ 19 сентября 2019

у меня есть следующая полезная нагрузка JWT: {"exp": 4724377561} (некоторая дата через 100 лет)

Кодирование в Go дает ewogICAiZXhwIjogNDcyNDM3NzU2MQp9 Использование jwt.io однако оно закодировано вeyJleHAiOjQ3MjQzNzc1NjF9, который дает другую подпись при подписании.Я использую подписи jwt.io в тестовых приборах.

Я бы не хотел использовать сторонние инструменты 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)
            }
        }
    }
}

Ответы [ 2 ]

1 голос
/ 19 сентября 2019

Разница заключается просто в том, что библиотека "сжала" JSON перед применением кодировки Base64.

См. Этот пример:

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 .

0 голосов
/ 19 сентября 2019

преобразование обратно закодированных строк в https://www.base64decode.org/ говорит вам, что происходит:

ewogICAiZXhwIjogNDcyNDM3NzU2MQp9

декодируется в

{
"exp": 4724377561
}

, в то время как строка jwt.io декодируетсядо

{"exp":4724377561}

, поэтому https://jwt.io обрезает все пробелы и переносы строк перед кодированием.

...