资讯动态

JWT 入门笔记(Go Web 项目必备认证方案)

发布时间:2026/8/24 6:01:03 来源:尧图企业网站定制
一、什么是 JWTJWTJSON Web Token是一种轻量级认证方案用于前后端分离的用户认证传递安全信息特点无状态服务端不存储 Session可跨域、可跨服务支持加密或签名JWT 本质上是一个字符串由三部分组成header.payload.signature二、JWT 三部分详解1. Header头部声明类型和加密算法通常是{alg:HS256,typ:JWT}2. Payload负载存储实际信息Claims比如用户 ID、过期时间等{userId:1001,username:zjl,exp:1684089600}exp表示过期时间Unix 时间戳3. Signature签名签名算法HMACSHA256( base64UrlEncode(header) . base64UrlEncode(payload), secret )作用防篡改确保 JWT 没有被伪造三、JWT 优势无需服务器存储 Session支持跨域和微服务适合前后端分离场景四、Go 中使用 JWTGo 常用库github.com/golang-jwt/jwt/v4安装go get github.com/golang-jwt/jwt/v4五、生成 JWT示例代码packagemainimport(fmttimegithub.com/golang-jwt/jwt/v4)funcmain(){// 声明 payloadclaims:jwt.MapClaims{userId:1001,username:zjl,exp:time.Now().Add(time.Hour*1).Unix(),}// 创建 tokentoken:jwt.NewWithClaims(jwt.SigningMethodHS256,claims)// 使用 secret 签名secret:[]byte(mysecret)tokenString,err:token.SignedString(secret)iferr!nil{panic(err)}fmt.Println(生成的 JWT:,tokenString)}六、解析 JWTpackagemainimport(fmtgithub.com/golang-jwt/jwt/v4)funcmain(){tokenString:上一步生成的 tokensecret:[]byte(mysecret)// 解析 tokentoken,err:jwt.Parse(tokenString,func(token*jwt.Token)(interface{},error){returnsecret,nil})iferr!nil{panic(err)}// 校验通过ifclaims,ok:token.Claims.(jwt.MapClaims);oktoken.Valid{fmt.Println(userId:,claims[userId])fmt.Println(username:,claims[username])}else{fmt.Println(Token 无效)}}七、JWT 在 Gin 中使用1. 登录接口生成 tokenr.POST(/login,func(c*gin.Context){// 假设校验用户名密码通过token:jwt.NewWithClaims(jwt.SigningMethodHS256,jwt.MapClaims{userId:1001,exp:time.Now().Add(time.Hour*1).Unix(),})tokenString,_:token.SignedString([]byte(mysecret))c.JSON(200,gin.H{token:tokenString,})})2. 中间件校验 JWTfuncJWTMiddleware()gin.HandlerFunc{returnfunc(c*gin.Context){tokenString:c.GetHeader(Authorization)iftokenString{c.JSON(401,gin.H{msg:缺少 token})c.Abort()return}token,err:jwt.Parse(tokenString,func(token*jwt.Token)(interface{},error){return[]byte(mysecret),nil})iferr!nil||!token.Valid{c.JSON(401,gin.H{msg:token 无效})c.Abort()return}c.Next()}}使用auth:r.Group(/auth)auth.Use(JWTMiddleware())auth.GET(/profile,func(c*gin.Context){c.JSON(200,gin.H{msg:这是受保护的接口})})八、JWT 注意事项Secret 必须保密token 应该设置过期时间不要在 payload 放敏感信息密码等前端使用 Authorization: Bearer token 传递九、总结JWT 核心概念Header声明算法和类型Payload存放用户信息和过期时间Signature签名防篡改在 Go Web 开发中登录生成 JWT前端存储 token请求带 token后端中间件验证 token这样就完成了无状态认证。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价