首页 > 其他分享 >GIN 接入JWT

GIN 接入JWT

时间:2023-09-07 17:58:11浏览次数:29  
标签:return 接入 jwt JWT token func gin GIN signToken

GIN,JWT下载地址

github地址:https://github.com/golang-jwt/jwt

文档地址:https://pkg.go.dev/github.com/golang-jwt/jwt

下载:go get github.com/golang-jwt/jwt

package main

import (
"github.com/gin-gonic/gin"
"github.com/golang-jwt/jwt"
"net/http"
"time"
)

// MyCustomClaims 第一步:定义结构体
// MyClaims 定义结构体并继承jwt.StandardClaims
// jwt包自带的jwt.StandardClaims只包含了官方字段
// 我们需要额外记录一个username和id字段,所以要自定义结构体
// 如果想要保存更多信息,都可以添加到这个结构体中
type MyCustomClaims struct {
Id int `json:"id"`
UserName string `json:"userName"`
jwt.StandardClaims
}

// 定义key
var mySigningKey = []byte("slot")

func genToken(claims MyCustomClaims) (string, error) {
// 使用HS256加密方式,注意不要使用ES256,非对称加密会报错
token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
signToken, err := token.SignedString(mySigningKey)
if err != nil {
return "", err
}
return signToken, nil
}

func parseToken(signToken string) (*MyCustomClaims, error) {
var claims MyCustomClaims
token, err := jwt.ParseWithClaims(signToken, &claims, func(token *jwt.Token) (interface{}, error) {
return mySigningKey, nil
})
if token.Valid {
return &claims, nil
} else {
return nil, err
}
}

func JWTAuthMiddleware(c *gin.Context) {
//从请求头中取出
signToken := c.Request.Header.Get("Authorization")
if signToken == "" {
c.JSON(http.StatusOK, gin.H{
"code": 10002,
"msg": "token为空",
})
c.Abort()
return
}
//校验TOKEN
myclaims, err := parseToken(signToken)
if err != nil {
c.JSON(http.StatusOK, gin.H{
"code": 10003,
"msg": "token校验失败",
})
c.Abort()
return
}
// 将用户的id放在到请求的上下文c上
c.Set("userid", myclaims.Id)
c.Next() // 后续的处理函数可以用过c.Get("userid")来获取当前请求的id
}

func main() {
r := gin.Default()
r.POST("/login", func(c *gin.Context) {
userName := c.PostForm("userName")
password := c.PostForm("password")

if userName == "admin" && password == "admin" {
token, _ := genToken(MyCustomClaims{1, "admin", jwt.StandardClaims{
ExpiresAt: time.Now().Add(7 * time.Hour).Unix(), // 过期时间
Issuer: "admin", // 签发人
}})
c.JSON(200, gin.H{"code": "100", "msg": "登陆成功", "token": token})
} else {
c.JSON(200, gin.H{"code": "101", "msg": "用户名或密码错误"})
}
})
r.GET("/admin/index", JWTAuthMiddleware, func(c *gin.Context) {
c.JSON(200, gin.H{"code": 10000, "msg": "success"})
})
r.Run(":8080")
}

标签:return,接入,jwt,JWT,token,func,gin,GIN,signToken
From: https://www.cnblogs.com/lisus2000/p/17685676.html

相关文章

  • 【ROS2机器人入门到实战】第 十四 章 接入ROS2-MicroROS
    第十四章接入ROS2-MicroROS写在前面当前平台文章汇总地址:ROS2机器人从入门到实战获取完整教程及配套资料代码,请关注公众号<鱼香ROS>获取教程配套机器人开发平台:两驱版|四驱版为方便交流,搭建了机器人技术问答社区:地址fishros.org.cn,我是小鱼。上一章我们通过对嵌入式开发的学习......
  • [题解] AtCoder Beginner Contest 308 A~G
    AtCoderBeginnerContest308A~GA.NewSchemevoidMain(){vector<i64>a(8);for(auto&x:a)cin>>x;if(!is_sorted(a.begin(),a.end())&&!all_of(a.begin(),a.end(),[](auto&x){returnx%25!=0||!(100......
  • TDengine函数大全-时间和日期函数
    以下所有示例基于TDengine3.1.0.3TDengine函数大全1.数学函数2.字符串函数3.转换函数4.时间和日期函数5.聚合函数6.选择函数7.时序数据库特有函数8.系统函数时间和日期函数TDengine函数大全NOWTIMEDIFFTIMETRUNCATETIMEZONETODAYNOWNOW()功能说明:返回客户端当前系统时间。返回......
  • TDengine函数大全-目录
    TDengine函数大全详情见具体页面,点击进入。1.数学函数ABSACOSASINATANCEILCOSFLOORLOGPOWROUNDSINSQRTTAN2.字符串函数CHAR_LENGTHCONCATCONCAT_WSLENGTHLOWERLTRIMRTRIMSUBSTRUPPER3.转换函数CASTTO_ISO8601TO_UNIXTIMESTAMPTO_JSON4.时间和日期函数NOWTIMEDIFFTIMETRUNCATETIMEZ......
  • GIN 路由分析
    GIN路由分析第一步:gin.Default  这个会返回一个Engine,Engine的结构如下 其中RouterGroup也是与路由有关的结构体,它的结构体如下第二步:r.GET()r.get就是路由注册和路由处理。r.GET里面的方法就是group.handle就是咱由处理,handle的处理函数  里面的addRoute这......
  • npm:升级自身时报错:EBADENGINE
    一,报错信息root@lhdpc:~#npminstall-gnpmnpmERR!codeEBADENGINEnpmERR!engineUnsupportedenginenpmERR!engineNotcompatiblewithyourversionofnode/npm:[email protected]!notsupNotcompatiblewithyourversionofnode/npm:[email protected]......
  • Python学习 -- logging模块
    logging模块是Python中用于记录日志的标准库,它提供了丰富的功能,可以帮助开发者进行日志记录和管理。以下是关于logging模块的详细使用方式,包括日志级别、处理流程、Logger类、Handler类、Filter类、Formatter类以及模块中常用函数等内容。1.日志级别logging模块定义了以下......
  • JwtToken
    JwtToken的使用和介绍什么是JSONWebToken?​ JSONWeb令牌(JWT)是一种开放标准(RFC7519),它定义了一种紧凑且独立的方式,用于在各方之间以JSON对象的形式安全地传输信息。此信息可以验证和信任,因为它是经过数字签名的。JWT可以使用密钥(使用HMAC算法)或使用RSA或ECDSA......
  • 重磅| Falcon 180B 正式在 Hugging Face Hub 上发布!
    引言我们很高兴地宣布由TechnologyInnovationInstitute(TII)训练的开源大模型Falcon180B登陆HuggingFace!Falcon180B为开源大模型树立了全新的标杆。作为当前最大的开源大模型,有180B参数并且是在在3.5万亿token的TIIRefinedWeb数据集上进行训练,这也是目前开......
  • 【Azure Kubernetes】通过 kubelogin 进行非交互式登录AKS
    问题描述当对AKS的登录方式(认证和授权)从“LocalAccountwithKubernetesRBAC”改变为“AzureADauthenticationwithAzureRBAC”.通过kubectl连接AKS会要求交互式登录,需要通过浏览器输入认证码后关联azure登录用户。那么,是否有办法可以避免这种交互式登录呢?  问......