【问题标题】:I have a public key and a JWT, how do I check if it's valid in Go?我有一个公钥和一个 JWT,如何检查它在 Go 中是否有效?
【发布时间】:2019-01-20 21:16:41
【问题描述】:

我有一个来自身份提供者的公钥

-----BEGIN PUBLIC KEY-----
THIS
-----END PUBLIC KEY-----

还有来自我客户的 JWT 令牌。

如何根据密钥检查令牌? 我在使用 jwt-go 时遇到了困难,因为 Parse 函数采用令牌字符串和 getKey 函数。

不知道具体如何进行

【问题讨论】:

  • 使用 JWT 时没有公钥或私钥。只有一个秘密。 jwt.io
  • 没有。可以使用 RSA 算法进行签名,需要一对私钥和公钥进行签名和验证。

标签: go jwt jwt-go


【解决方案1】:

使用jwt-go,你可以做到这一点

token, err := p.Parse(IDToken, func(*jwt.Token) (interface{}, error) {
    return []byte(signingKey), nil
})

它会根据密钥验证令牌。

引用documentation

键入 Keyfunc func(*Token)(接口{},错误)

解析方法使用此回调函数来提供验证密钥。该函数接收已解析但未验证的 Token。这允许您使用令牌标头中的属性(例如kid)来识别要使用的密钥。

【讨论】:

    【解决方案2】:

    令牌由 RSA 算法签名,该算法使用私钥签名和公钥验证。将您的公钥存储到文件系统并使用jwt.SigningMethodRS256.Verify() 进行验证。如下sn-p:

    package main
    
    import (
        "fmt"
        "strings"
        "log"
        "io/ioutil"
        jwt "github.com/dgrijalva/jwt-go"
    )
    
    func main() {
        publicKeyPath := "~/public_key.key"
        token := "your_jwt_token_here"
    
        if isValid, err := verifyToken(token, publicKeyPath)
        if err != nil {
            log.Fatal(err)
        }
    
        if isValid {
            fmt.Println("The token is valid")
        } else {
            fmt.Println("The token is invalid")
        }
    }
    
    func verifyToken(token, publicKeyPath string) (bool, error) {
        keyData, err := ioutil.ReadFile(publicKeyPath)
        if err != nil {
            return false, err
        }
        key, err := jwt.ParseRSAPublicKeyFromPEM(keyData)
        if err != nil {
            return false, err
        }
    
        parts := strings.Split(token, ".")
        err = jwt.SigningMethodRS256.Verify(strings.Join(parts[0:2], "."), parts[2], key)
        if err != nil {
            return false, nil
        }
        return true, nil
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-03
      • 2018-06-07
      • 2019-09-18
      • 1970-01-01
      • 2016-04-06
      • 2014-09-12
      • 1970-01-01
      • 2010-12-22
      相关资源
      最近更新 更多