在 Go 项目中使用 JWT
创始人
2025-05-30 10:07:39

JWT (JSON Web Tokens) 是一种基于 JSON 格式的轻量级身份验证和授权方案。在 Go 项目中使用 JWT,一般需要完成以下步骤:

1. 安装 JWT 库

在 Go 项目中使用 JWT 需要先安装 JWT 库,可以使用以下命令安装:

go get -u github.com/golang-jwt/jwt/v5

将其导入代码中:

import "github.com/golang-jwt/jwt/v5"

2. 创建 JWT

在 Go 项目中,可以使用 JWT 库的 jwt.NewWithClaims() 方法创建 JWT。例如:

// CustomClaims 自定义声明类型 并内嵌jwt.RegisteredClaims
// jwt包自带的jwt.RegisteredClaims只包含了官方字段
// 假设我们这里需要额外记录一个username字段,所以要自定义结构体
// 如果想要保存更多信息,都可以添加到这个结构体中
type CustomClaims struct {// 可根据需要自行添加字段UserID               int64  `json:"user_id"`Username             string `json:"username"`jwt.RegisteredClaims        // 内嵌标准的声明
}// GenToken 生成JWT
func GenToken(userId int64, username string) (string, error) {// 创建一个我们自己声明的数据claims := CustomClaims{userId,username, // 自定义字段jwt.RegisteredClaims{ExpiresAt: jwt.NewNumericDate(time.Now().Add(time.Hour * 24)),	// 定义过期时间Issuer:    "somebody", // 签发人},}token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)// 生成签名字符串return token.SignedString([]byte("secret-key"))
}

在上面的例子中,使用 jwt.MapClaims 定义了需要存储在 JWT 中的数据,使用 jwt.NewWithClaims() 方法创建了 JWT,然后使用 SignedString() 方法生成了签名字符串。

3. 验证 JWT

在 Go 项目中,可以使用 JWT 库的 jwt.Parse() 方法验证 JWT。例如:

import ("github.com/golang-jwt/jwt/v5"
)func ParseToken(tokenString string) (*CustomClaims, error) {// 解析tokenvar mc = new(CustomClaims)token, err := jwt.ParseWithClaims(tokenString, mc, func(token *jwt.Token) (i interface{}, err error) {return CustomSecret, nil})if err != nil {return nil, err}// 对token对象中的Claim进行类型断言if token.Valid { // 校验tokenreturn mc, nil}return nil, errors.New("invalid token")
}

在上面的例子中,使用 jwt.Parse() 方法解析 JWT,并在回调函数中检查签名算法和返回签名字符串。然后检查 token 是否有效,并从中提取出需要的数据。

以上就是在 Go 项目中使用 JWT 的基本步骤。需要注意的是,在实际应用中,需要更加严格地设置 JWT 的有效期、密钥等参数,以确保安全性。

4. 在项目中的使用

一般地,我们使用token进行鉴权的时候,使用gin中的中间件来对许多需要鉴权的请求进行判断,中间件的具体内容:

func JWTAuthMiddleware() func(c *gin.Context) {return func(c *gin.Context) {//获取到请求头中的tokenauthHeader := c.Request.Header.Get("Authorization")if authHeader == "" {c.JSON(http.StatusOK, &model.ResponseData{Code: 200,Msg:  "访问失败,请登录!",Data: nil,})c.Abort()return}// 按空格分割parts := strings.SplitN(authHeader, " ", 2)if !(len(parts) == 2 && parts[0] == "Bearer") {c.JSON(http.StatusOK, &model.ResponseData{Code: 200,Msg:  "访问失败,无效的token,请登录!",Data: nil,})c.Abort()return}// parts[1]是获取到的tokenString,我们使用之前定义好的解析JWT的函数来解析它mc, err := util.ParseToken(parts[1])if err != nil {c.JSON(http.StatusOK, &model.ResponseData{Code: 200,Msg:  "访问失败,无效的token,请登录!",Data: nil,})c.Abort()return}// 将当前请求的userID信息保存到请求的上下文c上c.Set("userID", mc.UserID)c.Next() // 后续的处理函数可以用过c.Get("username")来获取当前请求的用户信息}
}

相关内容

热门资讯

中外对话丨中外专家警告:日本主...   中新网北京12月15日电 题:中外专家警告:日本主动调整军事战略,或走向穷兵黩武  作者 管娜 ...
夏某某(男,大专学历)隐瞒精神... 转自:扬子晚报2024年参军入伍后在安徽出现精神类障碍被退回,2025年隐瞒病史后入伍再被退兵……1...
告别纸上谈兵!AI 培训找哪个...   炒股就看金麒麟分析师研报,权威,专业,及时,全面,助您挖掘潜力主题机会! (来源:雷达财经)“...
一图读懂vivo S50:田曦...   炒股就看金麒麟分析师研报,权威,专业,及时,全面,助您挖掘潜力主题机会! (来源:快科技)快科...
监管部门出手整治不正当价格行为... 近日,国家市场监督管理总局研究起草了《汽车行业价格行为合规指南(征求意见稿)》(下称《指南》),并向...