输入自定义电子邮件声明时未能创建JWT令牌

时间:2020-01-27 14:15:16

标签: go jwt token jwt-auth jwt-go

我试图使用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
}

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

1 个答案:

答案 0 :(得分:0)

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)