go使用jwt创建token并验证token的有效性
一、概述
Go使用jwt创建token,验证登录用户的合法性
导入jwt包
go get github.com/dgrijalva/jwt-go
二、代码示例
1.创建token及解析token
package token import ( "fmt" "go_workspace/entity" "time" "github.com/dgrijalva/jwt-go" ) type Claims struct { Id int64 Pwd string jwt.StandardClaims } var jwtKey = []byte("yw_tony_laofuzi_123456789") //证书签名秘钥,用来签发证书 // 生成token func CreateToken(user entity.User) (string, error) { fmt.Println("传给token的用户数据:", user) //设置token过期时间(此处设置7天后过期) expirationTime := time.Now().Add(7 * 24 * time.Hour) claims := &Claims{ Id: user.Id, Pwd: user.Pwd, StandardClaims: jwt.StandardClaims{ ExpiresAt: expirationTime.Unix(), //过期事件 IssuedAt: time.Now().Unix(), //发布时间 Subject: "go test create jwt token", //主题 Issuer: "tony", //发布者 }, } token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims) //生成token tokenStr, err := token.SignedString(jwtKey) if err != nil { fmt.Println("token", tokenStr) } return tokenStr, err } // 解析token func ParseToken(tokenStr string) (*jwt.Token, *Claims, error) { claims := &Claims{} token, err := jwt.ParseWithClaims(tokenStr, claims, func(token *jwt.Token) (i interface{}, err error) { return jwtKey, nil }) return token, claims, err }
2.登录后创建token
// 用户登录 func loginHandler(context *gin.Context) { var user entity.User err1 := context.ShouldBindJSON(&user) if err1 != nil { context.JSON(400, gin.H{"error": err1.Error()}) } fmt.Println("登录用户的账号密码信息", user) user2, err := model.Login(user) if err != nil { context.JSON(500, gin.H{"error": err.Error()}) } mToken, err2 := token.CreateToken(user2) if err2 != nil { context.JSON(500, gin.H{"error": err2.Error()}) } context.JSON(200, gin.H{"token": mToken}) }
3.添加用户后解析token,并验证用户身份
func checkToken(context *gin.Context) { //获取authorization header Authorization := context.GetHeader("Authorization") fmt.Println("Authorization:", Authorization) if Authorization == "" { context.JSON(400, gin.H{"error": "token为空"}) return } //解析token mToken, claims, err := token.ParseToken(Authorization) fmt.Println("token:", mToken) fmt.Println("claims:", claims) if err != nil || !mToken.Valid { //解析错误或者token过期 context.JSON(400, gin.H{"error": "token过期/错误"}) return } } // 添加新用户 func addUserUseXormHandler(context *gin.Context) { checkToken(context) var user entity.User err5 := context.ShouldBindJSON(&user) if err5 != nil { context.JSON(400, gin.H{"error": err5.Error()}) return } user.UpdateTime = time.Now().Format("2006-01-02 15:04:05") row, err1 := model.AddUserUseXorm(user) if row > 0 { context.JSON(200, gin.H{"data": user}) } else { context.JSON(500, gin.H{"data": err1.Error()}) } fmt.Println("添加新用户") }
分类:
Go
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
2023-01-12 MediaExtractor+MediaMuxer分离/合成一个新的Mp4