2017-06-29 188 views
0

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

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

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

fmt.Println("TOKEN:", tokenString) 
+2

你肯定demo.rsa是一个有效的关键? –

+0

无论您决定使用哪种签名方法,请确保您将其硬编码并验证传入的JWT是否具有正确的签名方法。我不确定这是否仍然是Go的一个漏洞,但请阅读本文以避免打开安全漏洞。 https://auth0.com/blog/critical-vulnerabilities-in-json-web-token-libraries/ – RayfenWindspear

回答

4

我想你指的是该示例代码使用的jwt-go过时的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 
} 
+0

@ fhe-谢谢,它的作品。我怎样才能解析这个呢?我尝试了jwt.Parse(tokenString,func(token * jwt.Token)(interface {},错误),但我总是得到无效类型 – amanda45

+0

@ amanda45我已经用parseTokenFromSignedTokenString()扩展了该示例,它显示了如何验证签名令牌字符串。在那里使用rsa.PublicKey很重要:) – fhe

4

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

如果你不想这样做,你也可以使用HMAC签名方法在这里你只需要提供一个密钥/串。

例子:

key := []byte("test") 

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

fmt.Println("TOKEN:", tokenString) 
+1

我确实创建了私钥。它与我的go文件在同一个文件夹中。 – amanda45