【问题标题】:Using jwt-go Library - Key is invalid or invalid type使用 jwt-go 库 - 密钥无效或类型无效
【发布时间】:2015-03-28 01:39:31
【问题描述】:

我正在尝试将令牌传递给此 GO 库 (http://godoc.org/github.com/dgrijalva/jwt-go) 中定义的“Parse(token String, keyFunc Keyfunc)”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 令牌。

【问题讨论】:

    标签: parsing go jwt token jwt-go


    【解决方案1】:
    config struct {
     Key string
    }
    

    Key 必须是 []byte

    【讨论】:

    • 虽然此代码示例可能会回答这个问题,但最好在您的回答中包含一些基本解释。就目前而言,这个答案对未来的读者几乎没有价值。
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

      我不确定这是否会成为其他人的问题。

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

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

      【讨论】:

        【解决方案4】:

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

        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 类型会失败。如果失败,结果就是您收到的错误消息。阅读有关 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
        

        【讨论】:

          猜你喜欢
          • 2020-09-25
          • 2017-12-02
          • 2019-12-25
          • 2023-03-20
          • 1970-01-01
          • 2018-01-03
          • 2017-01-27
          • 1970-01-01
          • 2011-08-27
          相关资源
          最近更新 更多