5

我正在尝试将令牌传递给此 GO-library ( http://godoc.org/github.com/dgrijalva/jwt-go ) 中为 JWT-定义的“Parse(token String, keyFunc Keyfunc)” GO 例程-令牌解析/验证。

当我将令牌传递给这个函数时 -

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

我收到一条错误消息,提示“密钥无效或类型无效”。

我的配置结构在 config.go 文件中看起来像这样 -

config struct {
 Key string
}

有什么建议可以解决这个问题吗?我传递的令牌是 JWT 令牌。

4

4 回答 4

13
config struct {
 Key string
}

Key需要是一个[]byte

于 2015-02-04T16:27:55.410 回答
5

我不确定这对其他人来说是否是个问题。

我的问题是我使用的是签名方法"SigningMethodES256",但"SigningMethodHS256"或任何都可以SigningMethodHS*正常工作。

If someone knows why this is an issue please answer.

于 2021-08-22T14:16:38.333 回答
4

其他方法是做这样的事情 -

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

整个想法是 Parse 函数返回一个字节片。

于 2015-02-05T17:52:26.313 回答
0

看看github.com/dgrijalva/jwt-go 的 GoDoc中的函数签名,我们看到:

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

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

Keyfunc要求您返回(interface{}, error)。鉴于神秘的interface{}类型,您可能希望返回一个string; 但是,在引擎盖下的窥视揭示了Parse()尝试 to 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
于 2016-05-26T16:58:46.457 回答