繁体   English   中英

验证 JWT 令牌在 Golang 中失败

[英]Verify JWT Token fails in Golang

我在 nodejs 应用程序中生成了一个 JWT 令牌。 它使用 HS256 签名。 我已经编写了代码以在 golang 中对其进行验证。 即使我在 JWT.io 站点中验证了它,我也会收到“签名无效”的错误消息。 该代码也验证公共/私人,但这有效。 只有 HS256 不是我还打印了令牌和秘密以确保它们是正确的值。 任何帮助将不胜感激。 我的golang代码:

token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
        // Validate the alg is the expected algorithm:
        if conf.JwtAlgorithm != token.Header["alg"] {
            log.Printf("unexpected signing method: %s, conf algorithm: %s\n", token.Header["alg"], conf.JwtAlgorithm)
            return nil, fmt.Errorf("unexpected signing method: %v", token.Header["alg"])
        }

        log.Printf("JWT algo is: %s, Public is %s, secret is %s", token.Header["alg"], publicKey, secret)

        if secret != "" {
            log.Printf("Returning secret %s", secret)
            return []byte(secret), nil
        }
        if publicKey != "" {
            pub, _ := jwt.ParseRSAPublicKeyFromPEM([]byte(publicKey))
            fmt.Println("pub is of type RSA:", pub)
            return pub, nil
        }
        return nil, fmt.Errorf("PublicKey and secret are empty")
    })

由于您只有一个 HMAC 密钥,因此您需要这样的东西:

package main

import (
    "log"

    "github.com/golang-jwt/jwt/v4"
)

func main() {
    const tokenString = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.drt_po6bHhDOF_FJEHTrK-KD8OGjseJZpHwHIgsnoTM"

    var keyfunc jwt.Keyfunc = func(token *jwt.Token) (interface{}, error) {
        return []byte("mysecret"), nil
    }

    parsed, err := jwt.Parse(tokenString, keyfunc)
    if err != nil {
        log.Fatalf("Failed to parse JWT.\nError: %s", err.Error())
    }

    if !parsed.Valid {
        log.Fatalln("Token is not valid.")
    }

    log.Println("Token is valid.")
}

jwt.Keyfunc的返回类型应该是什么肯定令人困惑。 对于 HMAC 密钥,返回类型应为[]byte

请注意,HMAC 密钥不使用公钥加密,因此只是不应共享的私钥。

如果您需要解析和验证的 JWT 开始变得更加复杂,请查看此 package: github.com/MicahParks/keyfunc 它支持多个给定的密钥,如 HMAC 和远程 JWKS 资源。

暂无
暂无

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

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