Golang jwt身份认证


Posted in Golang onApril 20, 2022
目录

这几天在学习nodejs,进一步了解npm,学习过程中解开了以前的一个疑惑,以前不知道token可以携带信息,只以为是用来做对比的,学到了jwt身份认证,知道了如何使用的,感觉很好用,但是我不用nodejs开发,所以就去看了下golang的,做下记录

刚学,博客内容写的可能不大对,因为基本都是自己的理解,术语用的可能也不到位,但是用起来倒是没问题,见谅

golang-jwt 项目仓库

使用以下命令获取

go get github.com/golang-jwt/jwt

加密

首先声明一串用于加密解密的秘钥

mySigningKey := []byte("asfasfdafasdfdasfa.")

然后使用jwt.NewWithClaimsnew一个token,这个玩意有两个参数,返回值就是token

第一个是加密方法,我这里使用的是hs256加密

第二个是加密的一些参数,可以使用自带的jwt.MapClaims,也可以自定义一个结构体,如果是自定义结构体需要实现jwt.StandardClaims结构体,里面可以定义过期时间颁发者等等

Golang jwt身份认证

Golang jwt身份认证

我这里使用的是jwt.MapClaims,里面也可以定义过期时间等等,不同的就是写法不一样,我这里举例子设置过期时间为5秒

token:=jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{
	"name": "司大帅",
	"exp": time.Now().Unix() + 5,
	"iss": "sywdebug",
})

下图就是token打印出来的结果

Golang jwt身份认证

在将token返回给前端时候需要使用自己声明的秘钥加密一下,再返回给前端

tokenString, err := token.SignedString(mySigningKey)
if err != nil {
	log.Println(err.Error())
	return
}
fmt.Println("加密后的token字符串", tokenString)

Golang jwt身份认证

在前端登录时,将加密后的token字符串返回给前端,在调用需要验证的接口时将 token 传回后端,在后端进行解密验证

解密

解密使用jwt.Parse方法,如果上面使用了自定义结构体的话就使用jwt.ParseWithClaims方法
jwt.Parse有两个参数
第一个就是加密后的token字符串
第二个是一个自带的回调函数,将秘钥和错误return出来即可
jwt.ParseWithClaims有三个参数
第一个就是加密后的token字符串
第二个是加密使用的模板,例如上面示例将qqq传入即可
第三个是一个自带的回调函数,将秘钥和错误return出来即可

//在这里如果也使用jwt.ParseWithClaims的话,第二个参数就写jwt.MapClaims{}
//例如jwt.ParseWithClaims(tokenString, jwt.MapClaims{},func(t *jwt.Token) (interface{}, error){}

token, err = jwt.Parse(tokenString, func(t *jwt.Token) (interface{}, error) {
	return mySigningKey, nil
})
if err != nil {
	log.Println(err.Error())
	return
}
fmt.Println("token:", token)
fmt.Println("token.Claims:", token.Claims)
fmt.Println(token.Claims.(jwt.MapClaims)["name"])

Golang jwt身份认证

上面给的过期时间是5秒,如果加一个6秒的延迟再执行解析,就会返回token已过期了

Golang jwt身份认证

 到此这篇关于go语言使用jwt认证的实现的文章就介绍到这了!

Golang 相关文章推荐
基于go interface{}==nil 的几种坑及原理分析
Apr 24 Golang
go:垃圾回收GC触发条件详解
Apr 24 Golang
golang http使用踩过的坑与填坑指南
Apr 27 Golang
使用Golang的channel交叉打印两个数组的操作
Apr 29 Golang
golang DNS服务器的简单实现操作
Apr 30 Golang
解决Goland 同一个package中函数互相调用的问题
May 06 Golang
goland 设置project gopath的操作
May 06 Golang
Go语言实现Snowflake雪花算法
Jun 08 Golang
Go语言基础知识点介绍
Jul 04 Golang
使用GO语言实现Mysql数据库CURD的简单示例
Aug 07 Golang
golang定时器
Apr 14 Golang
实现GO语言对数组切片去重
Apr 20 #Golang
Golang日志包的使用
Apr 20 #Golang
Golang获取List列表元素的四种方式
Apr 20 #Golang
Golang 对es的操作实例
Apr 20 #Golang
Golang 遍历二叉树
Apr 19 #Golang
Golang MatrixOne使用介绍和汇编语法
Apr 19 #Golang
Golang 字符串的常见操作
You might like
三国漫画《火凤燎原》宣布动画化PV放出 预计2020年播出
2020/03/08 国漫
DOTA2 探索永无止境 玩家自创强悍插眼攻略
2020/04/20 DOTA
php中判断一个字符串包含另一个字符串的方法
2007/03/19 PHP
安装PHP可能遇到的问题“无法载入mysql扩展” 的解决方法
2007/04/16 PHP
一个漂亮的php验证码类(分享)
2013/08/06 PHP
thinkphp5.1框架实现格式化mysql时间戳为日期的方式小结
2019/10/10 PHP
php桥接模式应用案例分析
2019/10/23 PHP
javascript:void(0)是什么意思示例介绍
2013/11/17 Javascript
node.js中的path.sep方法使用说明
2014/12/08 Javascript
jQuery对指定元素中指定字符串进行替换的方法
2015/03/17 Javascript
JS中创建函数的三种方式及区别
2016/03/13 Javascript
封装获取dom元素的简单实例
2016/07/08 Javascript
JQuery学习总结【二】
2016/12/01 Javascript
vue.js项目中实用的小技巧汇总
2017/11/29 Javascript
JS遍历JSON数组及获取JSON数组长度操作示例【测试可用】
2018/12/12 Javascript
js 将多个对象合并成一个对象 assign方法的实现
2020/09/24 Javascript
python爬虫入门教程--快速理解HTTP协议(一)
2017/05/25 Python
详解使用 pyenv 管理多个版本 python 环境
2017/10/19 Python
Python实现的双色球生成功能示例
2017/12/18 Python
快速查询Python文档方法分享
2017/12/27 Python
Python使用Pandas库实现MySQL数据库的读写
2019/07/06 Python
Python中typing模块与类型注解的使用方法
2019/08/05 Python
Python实现中值滤波去噪方式
2019/12/18 Python
Tensorflow 实现将图像与标签数据转化为tfRecord文件
2020/02/17 Python
PyTorch的torch.cat用法
2020/06/28 Python
html5+css如何实现中间大两头小的轮播效果
2018/12/06 HTML / CSS
德国机场停车位比较和预订网站:Ich-parke-billiger
2018/01/08 全球购物
本科生就业推荐信
2014/05/19 职场文书
我的中国梦演讲稿600字
2014/08/19 职场文书
欠款纠纷起诉状
2015/05/19 职场文书
党员转正介绍人意见
2015/06/03 职场文书
英文诗歌翻译方法(赏析)
2019/08/16 职场文书
Html5新增了哪些功能
2021/04/16 HTML / CSS
Mybatis-Plus进阶分页与乐观锁插件及通用枚举和多数据源详解
2022/03/21 Java/Android
Nginx如何限制IP访问只允许特定域名访问
2022/07/23 Servers
html用代码制作虚线框怎么做? dw制作虚线圆圈的技巧
2022/12/24 HTML / CSS