iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >gin框架中怎么使用JWT
  • 860
分享到

gin框架中怎么使用JWT

2023-06-30 04:06:22 860人浏览 泡泡鱼
摘要

这篇文章主要讲解了“gin框架中怎么使用Jwt”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“gin框架中怎么使用JWT”吧!什么是JWT?JWT全称JSON WEB Token是一种跨域认证

这篇文章主要讲解了“gin框架中怎么使用Jwt”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“gin框架中怎么使用JWT”吧!

    什么是JWT?

    JWT全称JSON WEB Token是一种跨域认证解决方案,属于一个开放的标准,它规定了一种Token实现方式,目前多用于前后端分离项目和OAuth4.0业务场景下。

    为什么需要JWT?

    在之前的一些web项目中,我们通常使用的是Cookie-Session模式实现用户认证。相关流程大致如下:

    • 用户在浏览器端填写用户名和密码,并发送给服务端

    • 服务端对用户名和密码校验通过后会生成一份保存当前用户相关信息的session数据和一个与之对应的标识(通常称为session_id)

    • 服务端返回响应时将上一步的session_id写入用户浏览器的Cookie

    • 后续用户来自该浏览器的每次请求都会自动携带包含session_id的Cookie

    • 服务端通过请求中的session_id就能找到之前保存的该用户那份session数据,从而获取该用户的相关信息。

    这种方案依赖于客户端(浏览器)保存Cookie,并且需要在服务端存储用户的session数据。

    在移动互联网时代,我们的用户可能使用浏览器也可能使用APP来访问我们的服务,我们的web应用可能是前后端分开部署在不同的端口,有时候我们还需要支持第三方登录,这下Cookie-Session的模式就有些力不从心了。

    JWT就是一种基于Token的轻量级认证模式,服务端认证通过后,会生成一个jsON对象,经过签名后得到一个Token(令牌)再发回给用户,用户后续请求只需要带上这个Token,服务端解密之后就能获取该用户的相关信息了。

    想要连接JWT的原理,推荐大家阅读:阮一峰的JWT入门教程

    生成JWT和解析JWT

    我们在这里直接使用jwt-Go这个库来实现我们生成JWT和解析JWT的功能。

    定义需求

    我们需要定制自己的需求来决定JWT中保存哪些数据,比如我们规定在JWT中要存储username信息,那么我们就定义一个MyClaims结构体如下:

    import ("GitHub.com/dgrijalva/jwt-go")// MyClaims 自定义声明结构体并内嵌jwt.StandardClaims// jwt包自带的jwt.StandardClaims只包含了官方字段// 我们这里需要额外记录一个username字段,所以要自定义结构体// 如果想要保存更多信息,都可以添加到这个结构体中type MyClaims struct {Username string `json:"username"`jwt.StandardClaims}

    然后我们定义JWT的过期时间,这里以2小时为例:

    const TokenExpireDuration = time.Hour * 2

    接下来还需要定义Secret:

    var MySecret = []byte("夏天夏天悄悄过去")

    生成JWT

    // GenToken 生成JWTfunc GenToken(username string) (string, error) {// 创建一个我们自己的声明c := MyClaims{"username", // 自定义字段jwt.StandardClaims{ExpiresAt: time.Now().Add(TokenExpireDuration).Unix(), // 过期时间Issuer:    "my-project",                               // 签发人},}// 使用指定的签名方法创建签名对象token := jwt.NewWithClaims(jwt.SigningMethodHS256, c)// 使用指定的secret签名并获得完整的编码后的字符串tokenreturn token.SignedString(MySecret)}

    解析JWT

    // ParseToken 解析JWTfunc ParseToken(tokenString string) (*MyClaims, error) {// 解析tokentoken, err := jwt.ParseWithClaims(tokenString, &MyClaims{}, func(token *jwt.Token) (i interface{}, err error) {return MySecret, nil})if err != nil {return nil, err}if claims, ok := token.Claims.(*MyClaims); ok && token.Valid { // 校验tokenreturn claims, nil}return nil, errors.New("invalid token")}

    在gin框架中使用JWT

    首先我们注册一条路由/auth,对外提供获取Token的渠道:

    r.POST("/auth", authHandler)

    我们的authHandler定义如下:

    func authHandler(c *gin.Context) {// 用户发送用户名和密码过来var user UserInfoerr := c.ShouldBind(&user)if err != nil {c.JSON(Http.StatusOK, gin.H{"code": 2001,"msg":  "无效的参数",})return}// 校验用户名和密码是否正确if user.Username == "q1mi" && user.PassWord == "q1mi123" {// 生成TokentokenString, _ := GenToken(user.Username)c.JSON(http.StatusOK, gin.H{"code": 2000,"msg":  "success","data": gin.H{"token": tokenString},})return}c.JSON(http.StatusOK, gin.H{"code": 2002,"msg":  "鉴权失败",})return}

    用户通过上面的接口获取Token之后,后续就会携带着Token再来请求我们的其他接口,这个时候就需要对这些请求的Token进行校验操作了,很显然我们应该实现一个检验Token的中间件,具体实现如下:

    // JWTAuthMiddleware 基于JWT的认证中间件func JWTAuthMiddleware() func(c *gin.Context) {return func(c *gin.Context) {// 客户端携带Token有三种方式 1.放在请求头 2.放在请求体 3.放在URI// 这里假设Token放在Header的Authorization中,并使用Bearer开头// 这里的具体实现方式要依据你的实际业务情况决定authHeader := c.Request.Header.Get("Authorization")if authHeader == "" {c.JSON(http.StatusOK, gin.H{"code": 2003,"msg":  "请求头中auth为空",})c.Abort()return}// 按空格分割parts := strings.SplitN(authHeader, " ", 2)if !(len(parts) == 2 && parts[0] == "Bearer") {c.JSON(http.StatusOK, gin.H{"code": 2004,"msg":  "请求头中auth格式有误",})c.Abort()return}// parts[1]是获取到的tokenString,我们使用之前定义好的解析JWT的函数来解析它mc, err := ParseToken(parts[1])if err != nil {c.JSON(http.StatusOK, gin.H{"code": 2005,"msg":  "无效的Token",})c.Abort()return}// 将当前请求的username信息保存到请求的上下文c上c.Set("username", mc.Username)c.Next() // 后续的处理函数可以用过c.Get("username")来获取当前请求的用户信息}}

    注册一个/home路由,发个请求验证一下吧。

    r.GET("/home", JWTAuthMiddleware(), homeHandler)func homeHandler(c *gin.Context) {username := c.MustGet("username").(string)c.JSON(http.StatusOK, gin.H{"code": 2000,"msg":  "success","data": gin.H{"username": username},})}

    感谢各位的阅读,以上就是“gin框架中怎么使用JWT”的内容了,经过本文的学习后,相信大家对gin框架中怎么使用JWT这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

    --结束END--

    本文标题: gin框架中怎么使用JWT

    本文链接: https://www.lsjlt.com/news/327327.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    本篇文章演示代码以及资料文档资料下载

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档
    猜你喜欢
    • gin框架中怎么使用JWT
      这篇文章主要讲解了“gin框架中怎么使用JWT”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“gin框架中怎么使用JWT”吧!什么是JWT?JWT全称JSON Web Token是一种跨域认证...
      99+
      2023-06-30
    • Gin框架中bind怎么使用
      本篇内容主要讲解“Gin框架中bind怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Gin框架中bind怎么使用”吧!概述Gin框架中,有bind函数可以非常方便的将url的查询参数qu...
      99+
      2023-06-22
    • gin框架中使用JWT的定义需求及解析
      目录什么是JWT?为什么需要JWT?生成JWT和解析JWT定义需求生成JWT解析JWT在gin框架中使用JWT什么是JWT? JWT全称JSON Web Token是一种跨域认证解决...
      99+
      2024-04-02
    • golang中gin框架接入jwt使用token验证身份
      目录jwt 流程: 1.token 工具类 2. 使用该中间件 3. controller部分代码 jwt jwt的原理和session有点相像,其目的是为了解决rest api中...
      99+
      2024-04-02
    • golang中gin框架接入jwt如何使用token验证身份
      本篇内容介绍了“golang中gin框架接入jwt如何使用token验证身份”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!jwtjwt的原理...
      99+
      2023-06-22
    • Gin框架怎么使用panic处理中间件
      这篇文章主要介绍“Gin框架怎么使用panic处理中间件”,在日常操作中,相信很多人在Gin框架怎么使用panic处理中间件问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Gin框架怎么使用panic处理中间件...
      99+
      2023-07-06
    • 浅谈Gin框架中bind的使用
      目录概述Binding接口context.Bindcnotext.MustBindWithShouldBindWithcontext.BindJSONcontext.ShouldBi...
      99+
      2024-04-02
    • Golang中Gin框架的使用入门教程
      目录安装与简单测试常见请求与分组请求获取参数 与 参数合法性验证获得query中参数获得multipart/urlencoded form中的参数模型绑定和参数验证自定义参数验证项目...
      99+
      2024-04-02
    • Golang怎么使用Gin框架实现HTTP上传文件
      本文小编为大家详细介绍“Golang怎么使用Gin框架实现HTTP上传文件”,内容详细,步骤清晰,细节处理妥当,希望这篇“Golang怎么使用Gin框架实现HTTP上传文件”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知...
      99+
      2023-07-05
    • Python Web框架Django怎么使用jwt获取用户信息
      这篇文章主要介绍“Python Web框架Django怎么使用jwt获取用户信息”,在日常操作中,相信很多人在Python Web框架Django怎么使用jwt获取用户信息问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对...
      99+
      2023-06-01
    • Gin框架使用panic处理中间件问题详解
      目录背景实现总结背景 在 Gin 框架中,错误处理和 panic 处理是非常重要的功能。当处理 HTTP 请求时,可能会出现各种各样的错误,例如数据库连接错误、网络错误、权限问题等等...
      99+
      2023-05-15
      Gin panic处理中间件 Gin panic中间件 Gin处理中间件
    • golang怎么使用Gin框架实现短信验证码功能
      golang怎么使用Gin框架实现短信验证码功能,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。使用json配置文件// 配置文件 "...
      99+
      2023-06-20
    • Gin-Gonic 框架中间件原理与应用
      在 Go 的世界里, web 框架简直多如牛毛.前有自带电池的标准库(net/http), 后有简洁优雅的 Gin-Gonic(以下简称 Gin), 再有全栈开发一枝花 Beego, 等等不可胜数.使用 Go 有一段时间了, web 开发一...
      99+
      2024-04-02
    • Gin 框架中的自定义验证
      “纵有疾风来,人生不言弃”,这句话送给正在学习Golang的朋友们,也希望在阅读本文《Gin 框架中的自定义验证》后,能够真的帮助到大家。我也会在后续的文章中,陆续更新Golang相关的技术文章,有...
      99+
      2024-04-05
    • Gin-高性能 Golang Web框架的介绍和使用
      偶遇 Gin 我之前一直在使用 Beego 框架来做应用的 Api,因为它的写法跟 PHP 的 MVC 一样,上手简单,所以对它的表现还算满意。用的久了,发现 Beego 的编程思想就是照搬了 PHP 的那一套,写法上倒没什么,但是在...
      99+
      2024-04-02
    • go语言gin框架中间件详解
      目录1、gin框架限流中间件2、gin框架跨域中间件 3、gin框架数据库中间件4、gin框架redis中间件5、gin框架es中间件6、gin框架rabbitMQ中间件7...
      99+
      2023-05-16
      go语言gin框架中间件 gin框架中间件 go gin框架中间件 go 中间件
    • Golang中tinyrpc框架怎么使用
      本篇内容介绍了“Golang中tinyrpc框架怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!tinyrpc功能tinyrpc基于T...
      99+
      2023-07-05
    • Java中怎么使用Sinatra框架
      这篇文章主要讲解了“Java中怎么使用Sinatra框架”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java中怎么使用Sinatra框架”吧!Sinatra 是一个微型的 Ruby 语言的...
      99+
      2023-06-17
    • Python中tornado框架怎么使用
      Tornado 是一个Python的web框架和异步网络库,可以用于构建高性能的web应用程序。下面是一个简单的使用Tornado框...
      99+
      2024-03-01
      Python tornado
    • Java中怎么使用Nutz框架
      使用Nutz框架在Java中进行开发可以按照以下步骤进行:1. 导入Nutz框架的相关依赖:在项目的构建文件(如Maven的pom....
      99+
      2023-08-24
      Java Nutz
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作