输入自定义电子邮件声明时无法创建 JWT 令牌
Failing to create JWT token when entering a custom email claim
我正在尝试使用 Go 生成 JWT 令牌,我创建了以下函数。我需要在 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 来说是一个挑战:根据签名算法,它希望看到与该算法匹配的密钥。
如果您查看此特定库的 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 的签名令牌。
所以,你得先弄清楚你有什么样的钥匙。如果您有字符串中 ECDSA 密钥的 PEM 编码,则使用此方法对其进行解析并将生成的私钥传递给签名者。
但是,如果您只有一个字符串密钥(如密码)并且您将与 JWT 的用户共享此密钥,那么您可以使用 HMAC 密钥。 HMAC 密钥只是您与用户共享的字节数组秘密,以便他们可以验证 JWT 是否由您签名。只需将 SigningMethod 更改为以下常量之一:
https://godoc.org/github.com/dgrijalva/jwt-go#SigningMethodHMAC
然后,您的代码将正常工作,但您必须将签名方法更改为 jwt.New(jwt.SigningMethodHS256)
我正在尝试使用 Go 生成 JWT 令牌,我创建了以下函数。我需要在 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 来说是一个挑战:根据签名算法,它希望看到与该算法匹配的密钥。
如果您查看此特定库的 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 的签名令牌。
所以,你得先弄清楚你有什么样的钥匙。如果您有字符串中 ECDSA 密钥的 PEM 编码,则使用此方法对其进行解析并将生成的私钥传递给签名者。
但是,如果您只有一个字符串密钥(如密码)并且您将与 JWT 的用户共享此密钥,那么您可以使用 HMAC 密钥。 HMAC 密钥只是您与用户共享的字节数组秘密,以便他们可以验证 JWT 是否由您签名。只需将 SigningMethod 更改为以下常量之一:
https://godoc.org/github.com/dgrijalva/jwt-go#SigningMethodHMAC
然后,您的代码将正常工作,但您必须将签名方法更改为 jwt.New(jwt.SigningMethodHS256)