Go JWT密钥无效

Go JWT密钥无效,go,web,oauth,jwt,jwt-go,Go,Web,Oauth,Jwt,Jwt Go,我按照这个例子制作一个jwt auth。当我运行下面的代码时,我得到“密钥无效”错误。当我尝试打印令牌字符串时,它是空的。这个示例的GitHub是为什么我会得到无效错误 var privateKey []byte privateKey, err := ioutil.ReadFile("demo.rsa") token := jwt.New(jwt.GetSigningMethod("RS256")) tokenString, err := token.SignedString(privateK

我按照这个例子制作一个jwt auth。当我运行下面的代码时,我得到“密钥无效”错误。当我尝试打印令牌字符串时,它是空的。这个示例的GitHub是为什么我会得到无效错误

var privateKey []byte
privateKey, err := ioutil.ReadFile("demo.rsa")

token := jwt.New(jwt.GetSigningMethod("RS256"))
tokenString, err := token.SignedString(privateKey)

fmt.Println("TOKEN:", tokenString)

您需要使用以下命令创建私钥:
openssl genrsa-out demo.rsa

如果不想这样做,也可以使用hmac签名方法,只需提供密钥/字符串

例如:

key := []byte("test")

token := jwt.New(jwt.SigningMethodHS256)
tokenString, err := token.SignedString(key)

fmt.Println("TOKEN:", tokenString)

您需要使用以下命令创建私钥:
openssl genrsa-out demo.rsa

如果不想这样做,也可以使用hmac签名方法,只需提供密钥/字符串

例如:

key := []byte("test")

token := jwt.New(jwt.SigningMethodHS256)
tokenString, err := token.SignedString(key)

fmt.Println("TOKEN:", tokenString)

我认为您提到的示例代码使用了一个过时的API。RS256签名方法要求密钥是rsa.PrivateKey,而不是字节缓冲区。这意味着,必须首先使用
jwt.ParseRSAPrivateKeyFromPEM
函数解析私钥

我已在下面更新了您的示例:

func main() {
    tokenString, err := createSignedTokenString()
    if err != nil {
        panic(err)
    }
    fmt.Printf("Signed token string:\n%v\n", tokenString)

    token, err := parseTokenFromSignedTokenString(tokenString)
    if err != nil {
        panic(err)
    }
    fmt.Printf("Parsed token valid = %v, raw token:\n%v\n", token.Valid, token.Raw)
}

func createSignedTokenString() (string, error) {
    privateKey, err := ioutil.ReadFile("demo.rsa")
    if err != nil {
        return "", fmt.Errorf("error reading private key file: %v\n", err)
    }

    key, err := jwt.ParseRSAPrivateKeyFromPEM(privateKey)
    if err != nil {
        return "", fmt.Errorf("error parsing RSA private key: %v\n", err)
    }

    token := jwt.New(jwt.SigningMethodRS256)
    tokenString, err := token.SignedString(key)
    if err != nil {
        return "", fmt.Errorf("error signing token: %v\n", err)
    }

    return tokenString, nil
}

func parseTokenFromSignedTokenString(tokenString string) (*jwt.Token, error) {
    publicKey, err := ioutil.ReadFile("demo.rsa.pub")
    if err != nil {
        return nil, fmt.Errorf("error reading public key file: %v\n", err)
    }

    key, err := jwt.ParseRSAPublicKeyFromPEM(publicKey)
    if err != nil {
        return nil, fmt.Errorf("error parsing RSA public key: %v\n", err)
    }

    parsedToken, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
        if _, ok := token.Method.(*jwt.SigningMethodRSA); !ok {
            return nil, fmt.Errorf("unexpected signing method: %v", token.Header["alg"])
        }
        return key, nil
    })
    if err != nil {
        return nil, fmt.Errorf("error parsing token: %v", err)
    }

    return parsedToken, nil
}

我认为您提到的示例代码使用了一个过时的API。RS256签名方法要求密钥是rsa.PrivateKey,而不是字节缓冲区。这意味着,必须首先使用
jwt.ParseRSAPrivateKeyFromPEM
函数解析私钥

我已在下面更新了您的示例:

func main() {
    tokenString, err := createSignedTokenString()
    if err != nil {
        panic(err)
    }
    fmt.Printf("Signed token string:\n%v\n", tokenString)

    token, err := parseTokenFromSignedTokenString(tokenString)
    if err != nil {
        panic(err)
    }
    fmt.Printf("Parsed token valid = %v, raw token:\n%v\n", token.Valid, token.Raw)
}

func createSignedTokenString() (string, error) {
    privateKey, err := ioutil.ReadFile("demo.rsa")
    if err != nil {
        return "", fmt.Errorf("error reading private key file: %v\n", err)
    }

    key, err := jwt.ParseRSAPrivateKeyFromPEM(privateKey)
    if err != nil {
        return "", fmt.Errorf("error parsing RSA private key: %v\n", err)
    }

    token := jwt.New(jwt.SigningMethodRS256)
    tokenString, err := token.SignedString(key)
    if err != nil {
        return "", fmt.Errorf("error signing token: %v\n", err)
    }

    return tokenString, nil
}

func parseTokenFromSignedTokenString(tokenString string) (*jwt.Token, error) {
    publicKey, err := ioutil.ReadFile("demo.rsa.pub")
    if err != nil {
        return nil, fmt.Errorf("error reading public key file: %v\n", err)
    }

    key, err := jwt.ParseRSAPublicKeyFromPEM(publicKey)
    if err != nil {
        return nil, fmt.Errorf("error parsing RSA public key: %v\n", err)
    }

    parsedToken, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
        if _, ok := token.Method.(*jwt.SigningMethodRSA); !ok {
            return nil, fmt.Errorf("unexpected signing method: %v", token.Header["alg"])
        }
        return key, nil
    })
    if err != nil {
        return nil, fmt.Errorf("error parsing token: %v", err)
    }

    return parsedToken, nil
}

您确定demo.rsa是有效的密钥吗?无论您决定使用哪种签名方法,请确保您将其硬编码并验证传入的JWT具有正确的签名方法。我不确定这是否仍然是Go中的一个漏洞,但请阅读本文以避免打开安全漏洞。您确定demo.rsa是有效的密钥吗?无论您决定使用哪种签名方法,请确保您将其硬编码并验证传入的JWT具有正确的签名方法。我不确定这是否仍然是Go中的一个漏洞,但请阅读本文以避免打开安全漏洞。我确实创建了私钥。它和我的go文件在同一个文件夹中。在我的例子中,我将jwt.SigningMethods256更改为jwt.SigningMethods256。在SignedString()中使用[]字节(字符串),我确实创建了私钥。它和我的go文件在同一个文件夹中。在我的例子中,我将jwt.SigningMethods256更改为jwt.SigningMethods256。在SignedString()中使用[]字节(字符串)谢谢,它可以工作。之后我如何解析它?我尝试了jwt.Parse(tokenString,func(token*jwt.token)(接口{},错误),但总是无效type@amanda45我已经用parseTokenFromSignedTokenString()扩展了这个示例,它展示了如何验证签名令牌字符串。在这里使用rsa.PublicKey非常重要:)@fhe谢谢,它可以工作。之后我如何解析它?我尝试了jwt.Parse(tokenString,func(token*jwt.token)(接口{},错误),但总是无效type@amanda45我已经用parseTokenFromSignedTokenString()扩展了这个示例,它展示了如何验证签名的令牌字符串