千家信息网

gin框架中怎么使用JWT

发表于:2024-11-27 作者:千家信息网编辑
千家信息网最后更新 2024年11月27日,这篇文章主要讲解了"gin框架中怎么使用JWT",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"gin框架中怎么使用JWT"吧!什么是JWT?JWT全称J
千家信息网最后更新 2024年11月27日gin框架中怎么使用JWT

这篇文章主要讲解了"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签名并获得完整的编码后的字符串token        return token.SignedString(MySecret)}

    解析JWT

    // ParseToken 解析JWTfunc ParseToken(tokenString string) (*MyClaims, error) {        // 解析token        token, 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 { // 校验token                return claims, nil        }        return nil, errors.New("invalid token")}

    在gin框架中使用JWT

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

    r.POST("/auth", authHandler)

    我们的authHandler定义如下:

    func authHandler(c *gin.Context) {        // 用户发送用户名和密码过来        var user UserInfo        err := c.ShouldBind(&user)        if err != nil {                c.JSON(http.StatusOK, gin.H{                        "code": 2001,                        "msg":  "无效的参数",                })                return        }        // 校验用户名和密码是否正确        if user.Username == "q1mi" && user.Password == "q1mi123" {                // 生成Token                tokenString, _ := 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这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

    用户 服务 信息 生成 框架 浏览器 浏览 认证 密码 数据 用户名 结构 字段 方式 模式 学习 业务 中间件 内容 函数 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 远程抄表软件开发 福建服务器电源哪家便宜 2008数据库附加失败 软件开发服务资质三级认证机构 方舟服务器管理命令 网络技术对学科教学的影响 5G网络技术有哪些信息 交通行业数据库加密价格 金字塔软件 使用数据库 南京企业网络安全准入控制供应商 深圳服务器电源排名 上虞手机游戏软件开发定制 电脑带网络安全模式能玩游戏吗 自考软件开发专业哪个好 灵创优动网络技术怎么关闭 数据库中外键到底有什么用 网络技术经理招聘 方舟5323服务器 苏州推广软件开发供应商 如何看待网络安全教育走进校园 怎么访问远程服务器 代理服务器pro 浦东新区市场软件开发咨询热线 ca服务器地址是什么意思 中国香港文档软件开发哪家强 ipfs分布式存储服务器上市公司 软件开发项目进度计划甘特图 客服电话无法连接服务器 如何找网上网络技术人才 导致服务器瘫痪的插件
    0