首页 > 其他分享 >gin 使用 jwt

gin 使用 jwt

时间:2024-01-26 17:56:53浏览次数:22  
标签:return ctx jwt JWT token 使用 gin

作用

JWT 的主要作用是方便客戶端與伺服器之間的身份驗證。 使用JWT 可以在不需要每次登入的情況下,在客戶端與伺服器之間安全地傳遞封裝身份信息。 它還可以用於許多其他用途,例如串接多個服務,並將數據在服務間安全地傳遞。

简单类说jwt作用在c/s模型中的通信过程中,用于验证c端是否具有访问权限。

一般在jwt中包含一些基本信息,包括用户名,时间戳等。可以在一定承担上防止重放攻击。

注意:自jwt的内容部分,切勿包含任何如密码等敏感信息,因为jwt是使用明文传递的。

在jwt中需要双发线下协商一个所secret,在之后的请求中c端将使用这个secret最jwt做签名,服务端使用这个secret验证签名,签名的内容明文传输。

在gin中使用jwt

gin可以使用中间件的形式完成jwt校验

	// node config group
	nodeGroup := router.Group(methods.NodeTag, methods.JWTMiddleware())
	initNodeConfigControllers(nodeGroup)

以上是在 NodeTag 这个请求组里面添加JWT校验,这样只作用与这一个请求组,也可以针对某个请求做校验或全部请求都做校验。

注意,一般将JWT的token放在请求头里面,不要放在请求体里面

JWT校验函数一般格式

func JWTMiddleware() gin.HandlerFunc {
	return func(ctx *gin.Context) {
		user_token := ctx.GetHeader("Authorization")
		token, err := jwt.Parse(user_token, 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(configuration.GetToken()), nil // 此处GetToken得到的就是双发协定好的secret
		})
		if err != nil {
			log.Error("Token parsing error", "err", err)
			ReturnErrorResp(ctx, http.StatusUnauthorized, PermissionError, err.Error())
			ctx.Abort()
			return
		}

		// 验证解析后的令牌是否有效
		if !token.Valid {
			log.Error("Invalid token")
			ReturnErrorResp(ctx, http.StatusUnauthorized, PermissionError, "token is ill")
			ctx.Abort()
			return
		} else {
			// 从令牌中提取有效载荷 (claims)
			claims, ok := token.Claims.(jwt.MapClaims)
			if ok {
				if !claims.VerifyExpiresAt(time.Now().Unix(), true) {
					log.Error("jwt token timeout")
					ReturnErrorResp(ctx, http.StatusUnauthorized, PermissionError, "token is ill")
					ctx.Abort()
					return
				}
			} else {
				log.Error("Invalid token claims")
				ReturnErrorResp(ctx, http.StatusUnauthorized, PermissionError, "token is ill")
				ctx.Abort()
				return
			}
		}
		ctx.Next()
	}
}

标签:return,ctx,jwt,JWT,token,使用,gin
From: https://www.cnblogs.com/blogforeverything/p/17990284

相关文章

  • 03.基本性能监控系使用
    基本性能监控系统组成 Collectd+InfluxdDB+GrafanaCollectd是一个守护(daemon)进程,用来定期收集系统和应用程序的性能指标,同时提供了以不同的方式来存储这些指标值的机制;InfluxDB开源的、高性能的时序型数据库Grafana一个非常酷的数据可视化平台,常常应用于显示......
  • XPath基本语法的使用
    xpath基本语法https://www.jb51.net/program/306644fge.htmhttps://www.cnblogs.com/wu-wu/p/11642992.htmlhttps://blog.csdn.net/Once_day/article/details/129869027XPath语法|菜鸟教程https://zhuanlan.zhihu.com/p/3429030851.XPath概述1.1概述下面是关于xpath的概述......
  • V4l2 简单介绍和使用
    概述:Videoforlinux2(简称V4L2),是linux中关于视频设备的内核驱动。它也是linux操作系统下用于采集图片、视频和音频数据的API接口,配合适当的视频采集设备和相应的驱动程序;作用:支持许多USB网络摄像头,电视调谐器和相关设备,使它们的输出标准化,因此程序员可以轻松地向其应用程序......
  • 使用Visual Studio调试微软源代码
    思维导航前言VisualStudio更多实用技巧取消选中启用仅我的代码选中启用源链接支持选中启用符号服务器启用在模块加载时取消JIT优化(仅限托管)[可选]启用VisualStudio调试源码DotNetGuide技术社区交流群前言在我们日常开发过程中常常会使用到很多其他封装好的第......
  • rpa使用自带数据抓取方式抓取页面元素
    大家好,我是一方。今天我们一起看一下如何使用rpa自带的功能来抓取自己想要的页面元素,这里我们以抖音为例来抓取某个领域的作者列表。想要获取页面元素,大概的流程为:确定页面元素、分析页面元素、使用自带的工具便捷抓取元素。我们正式开始,首先新建一个抖音作者列表的项目,并快速......
  • Mygin实现中间件Middleware
    本篇是mygin的第六篇,参照gin框架,感兴趣的可以从Mygin第一篇开始看,Mygin从零开始完全手写,在实现的同时,带你一窥gin框架的核心原理实现。目的实现中间件Middleware在上一篇Mygin实现分组路由Group中,实现了路由分组,且同一分组的执行,会先执行Group,有一点点中间件的雏形了。但......
  • Python中为何使用新语法而不是装饰器来实现async/await异步功能
    Python是一种多范式编程语言,通过引入新的语法和特性,不断提升其功能和灵活性。在异步编程领域,Python引入了async/await关键字来实现协程和异步操作,而不是使用已有的装饰器语法。本文将探讨为何Python选择引入新语法来实现async/await异步功能,以及与装饰器的区别和优势。一、理解异步......
  • 使用 Python 的 Paramiko 库实现远程文件复制
    本文将介绍如何使用Paramiko库在Python中实现远程访问并复制文件到本地。Paramiko是一个用于SSHv2协议的Python实现,它提供了简单而强大的功能来进行远程操作。我们将学习如何建立SSH连接、执行远程命令以及复制文件到本地。一、安装Paramiko首先,我们需要安装Paramiko库。可以使用pi......
  • 生成nginx证书
    生成NginxSSL证书的基本步骤如下:准备证书签发请求文件(CSR--即证书签名申请(CertificateSigningRequest)):opensslreq-new-nodes-sha256-newkeyrsa:2048-keyoutserver.key-outserver.csrOrganizationName:公司名称,可以是中文或英文。OrganizationalUnitName:部门......
  • 使用Java读取Excel文件数据
    通过编程方式读取Excel数据能实现数据导入、批量处理、数据比对和更新等任务的自动化。这不仅可以提高工作效率还能减少手动处理的错误风险。此外读取的Excel数据可以与其他系统进行交互或集成,实现数据的无缝传输和共享,满足特定项目的需求。本文将从以下三个方面介绍如何通过Java......