登录
首页 >  Golang >  Go问答

无法生成 JWT 令牌来自定义电子邮件声明

来源:stackoverflow

时间:2024-03-08 18:45:27 173浏览 收藏

小伙伴们有没有觉得学习Golang很有意思?有意思就对了!今天就给大家带来《无法生成 JWT 令牌来自定义电子邮件声明》,以下内容将会涉及到,若是在学习中对其中部分知识点有疑问,或许看了本文就能帮到你!

问题内容

我正在尝试使用 go 生成 jwt 令牌,并创建了以下函数。我需要在 jwt 中添加电子邮件地址,但当我这样做时,我收到一条错误消息,指出 key 的类型无效

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 方法文档,您会看到它说:

对于此签名方法,密钥必须是 ecdsa.privatekey 结构

您可以使用以下方法从 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)

今天关于《无法生成 JWT 令牌来自定义电子邮件声明》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>