使用 jwt-go 库 - 密钥无效或类型无效

Using jwt-go Library - Key is invalid or invalid type

我正在尝试将令牌传递给此 GO 库 (http://godoc.org/github.com/dgrijalva/jwt-go) 中为 JWT 令牌 parsing/validation.

定义的 "Parse(token String, keyFunc Keyfunc)" GO 例程

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

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

我收到一条错误消息 "Key is invalid or invalid type"。

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

config struct {
 Key string
}

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

config struct {
 Key string
}

Key 需要是 []byte

其他方法是这样做 -

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

整个想法是 Parse 函数 returns 一段字节。

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

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

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

Keyfunc 要求您 return (interface{}, error)。考虑到神秘的 interface{} 类型,您可能希望 return 使用 string 没问题;但是,深入了解 Parse() 会尝试 Verify(),它会尝试使用您的 interface{} 值作为 key:

进行以下类型断言
keyBytes, ok := key.([]byte)

[]byte 类型会成功,但 string 类型会失败。如果失败,结果就是您收到的错误消息。阅读有关 type assertions in the Effective Go documentation 的更多信息,了解它失败的原因。

示例: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

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

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

如果有人知道为什么这是一个问题,请回答。