gpt4 book ai didi

go - 输入自定义电子邮件声明时无法创建 JWT token

转载 作者:行者123 更新时间:2023-12-01 22:26:00 25 4
gpt4 key购买 nike

我正在尝试使用 Go 生成 JWT token ,并创建了以下函数。我需要在 jwt 中添加电子邮件地址,但是当我这样做时,我收到一条错误消息 key is of invalid type

func GenerateUserToken(expiryHours time.Duration, email string, secretKey string) (string, error) {
// Create a new token object, specifying signing method and the claims
// you would like it to contain.
token := jwt.New(jwt.SigningMethodES256)
claims := token.Claims.(jwt.MapClaims)
claims["exp"] = time.Now().Add(time.Hour * expiryHours).Unix()
claims["email"] = email

tokenStr, err := token.SignedString([]byte(secretKey))
if err != nil {
return "", err
}

return tokenStr, nil
}

这可能是什么原因?我犯了什么错误?

最佳答案

JWT 支持许多签名算法,这对这个特定的 API 来说是一个挑战:根据签名算法,它希望看到与该算法匹配的 key 。

如果您查看此特定库的 API 文档:

https://godoc.org/github.com/dgrijalva/jwt-go

你会看到 SigningMethodXXX类型。这些是您选择的签名方法选择的签名者。对于 ES256,它使用 SigningMethodECDSA :

https://godoc.org/github.com/dgrijalva/jwt-go#SigningMethodECDSA

如果您查看 Sign方法文档,你会看到它说:

For this signing method, key must be an ecdsa.PrivateKey struct



您可以使用以下方法从 PEM 文件中解析:

https://godoc.org/github.com/dgrijalva/jwt-go#ParseECPrivateKeyFromPEM

例如:
pk, err:= jwt.ParseECPrivateKeyFromPEM(pemData)
tokenStr, err := token.SignedString(pk)

这应该会给你一个带有 ES256 的签名 token 。

所以,你必须首先弄清楚你有什么样的 key 。如果您在字符串中有 ECDSA key 的 PEM 编码,则使用此方法对其进行解析并将生成的私钥传递给签名者。

但是,如果您只有一个字符串 key (如密码)并且您将与 JWT 的用户共享此 key ,那么您可以使用 HMAC key 。 HMAC key 只是您与用户共享的字节数组 key ,因此他们可以验证 JWT 是否由您签名。只需将 SigningMethod 更改为以下常量之一:

https://godoc.org/github.com/dgrijalva/jwt-go#SigningMethodHMAC

然后,您的代码将正常工作,但您必须将签名方法更改为 jwt.New(jwt.SigningMethodHS256) 之类的东西。

关于go - 输入自定义电子邮件声明时无法创建 JWT token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59932883/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com