繁体   English   中英

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

[英]Using jwt-go Library - Key is invalid or invalid type

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

当我将令牌传递给这个 function -

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

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

我的配置结构在 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 函数返回一个字节片。

查看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()尝试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

我不确定这对其他人是否有问题。

我的问题是我使用的是签名方法"SigningMethodES256""SigningMethodHS256"或带有SigningMethodHS* Any 工作正常。

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

这对我有用。

token.SignedString([]byte("mysecretkey"))

func GenerateJWT(email string, username string) (tokenString string, err error) {

    expirationTime := time.Now().Add(1 * time.Hour)
    claims := &JWTClime{
        Email:    email,
        Username: username,
        StandardClaims: jwt.StandardClaims{
            ExpiresAt: expirationTime.Unix(),
        },
    }

    token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
    tokenString, err = token.SignedString([]byte("mysecretkey"))

    return
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM