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缓冲channel和非缓冲channel的区别说明
Apr 25 Golang
golang如何去除多余空白字符(含制表符)
Apr 25 Golang
golang 在windows中设置环境变量的操作
Apr 29 Golang
解决golang 关于全局变量的坑
May 06 Golang
Golang 实现获取当前函数名称和文件行号等操作
May 08 Golang
Golang中异常处理机制详解
Jun 08 Golang
浅谈Go语言多态的实现与interface使用
Jun 16 Golang
golang fmt格式“占位符”的实例用法详解
Jul 04 Golang
golang 语言中错误处理机制
Aug 30 Golang
一文搞懂Golang 时间和日期相关函数
Dec 06 Golang
golang定时器
Apr 14 Golang
Go语言编译原理之变量捕获
Aug 05 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
Linux下php5.4启动脚本
2014/08/03 PHP
推荐25款php中非常有用的类库
2014/09/29 PHP
php实现简单的MVC框架实例
2015/09/23 PHP
php表单提交实例讲解
2015/11/12 PHP
php等比例缩放图片及剪切图片代码分享
2016/02/13 PHP
CI框架源码解读之URI.php中_fetch_uri_string()函数用法分析
2016/05/18 PHP
php5.2的curl-bug 服务器被php进程卡死问题排查
2016/09/19 PHP
利用laravel搭建一个迷你博客实战教程
2017/08/13 PHP
laravel实现上传图片,并且制作缩略图,按照日期存放的代码
2019/10/16 PHP
js直接编辑当前cookie的脚本
2008/09/14 Javascript
基于jquery的当鼠标滚轮到最底端继续加载新数据思路分享(多用于微博、空间、论坛 )
2011/10/10 Javascript
JQuery入门—编写一个简单的JQuery应用案例
2013/01/03 Javascript
jQuery实现动画效果circle实例
2015/08/06 Javascript
详解JavaScript基本类型和引用类型
2015/12/09 Javascript
创建一个类Person的简单实例
2016/05/17 Javascript
通过修改360抢票的刷新频率和突破8车次限制实现方法
2017/01/04 Javascript
webpack入门必知必会
2017/01/16 Javascript
简单实现js悬浮导航效果
2017/02/05 Javascript
JS 中document.write()的用法和清空的原因浅析
2017/12/04 Javascript
React 项目迁移 Webpack Babel7的实现
2018/09/12 Javascript
Js 利用正则表达式和replace函数获取string中所有被匹配到的文本(推荐)
2018/10/28 Javascript
浅入深出Vue之自动化路由
2019/08/06 Javascript
记录一次websocket封装的过程
2020/11/23 Javascript
[01:14:19]NAVI vs Mineski 2019国际邀请赛淘汰赛 败者组BO1 8.20.mp4
2020/07/19 DOTA
Python中os.path用法分析
2015/01/15 Python
python嵌套函数使用外部函数变量的方法(Python2和Python3)
2016/01/31 Python
Python编程判断这天是这一年第几天的方法示例
2017/04/18 Python
用Python3创建httpServer的简单方法
2018/06/04 Python
python 字符串只保留汉字的方法
2018/11/16 Python
对Django 转发和重定向的实例详解
2019/08/06 Python
Python 使用多属性来进行排序
2019/09/01 Python
Superdry极度干燥美国官网:英国制造的服装品牌
2018/11/13 全球购物
会话Bean的种类
2013/11/07 面试题
Python中如何定义一个函数
2016/09/06 面试题
护理学毕业生自荐信
2013/10/02 职场文书
Java实战之课程信息管理系统的实现
2022/04/01 Java/Android