[英]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.