我在nodejs应用程序中生成了一个JWT令牌。它使用HS256进行签名。我已经编写了代码来验证它在戈朗。即使我在JWT.io站点中验证了签名无效,我也会收到一条错误消息。该代码还验证了公共/私有,但这是可行的。只有HS256不是,我还打印了令牌和秘密,以确保它们是正确的值。任何帮助都将不胜感激。我的高丽密码:
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")
})
发布于 2022-03-06 18:25:57
因为您只有一个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开始变得更加复杂,请查看这个包:github.com/MicahParks/keyfunc
。它支持多个给定的密钥,如HMAC和远程JWKS资源。
https://stackoverflow.com/questions/71369336
复制相似问题