Gin(十二):JWT使用

本文介绍了JWT的概念及其在Gin框架中的应用。讲解了JWT的构成,包括HEADER、PAYLOAD和VERIFY SIGNATURE,并详细阐述了JWT的登录原理。接着展示了如何在Gin中生成JWT,以及编写中间件来校验Token的有效性。最后,对JWT的适用场景进行了简要总结,提醒读者理解其局限性。
摘要由CSDN通过智能技术生成

在前后端分离的项目中,越来越多的项目采用 JWT 代替传统的 cookie ,这里我们来使用 JWT 结合 Gin 来作为一个登录授权和权限校验。

?什么是 JWT

JWT 的全称叫做 JSON WEB TOKEN,在目前前后端系统中使用较多。

JWT 构成

JWT 是由三段构成的。分别是 HEADER,PAYLOAD,VERIFY SIGNATURE,它们生成的信息通过 . 分割。

HEADER

header 是由 一个 typalg 组成,typ 会指明为 JWT,而 alg 是所使用的加密算法。

{
   
  "alg": "HS256",
  "typ": "JWT"
}

PAYLOAD

payload 是 JWT 的载体,也就是我们要承载的信息。这段信息是我们可以自定义的,可以定义我们要存放什么信息,那些字段。该部分信息不宜过多,它会影响 JWT 生成的大小,还有就是请勿将敏感数据存入该部分,该端数据前端是可以解析获取 token 内信息的。

官方给了七个默认字段,我们可以不全部使用,也可以加入我们需要的字段。

名称 含义
Audience 表示JWT的受众
ExpiresAt 失效时间
Id 签发编号
IssuedAt 签发时间
Issuer 签发人
NotBefore 生效时间
Subject 主题

VERIFY SIGNATURE

这也是 JWT 的最后一段,该部分是由算法计算完成的。

对刚刚的 header 进行 base64Url 编码,对 payload 进行 base64Url 编码,两端完成编码后通过 . 进行连接起来。

base64UrlEncode(header).base64UrlEncode(payload)

完成上述步骤后,就要通过我们 header 里指定的加密算法对上部分进行加密,同时我们还要插入我们的一个密钥,来确保我的 JWT 签发是安全的。

这便是我们的第三部分。

当三部分都完成后,通过使用 . 将三部分分割,生成了上图所示的 JWT 。

JWT 登录原理

简单的说就是当用户登录的时候,服务器校验登录名称和密码是否正确,正确的话,会生成 JWT 返回给客户端。客户端获取到 JWT 后要进行保存,之后的每次请求都会讲 JWT 携带在头部,每次服务器都会获取头部的 JWT 是否正确,如果正确则正确执行该请求,否者验证失败,重新登录。

?Gin 生成 JWT

go 语言的 JWT 库有很多。jwt.io 上也给出了很多 。这里使用 jwt-go

"github.com/dgrijalva/jwt-go"

我们对登录方法进行改造。

// 省略代码
expiresTime := time.Now().Unix() + int64(config.OneDayOfHours)
claims := jwt.StandardClaims{
   
    Audience:  user.Username,     // 受众
    ExpiresAt: expiresTime,       // 失效时间
    Id:        string(user.ID),   // 编号
    IssuedAt:  time.Now().Unix(), // 签发时间
    Issuer:    "gin hello",       // 签发人
    NotBefore: time.Now().Unix(), // 生效时间
    Subject:   "login",           // 主题
}
var jwtSecret 
使用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 ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值