标签: jwt-go

我有一个公钥和一个 JWT,我如何检查它在 Go 中是否有效?

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

-----BEGIN PUBLIC KEY-----
THIS
-----END PUBLIC KEY-----
Run Code Online (Sandbox Code Playgroud)

以及来自我客户的 JWT 令牌。

如何根据密钥检查令牌?我遇到了困难,jwt-go因为 Parse 函数需要令牌字符串和一个getKey函数。

不确定如何进行

go jwt jwt-go

9
推荐指数
2
解决办法
3075
查看次数

如何在 Go 中从 AWS Cognito 验证 JWT 令牌?

如何验证和获取从 Amazon Cognito 收到的 JWT 的信息?

我在 Cognito 中设置了 Google 身份验证,并将重定向 uri 设置为命中 API 网关,然后我收到一个代码,我 POST 到这个端点:

https://docs.aws.amazon.com/cognito/latest/developerguide/token-endpoint.html

以 RS256 格式接收 JWT 令牌。我现在正在努力验证和解析 Golang 中的令牌。我尝试使用 jwt-go 解析它,但它似乎默认支持 HMAC,并阅读他们推荐使用前端验证的地方。我尝试了其他一些软件包并遇到了类似的问题。

我在这里遇到了这个答案:Go Language and Verify JWT但假设代码已经过时了,就像刚才说的那样panic: unable to find key

jwt.io 可以很容易地解码密钥,并且可能也可以验证。我不确定亚马逊生成令牌时公共/秘密密钥在哪里,但据我所知,我也需要使用 JWK URL 进行验证?我找到了一些 AWS 特定的解决方案,但它们似乎都有数百行长。在 Golang 中肯定没有那么复杂吧?

go amazon-web-services jwt amazon-cognito jwt-go

9
推荐指数
4
解决办法
5341
查看次数

使用 JWKS golang 进行 JWT 验证

我使用 dgrijalva/jwt-go 和 lestrrat-go/jwx。我试图实现的是使用 jwks 验证 wso2 jwt。

令牌(过期令牌):

const tokenStr = `eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6ImI2TnozUDJwMHg1QWpfWENsUmhrVDFzNlNIQSJ9.eyJodHRwOlwvXC93c28yLm9yZ1wvY2xhaW1zXC9hcHBsaWNhdGlvbnRpZXIiOiJVbmxpbWl0ZWQiLCJodHRwOlwvXC93c28yLm9yZ1wvY2xhaW1zXC9rZXl0eXBlIjoiUFJPRFVDVElPTiIsImh0dHA6XC9cL3dzbzIub3JnXC9jbGFpbXNcL3ZlcnNpb24iOiIxLjAiLCJpc3MiOiJ3c28yLm9yZ1wvcHJvZHVjdHNcL2FtIiwiaHR0cDpcL1wvd3NvMi5vcmdcL2NsYWltc1wvYXBwbGljYXRpb25uYW1lIjoiVGFseW9uIiwiaHR0cDpcL1wvd3NvMi5vcmdcL2NsYWltc1wvZW5kdXNlciI6IkZEQkBjYXJib24uc3VwZXIiLCJodHRwOlwvXC93c28yLm9yZ1wvY2xhaW1zXC9lbmR1c2VyVGVuYW50SWQiOiItMTIzNCIsImh0dHA6XC9cL3dzbzIub3JnXC9jbGFpbXNcL3N1YnNjcmliZXIiOiJGREIiLCJodHRwOlwvXC93c28yLm9yZ1wvY2xhaW1zXC90aWVyIjoiR29sZCIsImh0dHA6XC9cL3dzbzIub3JnXC9jbGFpbXNcL2FwcGxpY2F0aW9uaWQiOiIxNDU2IiwiaHR0cDpcL1wvd3NvMi5vcmdcL2NsYWltc1wvdXNlcnR5cGUiOiJBUFBMSUNBVElPTiIsImV4cCI6MTU4OTQ2NjI0MSwiaHR0cDpcL1wvd3NvMi5vcmdcL2NsYWltc1wvYXBpY29udGV4dCI6IlwvY3VycmVudC1hY2NvdW50XC9jaGVxdWVzXC9hdXRvbWF0aWMtZGVwb3NpdHNcL2F0bVwvMS4wIn0=.K1iPtdXiuicuDPaLC6Exw/7UpJVW6Uy1tPpJlfZ29Vqs9M1zR00JpKxvymQMAzbD0GHlXPPsZmhDxOn0WMAPfr1Xi8tiruTLXNbwUPJ/SOovt+zK4JGtrydhc4iv2EROhMUk2uwJUb4DFjqKZRhBvtCW7fRtdtI9yJL4W4OK8Ld90yOb97usPjEPz8S4E4uNrb5lE2rLzIp+EaPwA232lDkhS8gGPIKdlLG1IdEfQ4cFU1VIplvWoHzprF9mGR0ahT2QGgmGE3AcBfkURk8VzIKDG/UcBA9eHu3XGg28j3OvIXWwJhd7Hi+jTqvggi0hplao8ElvjNBw/wNy2UO9WA==`
Run Code Online (Sandbox Code Playgroud)

jwks:

{"keys":[{"kty":"RSA","e":"AQAB","use":"sig","kid":"MjhhMDk2N2M2NGEwMzgzYjk2OTI3YzdmMGVhOGYxNjI2OTc5Y2Y2MQ","alg":"RS256","n":"zZU9xSgK77PbtkjJgD2Vmmv6_QNe8B54eyOV0k5K2UwuSnhv9RyRA3aL7gDN-qkANemHw3H_4Tc5SKIMltVIYdWlOMW_2m3gDBOODjc1bE-WXEWX6nQkLAOkoFrGW3bgW8TFxfuwgZVTlb6cYkSyiwc5ueFV2xNqo96Qf7nm5E7KZ2QDTkSlNMdW-jIVHMKjuEsy_gtYMaEYrwk5N7VoiYwePaF3I0_g4G2tIrKTLb8DvHApsN1h-s7jMCQFBrY4vCf3RBlYULr4Nz7u8G2NL_L9vURSCU2V2A8rYRkoZoZwk3a3AyJiqeC4T_1rmb8XdrgeFHB5bzXZ7EI0TObhlw"}]}
Run Code Online (Sandbox Code Playgroud)

那里看到的大多数示例都使用“kid”并且不相关,因为我的令牌标头没有它,它有“x5t”字段。

我还必须注意一件事,我的签名似乎是 base64 编码的,而不是 base64 url​​ 编码的(它几乎扰乱了 Parse 方法的使用)。我尝试过使用 jwt.Parse() 我尝试过手动加密标头和有效负载 sha256 以及 RS256 和 base64 但没有显示成功。

我尝试过的事情:

const tokenString = `..`
func main() {
    t, err := jwt.Parse(tokenStr,  func(t *jwt.Token) (interface{}, error) {
        return []byte("b6Nz3P2p0x5Aj_XClRhkT1s6SHA"), nil
    })
}
Run Code Online (Sandbox Code Playgroud)

validation token go jwt jwt-go

9
推荐指数
2
解决办法
1万
查看次数

使 jwt 编码更快

我有一个/token正在使用password授权的端点。因为它对JWT令牌进行编码,所以它具有大约 1 秒的高延迟。有没有办法让 JWT 签名更快?

我正在使用 Go 与github.com/dgrijalva/jwt-go图书馆。

package main

import (
    "crypto/rsa"
    "git.snappfood.ir/golang/framework/assert"
    "io/ioutil"
    "time"

    
    "github.com/dgrijalva/jwt-go"
    "github.com/sirupsen/logrus"
)

var (
    private *rsa.PrivateKey
    public  *rsa.PublicKey
)

func main() {
    var err error
    var priv, pub []byte
    pub, err = ioutil.ReadFile("public.pem")
    if err!=nil{
        panic(err)
    }
    priv, err = ioutil.ReadFile("private.pem")
    if err!=nil{
        panic(err)
    }

    public, err = jwt.ParseRSAPublicKeyFromPEM(pub)
    if err!=nil{
        panic(err)
    }

    private, err = jwt.ParseRSAPrivateKeyFromPEM(priv)
    if err!=nil{
        panic(err)
    }

    data := map[string]interface{}{
        "jti": …
Run Code Online (Sandbox Code Playgroud)

go jwt jwt-go

6
推荐指数
1
解决办法
181
查看次数

dgrijalva/jwt-go 可以将声明转换为 MapClaims 而不是 StandardClaims?

我正在使用以下代码创建令牌

token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.StandardClaims{
    Subject: string(user.Id),
})

tokenString, err := token.SignedString([]byte("secret"))
Run Code Online (Sandbox Code Playgroud)

并尝试使用以下代码解析它们

token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
    if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
        return nil, UnauthorizedError
    }

    return []byte("secret"), nil
})
if err != nil {
    return -1, UnauthorizedError
}

if !token.Valid {
    return -1, UnauthorizedError
}

claims, ok := token.Claims.(jwt.MapClaims)
if !ok {
    return -1, UnauthorizedError
}

logrus.Info(claims)
Run Code Online (Sandbox Code Playgroud)

为什么我不能将我的声明转换为 StandardClaims 并访问 claim.Subject?

go jwt jwt-go

5
推荐指数
1
解决办法
2865
查看次数

如何在 Go 中将 JWT 的到期日期解析为 time.Time()?

我想exp从 JSON 网络令牌 (JWT)解析到期日期 ( ),而无需对其进行验证。我尝试了以下脚本(试图遵循How to parse unix timestamp to time.Time):

package main

import (
    "fmt"
    "log"
    "strconv"
    "time"

    jwt "github.com/dgrijalva/jwt-go"
)

func main() {
    tokenString := "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c"

    token, _, err := new(jwt.Parser).ParseUnverified(tokenString, jwt.MapClaims{})
    if err != nil {
        log.Fatal(err)
    }

    if claims, ok := token.Claims.(jwt.MapClaims); ok {
        fmt.Println(claims["exp"])
        i, err := strconv.ParseInt(claims["exp"].(string), 10, 64)
        if err != nil {
            log.Fatal(err)
        }

        tm := time.Unix(i, 0)
        fmt.Println(tm)
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,我收到此错误:

> go run main.go
<nil> …
Run Code Online (Sandbox Code Playgroud)

go datetime-parsing jwt jwt-go

5
推荐指数
1
解决办法
3968
查看次数

如何在 Golang 中验证 JWT 令牌

我想检查 JWT 是否是从我们的服务器生成的?

我使用 JWT 进行身份验证并使用 RS256 作为 JWT 的算法

现在,我想在 Golang 中编写一个函数来验证 JWT 令牌是否是我们的。下面是我已经实现的代码:

    publicKey = "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAxxxxxxf2iF+20xHTZ4jTUBzYmikBuUsm0839T5SDmwEquTB\nfQIDAQAB\n-----END PUBLIC KEY-----\n"


    // sample token string taken from the New example
    tokenString := this.JWT[0]

    claims := jwt.MapClaims{}
    token, err := jwt.ParseWithClaims(tokenString, &claims, func(token *jwt.Token) (interface{}, error) {
        return []byte(publicKey), nil
    })

    // ... error handling
    if err != nil {
        fmt.Println(err)
    }

    fmt.Println("TOKEN is:", token.Valid)

    // do something with decoded claims
    for key, val := range claims {
        fmt.Printf("Key: %v, …
Run Code Online (Sandbox Code Playgroud)

go jwt jwt-go

5
推荐指数
1
解决办法
6419
查看次数

如何在 Go 中验证应用商店服务器 api 的 JWS 事务

最近,应用商店服务器 API 中添加了一种新的 API查找订单 ID 。以及由 App Store 签名的此 API 响应的JWSTransaction ,采用 JSON Web 签名格式。我们想用 go 来验证一下。

我们尝试过什么

  1. 使用jwt -go ,我们尝试根据此问题从 pem 文件中提取公钥。另外,根据此链接,应通过从私钥中提取公钥来解码响应
type JWSTransaction struct {
    BundleID             string `json:"bundleId"`
    InAppOwnershipType   string `json:"inAppOwnershipType"`
    TransactionID        string `json:"transactionId"`
    ProductID            string `json:"productId"`
    PurchaseDate         int64  `json:"purchaseDate"`
    Type                 string `json:"type"`
    OriginalPurchaseDate int64  `json:"originalPurchaseDate"`
}

func (ac *JWSTransaction) Valid() error {

    return nil
}

func (a *AppStore) readPrivateKeyFromFile(keyFile string) (*ecdsa.PrivateKey, error) {
    bytes, err := ioutil.ReadFile(keyFile)
    if err …
Run Code Online (Sandbox Code Playgroud)

go storekit ios jwt jwt-go

4
推荐指数
1
解决办法
4855
查看次数

如何使用 Go 访问 JWT 子声明?

我需要从 Go 中的 JWT 检索子声明的值。

我有(旧的)JWT,我需要在 go 中解析,其中包含一个自定义声明“数据”,其中包含一个由一些字段(用户 ID、用户名)组成的 Json 对象,所以

{ [...standard claims]..., "data":{"id":"123", "name":"JohnDoe"} }
Run Code Online (Sandbox Code Playgroud)

通过 using github.com/dgrijalva/jwt-go,我可以解析令牌并通过以下方式访问声明:

{ [...standard claims]..., "data":{"id":"123", "name":"JohnDoe"} }
Run Code Online (Sandbox Code Playgroud)

这对于标准声明来说效果很好,而且我还从“数据”声明中的 Json-Sub-Object 获取字段名称,但不是字段值(所有空字符串)。我还尝试设置与声明层次结构匹配的结构(外部和内部结构),但没有成功。

访问子声明值的方法是什么?

go jwt jwt-go

3
推荐指数
1
解决办法
1万
查看次数

使用 jwt-go 库 - 密钥类型无效

我正在尝试生成代码中提到的令牌,但尽管我正在使用,但它在这一行给了我错误

tokenString, err := token.SignedString(mySigningKey)因为密钥的类型无效

有什么建议来解决这个问题吗?

谢谢

package main

import (
    "fmt"
    "github.com/dgrijalva/jwt-go"
    "time"
)

var (
    mySigningKey = []byte("secret")
)

func GenerateJWT() (string, error) {

    token := jwt.New(jwt.SigningMethodES256)

    claims := token.Claims.(jwt.MapClaims)

    claims["authorized"] = true
    claims["user"] = "ravi"
    claims["exp"] = time.Now().Add(time.Minute + 30).Unix()

    tokenString, err := token.SignedString(mySigningKey)

    if err != nil {
        fmt.Println(err)
        fmt.Errorf("Something went wrong : %s", err.Error())
        return "", err

    }
    return tokenString, nil
}

func main() {
    tokenString, err := GenerateJWT()
    if err != nil …
Run Code Online (Sandbox Code Playgroud)

go jwt jwt-go

3
推荐指数
1
解决办法
3413
查看次数

Golang 和 JWT - 简单注销

我目前正在开发一个 API,经过一段时间后,我现在了解如何在 Go 中使用 JWT 来获取令牌。使用此令牌,我可以保持用户连接,但是如何从客户端应用程序注销?

这是我的token.go代码:

package main

import (
    "github.com/dgrijalva/jwt-go"
    "time"
)

const (
    tokenEncodeString = "something"
)

func createToken(user User) (string, error) {
    // create the token                                                                                                                                                                                  
    token := jwt.New(jwt.SigningMethodHS256)

    // set some claims                                                                                                                                                                                   
    token.Claims["username"] = user.Username;
    token.Claims["password"] = user.Password;
    token.Claims["exp"] = time.Now().Add(time.Hour * 72).Unix()

    //Sign and get the complete encoded token as string                                                                                                                                                  
    return (token.SignedString([]byte(tokenEncodeString)))
}

func parseToken(unparsedToken string) (bool, string) {
    token, err := jwt.Parse(unparsedToken, func(token *jwt.Token) (interface{}, error) {
            return []byte(tokenEncodeString), nil …
Run Code Online (Sandbox Code Playgroud)

token go logout jwt jwt-go

2
推荐指数
1
解决办法
6423
查看次数

当在循环内创建 JWT 令牌时,在 jwt-go 中获取相同的令牌

我正在使用 jwt-go 库创建 jwt 令牌。后来写了一个脚本来加载测试。我注意到当我发送许多并发请求时获得相同的令牌。为了检查更多信息,我在 for 循环中创建了令牌,结果是相同的。

我使用的库是https://github.com/dgrijalva/jwt-go,go 版本是 1.12.9。

expirationTime := time.Now().Add(time.Duration(60) * time.Minute)

    for i := 1; i < 5; i++ {
        claims := &jwt.StandardClaims{
            ExpiresAt: expirationTime.Unix(),
            Issuer:"telescope",
        }
        _token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
        var jwtKey = []byte("secret_key")
        auth_token, _ := _token.SignedString(jwtKey)
        fmt.Println(auth_token)
    }
Run Code Online (Sandbox Code Playgroud)

go jwt jwt-go

2
推荐指数
1
解决办法
1453
查看次数

无需验证即可解码 JWT 并查找范围

我需要解码我的 JWT 令牌并检查范围是否是“医生”。

我对 GO 知之甚少,但我只需要在我的应用程序中编写一个小片段来扩展现有应用程序,因此它需要用 GO 编写。

这是我尝试解码令牌并检查“Doctor”是否在解码的令牌中,因为我无法专门访问范围。

for k, v := range props {
        token_value := fmt.Sprint(v)
        token_key := fmt.Sprint(cfg.AuthKey)
        if (k == "custom_token_header") && strings.Contains(token_value, token_key) {
            if token, _ := jwt.Parse(token_value, nil); token != nil {
                parsed_token := fmt.Sprint(token)
                log.Infof("Parsed token: " ,parsed_token)
                if strings.Contains(parsed_token, "Doctor")  {
                    log.Infof("user is a Doctor, perform checks...")
                    loc, _ := time.LoadLocation("GMT")
                    now := time.Now().In(loc)
                    hr, _, _ := now.Clock()
                    if hr >= 9 && hr < 5 {
                        log.Infof("success, inside …
Run Code Online (Sandbox Code Playgroud)

go jwt jwt-go

1
推荐指数
1
解决办法
2943
查看次数