Gin项目中使用JWT

一、jwt添加到gin中

先把使用的包给导入到项目中

"github.com/dgrijalva/jwt-go"

创建一个生成 token的函数,注意要在这里设置一下 密令的内容和过期时间

const TokenExpireDuration = time.Hour * 2 // 密令过期时间
var mySecret = []byte("哈哈哈")  // 密令

type User struct {
      // 结构体
	Uid int64 `json:"uid"`
	Username string `json:"name"`
	jwt.StandardClaims
}

func GenToken(userID int64, userName string) (string, error) {
   
	// 创建一个我们自己的声明
	c := User{
   
		userID, // 自定义字段
		userName,
		jwt.StandardClaims{
   
			ExpiresAt: time.Now().Add(TokenExpireDuration).Unix(), // 过期时间
			Issuer:    "hahaha",                                 // 签发人
		},
	}
	//生成一个 Token 的结构体实例
	token := jwt.NewWithClaims(jwt.SigningMethodHS256,c)
	//使用指定的secret签名并获得完整的编码后的字符串token
	return token.SignedString(mySecret)
}

接着就要去调用这个生成函数了。我这里在登录成功后调用这个函数,然后生成token

为了测试,直接用静态数据进行传值了。

这里 在密令头部加上 Bearer

Bearer是一个认证方案,用于指定请求中所有的身份验证类型。
Bearer 可以告诉服务器,请求中含有一个JWT Token,而不是其他类型的令牌或验证方式。
Bearer当做头部,可以让服务器和其他中间件处理程序采取相应的安全措施,比如就可以在传输过程中使用HTTPS加密

func LoginUser(context *gin.Context)  {
   
	Uid      := 123
	Username := "张三"
	token,_ := utils.GenToken(int64(Uid),Username)
	context.Header("Authorization","Bearer"+token)
}

然后将这个函数在路由中调用就可以了!

image-20240126174405479

当这个Token添加到响应头中,如果我们想在项目的其他接口中 调用这个Token值的内容就可以了

然后通过解析获取 id

context.Request.Header.Get.("Authoriazation")

二、JWT的意义

使用场景

  1. 身份认证:JWT 可以用于用户身份认证,当用户成功登录后,服务器可以生成一个包含用户身份信息的 JWT 并返回给客户端,客户端在接下来的请求中携带这个 JWT,服务器可以通过验证 JWT 的签名来确认用户的身份信息,从而实现无状态的身份认证。
  2. 单点登录(SSO):在分布式系统中,JWT 可以用于实现单点登录,用户在登录成功后,可以获取一个 JWT,并在多个服务之间传递该 JWT,各个服务可以通过验证 JWT 来进行用户身份认证,从而实现用户在多个服务间的无缝登录体验。
  3. 授权:除了身份认证外,JWT 还可以用于授权,即确定用户是否有权访问特定资源或执行特定操作。在 JWT 中可以包含用户的权限信息,服务器可以根据 JWT 中的声明来判断用户是否具有相应的权限。
  4. 信息交换:由于 JWT 可以包含任意 JSON 格式的信息,并且通过数字签名保证了信息的完整性,因此它也可以在各方之间安全地传递信息。

优点

  1. 无需存储在服务器:JWT 将用户信息以 JSON 格式编码后嵌入到令牌中,因此不需要在服务器端维护会话状态,可以降低服务器的负担。
  2. 跨域支持:由于 JWT 可以在请求头或 URL 参数中传递,可以跨域使用,并且可以避免跨域请求时需要共享 Session ID 的问题。
  3. 扩展性:JWT 中可以包含任意 JSON 格式的数据,可以灵活地进行扩展,便于实现各种业务需求。
  4. 自包含性:JWT 中已包含了用户信息和数字签名,可以防止篡改和伪造,因此具有高度的自包含性和安全性。
  5. 简洁性:JWT 的长度比较短,可以通过 Base64 编码来压缩,节省网络带宽。
  6. 解耦合:由于 JWT 是无状态的,可以与任何后端服务进行解耦,方便进行微服务化架构设计。

jwt 和 session 的区别

  1. 储存位置:SESSION 是服务器端存储用户信息的一种机制,通常将用户信息保存在服务器上的内存或数据库中,并通过一个唯一的 Session ID 来与客户端进行关联。而 JWT 是基于令牌的机制,将用户信息以 JSON 格式编码后嵌入到令牌中,通常将令牌存储在客户端的 Cookie 或本地存储中。
  2. 状态管理:SESSION 依赖服务器端来维护用户的登录状态,服务器根据 Session ID 来查找对应的用户信息。而 JWT 是无状态的,令牌中已经包含了用户的身份信息,服务器不需要在自己的存储中查找任何信息,可以直接解析 JWT 来获取用户信息。
  3. 扩展性:SESSION 的扩展性较好,可以在服务器端灵活地操作会话数据,进行各种状态管理操作。而 JWT 的扩展性相对较差,因为 JWT 中已经包含了用户的信息,无法动态修改,如果需要更新用户信息,需要重新生成新的 JWT。
  4. 跨域支持:由于 SESSION 依赖于服务器端存储和检索用户信息,需要考虑跨域请求时如何共享 SESSION ID。而 JWT 可以在跨域请求中直接通过令牌来验证用户身份,避免了跨域共享 SESSION ID 的问题。
  5. 安全性:SESSION 的安全性取决于服务器端的实现和配置,如果服务器端的 SESSION 管理不当,可能会存在会话劫持、会话固定等安全风险。而 JWT 通过数字签名保证了令牌的完整性和真实性,可以防止篡改和伪造。

相关推荐

  1. gin使用JWT

    2024-01-28 21:38:01       65 阅读
  2. gin使用jwt登录验证

    2024-01-28 21:38:01       63 阅读
  3. SpringBoot项目使用JWT令牌进行权限校验

    2024-01-28 21:38:01       54 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-28 21:38:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-28 21:38:01       100 阅读
  3. 在Django里面运行非项目文件

    2024-01-28 21:38:01       82 阅读
  4. Python语言-面向对象

    2024-01-28 21:38:01       91 阅读

热门阅读

  1. 力扣365-水壶问题

    2024-01-28 21:38:01       51 阅读
  2. Mybatis的XML配置

    2024-01-28 21:38:01       51 阅读
  3. MyBatis --- 常用注解

    2024-01-28 21:38:01       54 阅读
  4. 前端-打卡每日面试题-数据类型(2024.1.26)

    2024-01-28 21:38:01       51 阅读
  5. 分巧克力(二分实现C++)

    2024-01-28 21:38:01       50 阅读
  6. 7-2 求二叉树的叶子结点个数

    2024-01-28 21:38:01       52 阅读
  7. 微服务面试题

    2024-01-28 21:38:01       59 阅读
  8. 言传身留:NLP技术引领机器翻译革新

    2024-01-28 21:38:01       41 阅读
  9. Python Appium组件使用详解

    2024-01-28 21:38:01       52 阅读
  10. 更新最近可以使用的 ip归属地免费api

    2024-01-28 21:38:01       54 阅读