首页 > 其他分享 >Go中使用JWT

Go中使用JWT

时间:2023-04-20 17:22:18浏览次数:51  
标签:return nil JWT jwt token 使用 Go

原文链接:https://blog.csdn.net/m0_58121644/article/details/129643351

JWT (JSON Web Tokens) 是一种基于 JSON 格式的轻量级身份验证和授权方案。在 Go 项目中使用 JWT,一般需要完成以下步骤:

1. 安装 JWT 库

在 Go 项目中使用 JWT 需要先安装 JWT 库,可以使用以下命令安装:

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

将其导入代码中:

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

2. 创建 JWT

在 Go 项目中,可以使用 JWT 库的 jwt.NewWithClaims() 方法创建 JWT。例如:

// CustomClaims 自定义声明类型 并内嵌jwt.RegisteredClaims
// jwt包自带的jwt.RegisteredClaims只包含了官方字段
// 假设我们这里需要额外记录一个username字段,所以要自定义结构体
// 如果想要保存更多信息,都可以添加到这个结构体中
type CustomClaims struct {
	// 可根据需要自行添加字段
	UserID               int64  `json:"user_id"`
	Username             string `json:"username"`
	jwt.RegisteredClaims        // 内嵌标准的声明
}

// GenToken 生成JWT
func GenToken(userId int64, username string) (string, error) {
	// 创建一个我们自己声明的数据
	claims := CustomClaims{
		userId,
		username, // 自定义字段
		jwt.RegisteredClaims{
			ExpiresAt: jwt.NewNumericDate(time.Now().Add(time.Hour * 24)),	// 定义过期时间
			Issuer:    "somebody", // 签发人
		},
	}
	
	token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
	// 生成签名字符串
	return token.SignedString([]byte("secret-key"))
}

在上面的例子中,使用 jwt.MapClaims 定义了需要存储在 JWT 中的数据,使用 jwt.NewWithClaims() 方法创建了 JWT,然后使用 SignedString() 方法生成了签名字符串。

3. 验证 JWT

在 Go 项目中,可以使用 JWT 库的 jwt.Parse() 方法验证 JWT。例如:

import (
    "github.com/golang-jwt/jwt/v5"
)

func ParseToken(tokenString string) (*CustomClaims, error) {
	// 解析token
	var mc = new(CustomClaims)
	token, err := jwt.ParseWithClaims(tokenString, mc, func(token *jwt.Token) (i interface{}, err error) {
		return CustomSecret, nil
	})
	if err != nil {
		return nil, err
	}
	// 对token对象中的Claim进行类型断言
	if token.Valid { // 校验token
		return mc, nil
	}
	return nil, errors.New("invalid token")
}

在上面的例子中,使用 jwt.Parse() 方法解析 JWT,并在回调函数中检查签名算法和返回签名字符串。然后检查 token 是否有效,并从中提取出需要的数据。

以上就是在 Go 项目中使用 JWT 的基本步骤。需要注意的是,在实际应用中,需要更加严格地设置 JWT 的有效期、密钥等参数,以确保安全性。

4. 在项目中的使用

一般地,我们使用token进行鉴权的时候,使用gin中的中间件来对许多需要鉴权的请求进行判断,中间件的具体内容:

func JWTAuthMiddleware() func(c *gin.Context) {
	return func(c *gin.Context) {
		//获取到请求头中的token
		authHeader := c.Request.Header.Get("Authorization")
		if authHeader == "" {
			c.JSON(http.StatusOK, &model.ResponseData{
				Code: 200,
				Msg:  "访问失败,请登录!",
				Data: nil,
			})
			c.Abort()
			return
		}
		// 按空格分割
		parts := strings.SplitN(authHeader, " ", 2)
		if !(len(parts) == 2 && parts[0] == "Bearer") {
			c.JSON(http.StatusOK, &model.ResponseData{
				Code: 200,
				Msg:  "访问失败,无效的token,请登录!",
				Data: nil,
			})
			c.Abort()
			return
		}
		// parts[1]是获取到的tokenString,我们使用之前定义好的解析JWT的函数来解析它
		mc, err := util.ParseToken(parts[1])
		if err != nil {
			c.JSON(http.StatusOK, &model.ResponseData{
				Code: 200,
				Msg:  "访问失败,无效的token,请登录!",
				Data: nil,
			})
			c.Abort()
			return
		}
		// 将当前请求的userID信息保存到请求的上下文c上
		c.Set("userID", mc.UserID)
		c.Next() // 后续的处理函数可以用过c.Get("username")来获取当前请求的用户信息
	}
}

标签:return,nil,JWT,jwt,token,使用,Go
From: https://www.cnblogs.com/oaoa/p/17337561.html

相关文章

  • node.js使用Nodemailer发送邮件
    引言--常常看到一些网站有邮箱获取验证码验证注册或者修改密码等,今天也来了解一下在nodejs+express怎么发送电子邮件。使用模块Nodemailer。这里以qq邮箱举例子。安装模块--npminstallNodemailer--save创建一个SMTP客户端配置--//引入模块nodemailerconstnodemai......
  • Chat GPT Plus 使用 Depay 付费的流程和踩坑注意事项
    0.步骤总览:交易所购买USDT虚拟货币提现到Depay钱包兑换成美元冲进Depay银行卡购买ChatGPTPlus1.注册一个ChatGPT账户这一步有很多教程了,就不细说了2.搞一个虚拟卡,注册Depay由于OpenAi充值必须要用美国银行卡,我看网上各路教程最后选择了Depay,......
  • 使用Layui树形组件如何取值
    近期使用了Layui中的树形组件来权限,发现无法没有提供直接获取选中值的id或code方法。分享一下个人方法官方案例 可以使用tree.getChecked('demoId')获取选中的节点,选中节点是个JSON无法直接获取指定code或者id等信息,需要我们自己处理一下 本方法可以获取指定层级的id或......
  • DNS服务Unbound部署于使用
    Unbound官网地址:https://nlnetlabs.nl/projects/unbound/about/详细文档:https://unbound.docs.nlnetlabs.nl/en/latest/index.html安装Centosyuminstall-yunboundubuntuaptinstallunbound-y管理unbound-checkconf检查配置文件unbound-checkconf/etc/unbound/u......
  • 如何安装使用nvm
    1.确保本地删除了node包2.安装nvm(安装路径请勿包含空格以及中文)下载地址(https://github.com/coreybutler/nvm-windows/releases)3.查看可安装的nodenvmlsavailable也可在网页进行查看(https://nodejs.org/en/download/releases)4.安装node(管理员身份运行+保持网络畅通)......
  • MySQL使用过程中常见问题的解决
    问题1:root用户密码忘记,重置的操作、1:通过任务管理器或者服务管理,关掉mysqld(服务进程)2:通过命令行+特殊参数开启mysqldmysqld--defaults-file="D:\ProgramFiles\mysql\MySQLServer5.7Data\my.ini"--skip-grant-tables3:此时,mysqld服务进程已经打开。并且不需......
  • DyLoRA:使用动态无搜索低秩适应的预训练模型的参数有效微调
    又一个针对LoRA的改进方法:DyLoRA:Parameter-EfficientTuningofPretrainedModelsusingDynamicSearch-FreeLowRankAdaptationhttps://arxiv.org/pdf/2210.07558v2.pdfhttps://github.com/huawei-noah/KD-NLP/tree/main/DyLoRAPart1前言LoRA存在的问题:rank的值是固......
  • MySQL: 为什么使用 innobackupex 备份恢复搭建主从时,必须人为设置 gtid_purged 变量
    问题描述:使用innobackupex搭建主从的步骤如下:1.主库使用innobackupex备份并apply-log2.将备份文件拷贝至从库,从库清空datadir目录,并使用innobackupex进行copy-back3.从库根据备份目录中的xtrabackup_binlog_info的GTID信息来设置gtid_purged变量。4.从库changem......
  • 使用scapy给pcap包添加vlan
    1、使用wireshark查看pcap文件,一个没有vlan,一个有vlan  2、使用scapy查看有vlan的报文 可以看到Ether层type=VLAN,vlan层为<Dot1Q prio=0id=0vlan=10type=IPv4 3、使用scapy编辑没有vlan的文件的第4个报文fromscapy.allimport*packets=rdpcap("gen_full_......
  • 无界微前端(wujie):element-ui 弹框内使用select组件,弹出框位置异常解决方案 (主程序加载
    https://wujie-micro.github.io/doc/guide/ element-ui弹框内使用select组件,弹出框位置异常解决方案第一步:在子应用中: 以上3步就好啦!!!是不是很简单这个框架坑很多,希望对大家有帮助!!! ......