在Gin框架中使用JWT

JWT(JSON Web令牌)

通过JSON形式作为Web应用中的令牌,用于在各方之间安全地将信息作为JSON对象传输,可以避免被别人篡改,以及在用户认证授权方面相对于传统Session减小了开销。

工作方式图:JWT认证 | Light文档JWT认证 | Light文档

Gin框架中使用JWT可以提供身份验证和授权功能。

1. 导入依赖

首先,导入需要的依赖包:

import (
	"github.com/gin-gonic/gin"
	"github.com/dgrijalva/jwt-go"
	"time"
)
  • gin:Gin框架的主要依赖包。
  • jwt-go:JWT的Go语言实现。

2. 定义JWT中间件

func JWTMiddleware() gin.HandlerFunc {
	return func(c *gin.Context) {
		tokenString := c.GetHeader("Authorization")
		if tokenString == "" {
			c.JSON(http.StatusUnauthorized, gin.H{"error": "Unauthorized"})
			c.Abort()
			return
		}

		token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
			return []byte("secret"), nil
		})

		if err != nil || !token.Valid {
			c.JSON(http.StatusUnauthorized, gin.H{"error": "Unauthorized"})
			c.Abort()
			return
		}

		claims, ok := token.Claims.(jwt.MapClaims)
		if !ok {
			c.JSON(http.StatusUnauthorized, gin.H{"error": "Unauthorized"})
			c.Abort()
			return
		}

		c.Set("user_id", claims["user_id"])

		c.Next()
	}
}
  • JWTMiddleware是一个Gin中间件函数,用于验证JWT令牌。它会在每个请求到达处理器之前被调用。
  • 首先,从请求的Header中获取Authorization字段的值,该字段应为以"Bearer "开头的JWT令牌。
  • 如果令牌为空,则返回未授权的错误响应,并中断请求处理。
  • 使用jwt.Parse方法解析JWT令牌,传入的回调函数用于验证签名。这里的示例中,使用了一个固定的字符串作为签名验证的密钥,实际使用时应该使用更安全的方式存储和获取密钥。
  • 如果解析出错或令牌无效,则返回未授权的错误响应,并中断请求处理。
  • 如果解析成功,将令牌中的用户ID存储到Gin的上下文中,以便后续处理器可以使用。
  • 最后,调用c.Next()继续执行后续的处理器。

3. 使用JWT中间件

func main() {
	r := gin.Default()

	// 使用JWT中间件
	r.Use(JWTMiddleware())

	// 定义路由
	r.GET("/api/user", func(c *gin.Context) {
		// 从上下文中获取用户ID
		userID, _ := c.Get("user_id")
		c.JSON(http.StatusOK, gin.H{"user_id": userID})
	})

	// 启动服务器
	r.Run(":8080")
}
  • main函数中,创建一个默认的Gin引擎。
  • 使用r.Use(JWTMiddleware())将JWT中间件添加到全局中间件链中,以便对所有请求进行JWT验证。
  • 定义了一个GET请求的处理器,路径为/api/user。在处理器内部,可以通过c.Get("user_id")来获取之前在中间件中存储的用户ID。
  • 最后,调用r.Run(":8080")启动Gin服务器。

这样,当请求到达/api/user路径时,会先经过JWT中间件进行JWT验证。如果验证通过,处理器会返回用户ID的JSON响应;如果验证失败,处理器会返回未授权的错误响应。

以上只是实现了jwt的简单功能,方便理解。在实际的项目中,应该使用更加完善的demo结构。

使用Gin框架使用JWT的过程,可以借助GitHub上别人封装好的包来简化开发工作,比如GitHub - appleboy/gin-jwt: JWT Middleware for Gin framework。这个包提供了JWT身份验证间件,并且还包含其他处理程序功能,比如生成令牌的登录API和刷新令牌的处理程序。你可以通过自定义Claims来实现JWT的个性化设置,同时还需要进行前期准备,生成和解析JWT令牌。总之,使用这个JWT间件可以使得在Gin框架使用JWT更加方便和安全。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [在gin框架使用JWT](https://blog.csdn.net/m0_56137272/article/details/127121590)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [在Gin框架使用JWT](https://blog.csdn.net/Gherbirthday0916/article/details/129517817)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [gin-jwt:JWT Gin间件框架](https://download.csdn.net/download/weixin_42169674/18199212)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值