Golang Gin怎么做JWT登录认证_Golang Gin JWT教程【实用】

jwt.Parse后必须手动检查token.Valid,因其仅解析结构和解密签名,过期、篡改等校验依赖token.Valid;应使用ParseWithClaims配合嵌入jwt.RegisteredClaims的结构体,并确保密钥≥32字节且不硬编码。jwt.Parse 之后必须手动检查 token.Valid很多人以为 jwt.Parse 不报错就代表 token 合法,其实不然------它只做结构解析和签名解密,**过期、篡改、算法不匹配等校验都延迟到 token.Valid 字段才真正触发**。漏掉这一步,会导致已过期或被篡改的 token 仍被放行。错误写法:if err == nil { /* 直接放行 */ }正确写法:if err != nil || !token.Valid { c.AbortWithStatusJSON(401, gin.H{"error": "invalid or expired token"}) }注意:即使 err == nil,token.Valid 也可能是 false(比如 exp 已过,但没被校验)用 ParseWithClaims 而不是 Parse 绑定自定义字段想从 token 里安全取 user_id 或 role?别用 jwt.MapClaims 强转,它绕过标准字段校验,且无法自动验证 exp、iat 等时间字段。必须定义结构体并嵌入 jwt.RegisteredClaims:type CustomClaims struct { UserID uint `json:"user_id"` Role string `json:"role"` jwt.RegisteredClaims}解析时传指针 + 显式指定算法:jwt.ParseWithClaims(tokenStr, &CustomClaims{}, keyFunc, jwt.WithValidMethods(\[\]string{jwt.SigningMethodHS256.Alg()}))若传值而非指针,或没嵌入 RegisteredClaims,ExpiresAt 就不会被自动校验密钥长度不够会静默截断,线上校验失败用 SigningMethodHS256 时,Go 的 crypto/hmac 底层要求密钥 ≥32 字节;若你硬编码 "my-secret"(仅 9 字节),本地可能"碰巧"通过,但线上环境因底层行为差异导致签名不一致,token 校验永远失败。生成合规密钥:openssl rand -base64 32,或用 make(\[\]byte, 32) 配合 rand.Read密钥绝不能硬编码:从 os.Getenv("JWT_SECRET") 读取,开发/生产环境分别配置测试时可加断言:if len(secret) 登录接口返回 token 前,务必设 ExpiresAt 并区分 access/refresh 场景不设过期时间等于发长期通行证,一旦泄露无法主动回收;而把 access token 设成 7 天,又违背最小权限原则。 Cleanup.pictures 智能移除图片中的物体、文本、污迹、人物或任何不想要的东西

相关推荐
大数据魔法师6 小时前
Streamlit(二十三)- 教程(二)- 动态导航
python·web
AI人工智能+电脑小能手8 小时前
【大白话说Java面试题 第87题】【Mysql篇】第17题:分布式事务的实现原理?
java·数据库·分布式·mysql·面试
yyuuuzz8 小时前
独立站的技术基础与常见运维问题
大数据·运维·服务器·网络·数据库·aws
心中有国也有家8 小时前
GE图引擎深度解析——CANN的计算图优化与执行引擎
人工智能·pytorch·python·学习·numpy
卷毛的技术笔记10 小时前
告别硬编码!Spring AI Alibaba 实现 AI Agent 智能工具调用(Tool Calling)
java·人工智能·后端·python·spring·ai编程
编程大师哥10 小时前
匿名函数 lambda + 高阶函数
java·python·算法
vb20081110 小时前
FastAPI APIRouter
开发语言·python
adrninistrat0r10 小时前
Java调用链MCP分析工具
java·python·ai编程
杨充10 小时前
1.3 浮点型数据设计灵魂
开发语言·python·算法
meilindehuzi_a11 小时前
深入浅出数据结构:Python 字典(Dict)与集合(Set)的哈希表底层全链路追踪
数据结构·python·散列表