当前位置:网站首页>go学习 ------jwt的相关知识
go学习 ------jwt的相关知识
2022-07-05 14:49:00 【周 -_-】
一、基本介绍
Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密。
二、下载
go get -v "github.com/dgrijalva/jwt-go"
三、使用
1、 设置相关的变量和结构
type JwtClaims struct {
//token 里面添加用户信息,验证token后可能会用到用户信息
jwt.StandardClaims
UserID int `json:"user_id"`
UserName string `json:"user_name"`
Password string `json:"password"`
}
var (
Secret = "YuFen" //加盐:签名密匙
ExpireTime = 20 //token有效用时 20s
)
2、创建一个方法生成token
func GetToken(claims *JwtClaims) (string, error) {
token := jwt.NewWithClaims(jwt.SigningMethodES256, claims) //跟距指定的签名方法,和claims进行加密
signedString, err := token.SignedString([]byte(Secret)) //生成的token进行密匙签名使用Secret进行加密
if err != nil {
return "", err
}
return signedString, nil
}
3 、在login()获取到生成token所需要的信息
func UserLogin(c *gin.Context) {
var user model.User
user.Name = c.PostForm("Name")
user.Password = c.PostForm("Password")
err := model.UserLogin(user)
if err != nil {
c.JSON(http.StatusBadRequest, gin.H{
"msg": "登录失败",
//"data":Users,
//401 (未授权) 请求要求身份验证。 对于需要登录的网页,服务器可能返回此响应。
})
} else {
C, _ = model.GetUser(user.Name)
claims := &utils.JwtClaims{
UserID: C.Id,
UserName: C.Name,
Password: C.Password,
}
claims.IssuedAt = time.Now().Unix()
claims.ExpiresAt = time.Now().Add(time.Second * time.Duration(utils.ExpireTime)).Unix()
s, err := utils.GetToken(claims)
if err != nil {
c.String(http.StatusNotFound, err.Error())
return
}
c.JSON(http.StatusOK, gin.H{
"msg": "登录成功",
"jwt": s,
})
}
}
4、对生成的token进行解密
func verifyAction(strToken string) (*JWTClaims, error) {
token, err := jwt.ParseWithClaims(strToken, &JWTClaims{
}, func(token *jwt.Token) (interface{
}, error) {
return []byte(Secret), nil //该函数是实现将前端携带的Token进行相关的解密,获得加密前的token数据
})
if err != nil {
return nil, errors.New(ErrorReason_ReLogin)
}
claims, ok := token.Claims.(*JWTClaims) // 根据解密的token获取claims声明信息
if !ok {
return nil, errors.New(ErrorReason_ReLogin)
}
if err := token.Claims.Valid(); err != nil {
return nil, errors.New(ErrorReason_ReLogin)
}
return claims, nil
verifyAction()里面还有一个核心那就是 token.Claims.Valid() (该函数是验证token是否失效)
失效的原理:很简单,那就是在login登录的时候获取的token时候我们已经设定了失效的时长,上面是10秒。然后当执行该函数的时候,会自动和的判断当前的时间和过期时间是否超期,未超期,则表示正常使用,否则会报错返回,最后执行错误响应 errors.New(ErrorReason_ReLogin)
5、更新token
func refresh(c *gin.Context) {
strToken := c.Query("token")
claims, err := verifyAction(strToken)
if err != nil {
c.String(http.StatusNotFound, err.Error())
return
}
claims.ExpiresAt = time.Now().Unix() + (claims.ExpiresAt - claims.IssuedAt) // 失效的时间
signedToken, err := getToken(claims)
if err != nil {
c.String(http.StatusNotFound, err.Error())
return
}
c.String(http.StatusOK, signedToken)
}
边栏推荐
- 市值蒸发超百亿美元,“全球IoT云平台第一股”赴港求生
- 【数组和进阶指针经典笔试题12道】这些题,满足你对数组和指针的所有幻想,come on !
- 手写promise与async await
- 你童年的快乐,都是被它承包了
- 启牛学堂班主任给的证券账户安全吗?能开户吗?
- 机器学习框架简述
- I collect multiple Oracle tables at the same time. After collecting for a while, I will report that Oracle's OGA memory is exceeded. Have you encountered it?
- MySQL----函数
- B站做短视频,学抖音死,学YouTube生?
- Select sort and bubble sort
猜你喜欢
如何将电脑复制的内容粘贴进MobaXterm?如何复制粘贴
Topology visual drawing engine
Creation and use of thymeleaf template
想进阿里必须啃透的12道MySQL面试题
Coding devsecops helps financial enterprises run out of digital acceleration
How to choose the appropriate certificate brand when applying for code signing certificate?
DVWA range clearance tutorial
用 Go 跑的更快:使用 Golang 为机器学习服务
Thymeleaf uses background custom tool classes to process text
Live broadcast preview | how to implement Devops with automatic tools (welfare at the end of the article)
随机推荐
30岁汇源,要换新主人了
我想咨询一下,mysql一个事务对于多张表的更新,怎么保证数据一致性的?
Two policemen were shot dead in a "safety accident" in Philadelphia, USA
Ctfshow web entry information collection
I collect multiple Oracle tables at the same time. After collecting for a while, I will report that Oracle's OGA memory is exceeded. Have you encountered it?
想问下大家伙,有无是从腾讯云MYSQL同步到其他地方的呀?腾讯云MySQL存到COS上的binlog
[recruitment position] infrastructure software developer
Topology可视化绘图引擎
B站做短视频,学抖音死,学YouTube生?
CPU design related notes
CODING DevSecOps 助力金融企业跑出数字加速度
Implement a blog system -- using template engine technology
[detailed explanation of Huawei machine test] character statistics and rearrangement
想进阿里必须啃透的12道MySQL面试题
P1451 求细胞数量/1329:【例8.2】细胞
I want to inquire about how to ensure data consistency when a MySQL transaction updates multiple tables?
729. My schedule I: "simulation" & "line segment tree (dynamic open point) &" block + bit operation (bucket Division) "
Ecotone technology has passed ISO27001 and iso21434 safety management system certification
Does maxcompute have SQL that can query the current storage capacity (KB) of the table?
我这边同时采集多个oracle表,采集一会以后,会报oracle的oga内存超出,大家有没有遇到的?