gin框架 jwt 如何使用

该博客介绍了如何在Gin Web框架中使用JWT(JSON Web Tokens)进行用户鉴权。通过导入`github.com/golang-jwt/jwt`包,实现了JWT的解析和生成。`JWTAuth`中间件从请求头获取token,验证其有效性,并将用户信息存储在上下文中。此外,`jwt`包提供了`ParseToken`和`GenerateToken`函数,用于解析和创建JWT。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.获取 golang-jwt

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

目录 app/http/middlewares/JWTAuthMiddleware.go

package middlewares

import (
	"gin/pkg/jwt"
	"net/http"

	"github.com/gin-gonic/gin"
)

// JWTAuth 鉴权中间件
func JWTAuth() gin.HandlerFunc {
	return func(c *gin.Context) {
		// 获取请求头中 token,实际是一个完整被签名过的 token;a complete, signed token
		tokenStr := c.GetHeader("Authorization")
		// fmt.Println(tokenStr)
		if tokenStr == "" {
			c.JSON(http.StatusForbidden, "No token. You don't have permission!")
			c.Abort()
			return
		}

		// 解析拿到完整有效的 token,里头包含解析后的 3 segment
		token, err := jwt.ParseToken(tokenStr)
		if err != nil {
			c.JSON(http.StatusForbidden, "Invalid token! You don't have permission!")
			c.Abort()
			return
		}
		// 获取 token 中的 claims
		claims, ok := token.Claims.(*jwt.AuthClaims)
		if !ok {
			c.JSON(http.StatusForbidden, "Invalid token!")
			c.Abort()
			return
		}

		// 将 claims 中的用户信息存储在 context 中
		c.Set("userName", claims.UserName)

		// 这里执行路由 HandlerFunc
		c.Next()
	}
}

目录 pkg/jwt/jwt.go

// Package jwt 处理 JWT 认证
package jwt

import (
	"time"

	"github.com/golang-jwt/jwt"
)

var secretKey = []byte("lwl")

// ParseToken 解析请求头中的 token string,转换成被解析后的 jwt.Token
func ParseToken(tokenStr string) (*jwt.Token, error) {
	// 解析 token string 拿到 token jwt.Token
	return jwt.ParseWithClaims(tokenStr, &AuthClaims{}, func(tk *jwt.Token) (interface{}, error) {
		return secretKey, nil
	})
}

// AuthClaims 是 claims struct
type AuthClaims struct {
	//UserId   uint64 `json:"userId"`
	UserName string `json:"userName"`
	jwt.StandardClaims
}

// GenerateToken 一般在登录之后使用来生成 token 能够返回给前端
func GenerateToken(userName string, expireTime time.Time) (string, error) {
	// 创建一个 claim
	claim := AuthClaims{
		UserName: userName,
		StandardClaims: jwt.StandardClaims{
			// 过期时间
			ExpiresAt: expireTime.Unix(),
			// 签名时间
			IssuedAt: time.Now().Unix(),
			// 签名颁发者
			Issuer: "lwl",
			// 签名主题
			Subject: "gin",
		},
	}

	// 使用指定的签名加密方式创建 token,有 1,2 段内容,第 3 段内容没有加上
	noSignedToken := jwt.NewWithClaims(jwt.SigningMethodHS256, claim)

	// 使用 secretKey 密钥进行加密处理后拿到最终 token string
	return noSignedToken.SignedString(secretKey)
}

登陆


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值