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语言使用select{}阻塞main函数介绍
Apr 25 Golang
使用Golang的channel交叉打印两个数组的操作
Apr 29 Golang
Golang 使用Map实现去重与set的功能操作
Apr 29 Golang
golang协程池模拟实现群发邮件功能
May 02 Golang
使用golang编写一个并发工作队列
May 08 Golang
详解Go语言Slice作为函数参数的使用
Jul 02 Golang
Go语言实现Base64、Base58编码与解码
Jul 26 Golang
一文搞懂Golang 时间和日期相关函数
Dec 06 Golang
golang生成vcf通讯录格式文件详情
Mar 25 Golang
golang语言指针操作
Apr 14 Golang
Go 内联优化让程序员爱不释手
Jun 21 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
PHP4实际应用经验篇(9)
2006/10/09 PHP
php一行代码获取文件后缀名实例分析
2014/11/12 PHP
js+php实现静态页面实时调用用户登陆状态的方法
2015/01/04 PHP
PHP设计模式之装饰器(装饰者)模式(Decorator)入门与应用详解
2019/12/13 PHP
php多进程并发编程防止出现僵尸进程的方法分析
2020/02/28 PHP
php设计模式之组合模式实例详解【星际争霸游戏案例】
2020/03/27 PHP
JS 无限级 Select效果实现代码(json格式)
2011/08/30 Javascript
jQuery级联操作绑定事件实例
2014/09/02 Javascript
jquery 获取 outerHtml 包含当前节点本身的代码
2014/10/30 Javascript
原生js和jquery实现图片轮播淡入淡出效果
2015/04/23 Javascript
浅谈Javascript数据属性与访问器属性
2016/07/26 Javascript
Ionic 2 实现列表滑动删除按钮的方法
2017/01/22 Javascript
JavaScript+CSS相册特效实例代码
2017/09/07 Javascript
echarts学习笔记之图表自适应问题详解
2017/11/22 Javascript
electron + vue项目实现打印小票功能及实现代码
2018/11/25 Javascript
JS Generator 函数的含义与用法实例总结
2020/04/08 Javascript
[02:38]DOTA2超级联赛专访Loda 认为IG世界最强
2013/05/27 DOTA
python黑魔法之编码转换
2016/01/25 Python
python+pygame简单画板实现代码实例
2017/12/13 Python
python3利用Socket实现通信的方法示例
2019/05/06 Python
Python批量将图片灰度化的实现代码
2020/04/11 Python
Iconfont(矢量图标)+iconmoon(图标svg互转)配合javascript实现社交分享系统
2020/04/21 Python
python用tkinter实现一个简易能进行随机点名的界面
2020/09/27 Python
解决Pyinstaller打包软件失败的一个坑
2021/03/04 Python
Links of London官方网站:英国标志性的珠宝品牌
2017/04/09 全球购物
"引用"与指针的区别是什么
2016/09/07 面试题
公司拓展活动方案
2014/02/13 职场文书
行政助理的岗位职责
2014/02/18 职场文书
《锄禾》教学反思
2014/04/08 职场文书
群教班子对照检查材料
2014/08/26 职场文书
中韩经贸翻译专业大学生职业生涯规划范文
2014/09/18 职场文书
运动会稿件100字
2014/09/24 职场文书
2016新年感言
2015/08/03 职场文书
小学班主任培训心得体会
2016/01/07 职场文书
电脑关机速度很慢怎么办 提升电脑关机速度设置教程
2022/04/08 数码科技
如何优化vue打包文件过大
2022/04/13 Vue.js