Где проверяется секретный ключ JWT при разборе токена jwt? - PullRequest
0 голосов
/ 26 мая 2020

Я читаю пример папки для JWT, я немного не уверен, как все работает для проверки токена.

func ExampleNewWithClaims_customClaimsType() {
    mySigningKey := []byte("AllYourBase")

    type MyCustomClaims struct {
        Foo string `json:"foo"`
        jwt.StandardClaims
    }

    // Create the Claims
    claims := MyCustomClaims{
        "bar",
        jwt.StandardClaims{
            ExpiresAt: 15000,
            Issuer:    "test",
        },
    }

    token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
    ss, err := token.SignedString(mySigningKey)
    fmt.Printf("%v %v", ss, err)
    //Output: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJmb28iOiJiYXIiLCJleHAiOjE1MDAwLCJpc3MiOiJ0ZXN0In0.HE7fK0xOQwFEr4WDgRWj4teRPZ6i3GLwD5YCm6Pwu_c <nil>
}

Здесь это прямо, и токен подписано здесь token.SignedString(mySigningKey) с использованием «mySigningKey»

Теперь разбор для меня гораздо менее понятен:

func ExampleParseWithClaims_customClaimsType() {
    tokenString := "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJmb28iOiJiYXIiLCJleHAiOjE1MDAwLCJpc3MiOiJ0ZXN0In0.HE7fK0xOQwFEr4WDgRWj4teRPZ6i3GLwD5YCm6Pwu_c"

    type MyCustomClaims struct {
        Foo string `json:"foo"`
        jwt.StandardClaims
    }

    // sample token is expired.  override time so it parses as valid
    at(time.Unix(0, 0), func() {
        token, err := jwt.ParseWithClaims(tokenString, &MyCustomClaims{}, func(token *jwt.Token) (interface{}, error) {
            return []byte("AllYourBase"), nil
        })

        if claims, ok := token.Claims.(*MyCustomClaims); ok && token.Valid {
            fmt.Printf("%v %v", claims.Foo, claims.StandardClaims.ExpiresAt)
        } else {
            fmt.Println(err)
        }
    })

    // Output: bar 15000
}

Это приказ проверить, что подпись токена строка, возвращенная клиентом, действительна, если вам нужно

  • декодировать заявку (выполняется в & MyCustomClaims {})
  • проверить, что часть подписи декодированной заявки действительна для «Ключ pub, включенный в токен» с использованием token.Valid.

Но в примере просто декодируется ключ, и с помощью « magi c» возвращается секретный ключ / ключ подписи?

Для меня это вообще не имеет смысла. Также бесполезно возвращать действительную заявку на ключ publi c, поскольку это могло быть сделано с помощью любого закрытого ключа.

Что мне не хватает?

1 Ответ

4 голосов
/ 26 мая 2020

Проверка не выполняется ключом publi c, включенным в токен.

HS256 является симметричным c, поэтому какой бы ключ вы ни использовали для подписи токена, вы должны использовать тот же ключ для подтвердите подпись, и вот что происходит. Функция, переданная в ParseWithClaims, возвращает тот же ключ, который использовался для подписи токена.

Если использовался алгоритм подписи asymmetri c, вы использовали бы закрытый ключ для подписи токена, а затем publi c key, чтобы проверить его, и эта вложенная функция должна вернуть ключ publi c, чтобы ParseWithClaims мог его проверить.

Похоже, что вас смутила часть:

jwt.ParseWithClaims(tokenString, &MyCustomClaims{}, func(token *jwt.Token) (interface{}, error) {
            return []byte("AllYourBase"), nil
        })

Вложенная функция, переданная в ParseWithClaims, должна проверять переданный токен и возвращать правильный ключ, который можно использовать для проверки подписи. Для HS256 это тот же ключ, который использовался для его подписи. Для RSxxx это будет ключ publi c, и ключ publi c, который он должен вернуть, можно получить из переданного токена. Обычно он содержит идентификатор ключа publi c, поэтому вы можете выбрать правильный ключ .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...