热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

gin框架使用JWT鉴定权限

文章目录简介引入源码代码模型router中写法middlerware中写法ParseToken解析tokenstring*jwt.TokensecretKey密钥AuthClai

文章目录

  • 简介
  • 引入
  • 源码
  • 代码模型
  • router 中写法
  • middlerware 中写法
  • ParseToken 解析 token string => *jwt.Token
  • secretKey 密钥
  • AuthClaims 结构体
  • GenerateToken 生成 *jwt.Token
  • login 登录后响应头设置 COOKIE
  • 常规 HandlerFunc 使用用户信息


简介

目前主流的 gin 的鉴权框架有 github 上的 dgrijalva/jwt-go 和 golang-jwt/jwt,但是 dgrijalva/jwt-go 以前用的特别多,但是有一些漏洞,现在更推荐的是 golang-jwt/jwt 官方社区版

github:https://github.com/golang-jwt/jwt

官网:https://pkg.go.dev/github.com/golang-jwt/jwt/v4

JWT(JSON Web Tokens),

引入

go get -u github.com/golang-jwt/jwt

import "github.com/golang-jwt/jwt"

源码

// A JWT Token. Different fields will be used depending on whether you're
// creating or parsing/verifying a token.
type Token struct {Raw string // The raw token. Populated when you Parse a tokenMethod SigningMethod // The signing method used or to be usedHeader map[string]interface{} // The first segment of the tokenClaims Claims // The second segment of the tokenSignature string // The third segment of the token. Populated when you Parse a tokenValid bool // Is the token valid? Populated when you Parse/Verify a token
}

JWT 中的 token如上图,完整的 token 分为 3 部分

  • The first segment of the token:Header
  • The second segment of the token:Claims
  • The third segment of the token. Populated when you Parse a token:Signature

代码模型
  • 登录的 HandlerFunc 中,需要生成 token,并设置响应头带上这个 token
  • 中间件可以处理分组的请求,检测 Authorization 中数据做解析判定数据是否有效,如果无效直接返回无权限,不会进入到具体 HandlerFunc 中操作,如果有效则把 claims 中的用户信息保存到 gin.context 中,然后放行进入 HandlerFunc 中

router 中写法

r := gin.Default()authGroup := r.Group("/auth")// 分组使用 JWT 鉴权中间件
authGroup.Use(middleware.JWTAuth())

middlerware 中写法

中间件中做到解析 token,然后把 token 中的用户信息存放在 gin.Context 中,方便后面 HandlerFunc 中取用

// JWTAuth 鉴权中间件
func JWTAuth() gin.HandlerFunc {return func(c *gin.Context) {// 获取请求头中 token,实际是一个完整被签名过的 token;a complete, signed tokentokenStr := c.GetHeader("Authorization")if tokenStr == "" {c.JSON(http.StatusForbidden, "No token. You don't have permission!")c.Abort()return}// 解析拿到完整有效的 token,里头包含解析后的 3 segmenttoken, err := ParseToken(tokenStr)if err != nil {c.JSON(http.StatusForbidden, "Invalid token! You don't have permission!")c.Abort()return}// 获取 token 中的 claimsclaims, ok := token.Claims.(*AuthClaims)if !ok {c.JSON(http.StatusForbidden, "Invalid token!")c.Abort()return}// 将 claims 中的用户信息存储在 context 中c.Set("userId", claims.UserId)// 这里执行路由 HandlerFuncc.Next()}
}

ParseToken 解析 token string => *jwt.Token

// ParseToken 解析请求头中的 token string,转换成被解析后的 jwt.Token
func ParseToken(tokenStr string) (*jwt.Token, error) {// 解析 token string 拿到 token jwt.Tokenreturn jwt.ParseWithClaims(tokenStr, &AuthClaims{}, func(tk *jwt.Token) (interface{}, error) {return secretKey, nil})
}

secretKey 密钥

建议不要存放在项目代码中,要单独私有存放

var secretKey = []byte("some string")

AuthClaims 结构体

// AuthClaims 是 claims struct
type AuthClaims struct {UserId uint64 `json:"userId"`jwt.StandardClaims
}

GenerateToken 生成 *jwt.Token

一般在 login 后来生成 *jwt.Token 存放在响应头中给浏览器

// GenerateToken 一般在登录之后使用来生成 token 能够返回给前端
func GenerateToken(userId uint64, expireTime time.Time) (string, error) {// 创建一个 claimclaim := AuthClaims{UserId: userId,StandardClaims: jwt.StandardClaims{// 过期时间ExpiresAt: expireTime.Unix(),// 签名时间IssuedAt: time.Now().Unix(),// 签名颁发者Issuer: "abcnull",// 签名主题Subject: "gindemo",},}// 使用指定的签名加密方式创建 token,有 1,2 段内容,第 3 段内容没有加上noSignedToken := jwt.NewWithClaims(jwt.SigningMethodHS256, claim)// 使用 secretKey 密钥进行加密处理后拿到最终 token stringreturn noSignedToken.SignedString(secretKey)
}

login 登录后响应头设置 COOKIE

login 登录之后需要把 token string 带到响应头中返回给前端浏览器来保存信息

// 查询数据库,通过用户密码拿到 userId
userId := 1// token 过期时间 60 天,Time 类型
var expireTime = time.Now().Add(60 * 24 * time.Hour)// 生成 token string
tokenStr, tokenErr := middleware.GenerateToken(userId, expireTime)
if tokenErr != nil {// todo: 做一些出错处理
}// 设置响应头信息的 token
c.SetCOOKIE("Authorization", tokenStr, 60, "/", "127.0.0.1", false, true)

常规 HandlerFunc 使用用户信息

// 登录之后可以接入 Get 拿到用户信息,返回是 (interface{}, bool)
userId, flag := c.Get("userId")// todo: 通过 userId 可以查询数据库获取想要的用户信息


推荐阅读
  • Android实战——jsoup实现网络爬虫,糗事百科项目的起步
    本文介绍了Android实战中使用jsoup实现网络爬虫的方法,以糗事百科项目为例。对于初学者来说,数据源的缺乏是做项目的最大烦恼之一。本文讲述了如何使用网络爬虫获取数据,并以糗事百科作为练手项目。同时,提到了使用jsoup需要结合前端基础知识,以及如果学过JS的话可以更轻松地使用该框架。 ... [详细]
  • 工作经验谈之-让百度地图API调用数据库内容 及详解
    这段时间,所在项目中要用到的一个模块,就是让数据库中的内容在百度地图上展现出来,如经纬度。主要实现以下几点功能:1.读取数据库中的经纬度值在百度上标注出来。2.点击标注弹出对应信息。3 ... [详细]
  • AstridDAO 专访:波卡稳定币黑马 BAI
    加入Pol ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • 20211101CleverTap参与度和分析工具功能平台学习/实践
    1.应用场景主要用于学习CleverTap的使用,该平台主要用于客户保留与参与平台.为客户提供价值.这里接触到的原因,是目前公司用到该平台的服务~2.学习操作 ... [详细]
  • 使用在线工具jsonschema2pojo根据json生成java对象
    本文介绍了使用在线工具jsonschema2pojo根据json生成java对象的方法。通过该工具,用户只需将json字符串复制到输入框中,即可自动将其转换成java对象。该工具还能解析列表式的json数据,并将嵌套在内层的对象也解析出来。本文以请求github的api为例,展示了使用该工具的步骤和效果。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • Webmin远程命令执行漏洞复现及防护方法
    本文介绍了Webmin远程命令执行漏洞CVE-2019-15107的漏洞详情和复现方法,同时提供了防护方法。漏洞存在于Webmin的找回密码页面中,攻击者无需权限即可注入命令并执行任意系统命令。文章还提供了相关参考链接和搭建靶场的步骤。此外,还指出了参考链接中的数据包不准确的问题,并解释了漏洞触发的条件。最后,给出了防护方法以避免受到该漏洞的攻击。 ... [详细]
  • 在重复造轮子的情况下用ProxyServlet反向代理来减少工作量
    像不少公司内部不同团队都会自己研发自己工具产品,当各个产品逐渐成熟,到达了一定的发展瓶颈,同时每个产品都有着自己的入口,用户 ... [详细]
  • 图像因存在错误而无法显示 ... [详细]
  • 目录浏览漏洞与目录遍历漏洞的危害及修复方法
    本文讨论了目录浏览漏洞与目录遍历漏洞的危害,包括网站结构暴露、隐秘文件访问等。同时介绍了检测方法,如使用漏洞扫描器和搜索关键词。最后提供了针对常见中间件的修复方式,包括关闭目录浏览功能。对于保护网站安全具有一定的参考价值。 ... [详细]
author-avatar
最爱7色的彩虹
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有