使用 jwt-go 库 - 密钥无效或类型无效
Posted
技术标签:
【中文标题】使用 jwt-go 库 - 密钥无效或类型无效【英文标题】:Using jwt-go Library - Key is invalid or invalid type 【发布时间】: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 令牌。
【问题讨论】:
【参考方案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
【讨论】:
以上是关于使用 jwt-go 库 - 密钥无效或类型无效的主要内容,如果未能解决你的问题,请参考以下文章