使用 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*
的方法都可以正常工作。
如果有人知道为什么这是一个问题,请回答。
我正在尝试将令牌传递给此 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*
的方法都可以正常工作。
如果有人知道为什么这是一个问题,请回答。