Golang中如何设置JSON Web Token(JWT)的过期时间

Golang中如何设置JSON Web Token(JWT)的过期时间 大家好

有谁知道如何使用Go语言验证JWT JSON令牌的过期日期。 我的环境是Tyk API网关。

谢谢

5 回复

难道不应该是 time.Now().Before(time.UnixMicro(jwtexp*1000000)) 吗?

exp 过期时间标识了在此时间点及之后,JWT 不得 被接受处理。该值必须是一个 NumericDate:[9] 可以是整数或小数,表示自 1970-01-01 00:00:00Z 以来的秒数。

time.Now().Before(time.UnixMicro(jwtexp*1000000))

更多关于Golang中如何设置JSON Web Token(JWT)的过期时间的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


你好。 谢谢。请问是否有公开可用的 Go JWT 包可供我使用或导入?

如果我创建了一个 Go 模块,如何将其转换为插件以便在 Tyk 中使用? 下面的链接展示了如何操作:

favicon.ico

plugin package - plugin - pkg.go.dev

Package plugin implements loading and symbol resolution of Go plugins.

但是,能否帮忙解释一下,因为我是 Go 语言的新手?谢谢

我对Tyk完全不熟悉,但看起来你可能是想创建一个中间件插件。除了Jeff发布的那些链接,你检查过这个吗?

https://tyk.io/docs/plugins/supported-languages/golang/

看起来你也在寻找一个Go模块来帮助你处理JWT。这个库维护得很好,我在几个项目中使用过它:

GitHub - golang-jwt/jwt: Community maintained clone of...

GitHub - golang-jwt/jwt: Community maintained clone of…

所以,按照Tyk文档创建一个中间件,然后使用那个库解析JWT,并根据过期日期设置一个头部或对响应进行一些操作。

JSON Web Token(JWT,发音与单词"jot"相同,读作 /dʒɒt/)是一项提议的互联网标准,用于创建带有可选签名和/或可选加密的数据,其有效载荷包含声明某些声明的JSON。令牌使用私钥或公钥/私钥进行签名。

例如,服务器可以生成一个包含"以管理员身份登录"声明的令牌,并将其提供给客户端。客户端随后可以使用该令牌来证明其是以管理员身份登录的…

这是一个插件教程:

Writing Modular Go Programs with Plugins

使用插件编写模块化Go程序

隐藏在Go 1.8版本引入的众多重要特性之中的是一个新的Go插件系统。此功能让程序员能够…

阅读时间:7分钟

在Go中设置和验证JWT的过期时间,可以使用github.com/golang-jwt/jwt/v5库。以下是具体实现:

1. 生成带过期时间的JWT令牌:

package main

import (
    "fmt"
    "time"
    "github.com/golang-jwt/jwt/v5"
)

func generateToken(secretKey string) (string, error) {
    // 创建声明,设置过期时间
    claims := jwt.MapClaims{
        "username": "john_doe",
        "exp":      time.Now().Add(24 * time.Hour).Unix(), // 24小时后过期
        "iat":      time.Now().Unix(),
    }
    
    token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
    return token.SignedString([]byte(secretKey))
}

2. 验证JWT令牌(包含过期时间验证):

func validateToken(tokenString, secretKey string) (*jwt.Token, error) {
    token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
        // 验证签名方法
        if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
            return nil, fmt.Errorf("unexpected signing method: %v", token.Header["alg"])
        }
        return []byte(secretKey), nil
    })
    
    if err != nil {
        return nil, err
    }
    
    // 自动验证过期时间(exp claim)
    if !token.Valid {
        return nil, fmt.Errorf("token is invalid")
    }
    
    return token, nil
}

3. 在Tyk API网关环境中使用:

Tyk通常会自动验证JWT的过期时间。如果你需要自定义验证逻辑:

// Tyk中间件示例
func JWTMiddleware(secretKey string) gin.HandlerFunc {
    return func(c *gin.Context) {
        authHeader := c.GetHeader("Authorization")
        if authHeader == "" {
            c.JSON(401, gin.H{"error": "Authorization header required"})
            c.Abort()
            return
        }
        
        tokenString := strings.Replace(authHeader, "Bearer ", "", 1)
        token, err := validateToken(tokenString, secretKey)
        
        if err != nil {
            c.JSON(401, gin.H{"error": "Invalid token: " + err.Error()})
            c.Abort()
            return
        }
        
        // 获取声明信息
        if claims, ok := token.Claims.(jwt.MapClaims); ok {
            c.Set("username", claims["username"])
        }
        
        c.Next()
    }
}

4. 自定义过期时间验证(如果需要手动检查):

func checkTokenExpiration(tokenString, secretKey string) error {
    token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
        return []byte(secretKey), nil
    }, jwt.WithValidMethods([]string{"HS256"}))
    
    if err != nil {
        return err
    }
    
    // 手动提取并验证过期时间
    if claims, ok := token.Claims.(jwt.MapClaims); ok {
        if exp, ok := claims["exp"].(float64); ok {
            expTime := time.Unix(int64(exp), 0)
            if time.Now().After(expTime) {
                return fmt.Errorf("token expired at %v", expTime)
            }
        } else {
            return fmt.Errorf("exp claim not found or invalid")
        }
    }
    
    return nil
}

5. 使用jwt.RegisteredClaims(推荐):

type CustomClaims struct {
    Username string `json:"username"`
    jwt.RegisteredClaims
}

func generateTokenWithRegisteredClaims(secretKey string) (string, error) {
    claims := CustomClaims{
        Username: "john_doe",
        RegisteredClaims: jwt.RegisteredClaims{
            ExpiresAt: jwt.NewNumericDate(time.Now().Add(24 * time.Hour)),
            IssuedAt:  jwt.NewNumericDate(time.Now()),
            NotBefore: jwt.NewNumericDate(time.Now()),
            Issuer:    "my-app",
        },
    }
    
    token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
    return token.SignedString([]byte(secretKey))
}

在Tyk网关中,确保在API定义中正确配置了JWT验证,Tyk会自动处理过期时间验证。如果需要自定义逻辑,可以在Tyk的中间件或自定义验证函数中实现上述代码。

回到顶部