Использование библиотеки jwt-go - недопустимый ключ или недопустимый тип

Я пытаюсь передать токен процедуре GO "Parse(token String, keyFunc Keyfunc)", определенной в этой GO-библиотеке (http://godoc.org/github.com/dgrijalva/jwt-go) для синтаксического анализа/проверки токена JWT.

Когда я передаю токен этой функции -

token, err := jwt.Parse(getToken, func(token *jwt.Token) (interface{}, error) {
        return config.Config.Key, nil
    })

Я получаю сообщение об ошибке "Ключ недействителен или недопустимого типа".

Моя структура конфигурации выглядит так в файле config.go:

config struct {
 Key string
}

Любые предложения по решению этой проблемы? Токен, который я передаю, является токеном JWT.


person psbits    schedule 28.01.2015    source источник


Ответы (3)


config struct {
 Key string
}

Key должен быть []byte

person Jesse    schedule 04.02.2015
comment
Хотя этот пример кода может ответить на вопрос, было бы предпочтительнее включить в ваш ответ некоторые важные пояснения. В нынешнем виде этот ответ практически не имеет ценности для будущих читателей. - person oɔɯǝɹ; 04.02.2015

Другой способ - сделать что-то вроде этого -

token, err := jwt.Parse(getToken, func(token *jwt.Token) (interface{}, error) {
        return []byte(config.Config.Key), nil
    })

Вся идея в том, что функция Parse возвращает часть байтов.

person psbits    schedule 05.02.2015

Взглянем на сигнатуры функций в GoDoc для github.com/dgrijalva/jwt- идем видим:

func Parse(tokenString string, keyFunc Keyfunc) (*Token, error)

type Keyfunc func(*Token) (interface{}, error)

Keyfunc требует, чтобы вы вернули (interface{}, error). Учитывая загадочный тип interface{}, вы можете ожидать, что вернете string; однако заглянув под капот, можно увидеть, что Parse() пытается выполнить Verify(), который пытается выполнить следующее утверждение типа с вашим значением interface{} в качестве key:

keyBytes, ok := key.([]byte)

Это удастся для типов []byte, но не удастся для типов string. Когда это не удается, результатом является сообщение об ошибке, которое вы получаете. Узнайте больше об утверждениях типов в документации Effective Go, чтобы узнать, почему они не работают.

Пример: https://play.golang.org/p/9KKNFLLQrm

package main

import "fmt"

func main() {
    var a interface{}
    var b interface{}

    a = []byte("hello")
    b = "hello"

    key, ok := a.([]byte)
    if !ok {
        fmt.Println("a is an invalid type")
    } else {
        fmt.Println(key)
    }

    key, ok = b.([]byte)
    if !ok {
        fmt.Println("b is an invalid type")
    } else {
        fmt.Println(key)
    }
}

[104 101 108 108 111]
b is an invalid type
person Niko Kovacevic    schedule 26.05.2016