jwt密钥无效

ama*_*a45 1 oauth go jwt web

我按照这个示例https://www.youtube.com/watch?v=eVlxuST7dCA制作了一个jwt auth.当我运行下面的代码时,我得到"密钥无效"错误.当我尝试打印tokenString时它是空的.此示例的github是https://github.com/potatogopher/jwt-go-example/blob/master/server.go为什么我收到无效错误?

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

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

fmt.Println("TOKEN:", tokenString)
Run Code Online (Sandbox Code Playgroud)

fhe*_*fhe 9

我认为你所指的示例代码使用了jwt-go的过时API .RS256签名方法要求密钥是a 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
}
Run Code Online (Sandbox Code Playgroud)


小智 5

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

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

例:

key := []byte("test")

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

fmt.Println("TOKEN:", tokenString)
Run Code Online (Sandbox Code Playgroud)