Iris中GetHeader("Authorization")获取不到Bearer Token的主因是前端未规范传值或中间件提前终止请求;需手动提取头并去除"Bearer "前缀,且CORS须配置AllowHeaders含"Authorization"。

iris.Context.GetHeader("Authorization") 获取不到 Bearer Token?
常见原因是前端没按规范传,或者中间件提前终止了请求。Iris 默认不会自动解析 Authorization 头里的 JWT,必须手动提取并去掉 Bearer 前缀。
实操建议:
- 用
c.Request().Header.Get("Authorization")取原始头,别用GetHeader(它只是封装) - 检查是否以
"Bearer "开头(注意末尾空格),再取子串:tokenString := strings.TrimPrefix(authHeader, "Bearer ") - 确保前端发的是
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...,不是token=xxx或 query 参数 - 如果用了 CORS 中间件,确认已配置
AllowHeaders: []string{"Authorization"},否则浏览器会屏蔽该 header
jwt.NewWithClaims(jwt.SigningMethodHS256, claims) 签发时 panic:invalid memory address?
根本原因是传了 nil 的 claims,比如直接传 jwt.MapClaims{} 但没初始化,或结构体字段未导出。
实操建议:
- 用标准结构体声明 claims,字段首字母大写(必须可导出):
type MyClaims struct { jwt.StandardClaims UserID uint `json:"user_id"` Role string `json:"role"` } - 签发时显式构造实例:
claims := MyClaims{StandardClaims: jwt.StandardClaims{ExpiresAt: time.Now().Add(24 * time.Hour).Unix()}, UserID: 123, Role: "admin"} - 密钥必须是
[]byte,别传字符串字面量直接给SigningKey;推荐从环境变量读取后用[]byte(os.Getenv("JWT_SECRET")) - 别用
jwt.SigningMethodHS512却传短密钥——HS512 要求密钥至少 512 位(64 字节),否则Sign会 panic
iris.JWT() 中间件校验失败却没返回 401?
因为 iris.JWT() 是一个“裸”中间件,它只做解析和塞入 ctx.Values(),不自动拦截非法 token。错误时它默认继续执行后续 handler,而不是中断。
{"answer":"OpenClaw Agent 优化套件,防止令牌泄露与上下文膨胀。适用于需实现后台任务隔离或重置与摘要工作流(RAG)的场景。"}
实操建议:
- 必须配合
ctx.StatusCode(iris.StatusUnauthorized)和return手动终止流程,例如:if err != nil { c.StatusCode(iris.StatusUnauthorized) c.JSON(iris.Map{"error": "invalid token"}) return } - 更稳妥的做法是自己写校验逻辑,用
jwt.ParseWithClaims(tokenString, &MyClaims{}, keyFunc),别依赖iris.JWT()的默认行为 - 注意
keyFunc返回的密钥必须和签发时一致;若用 RSA,这里要返回*rsa.PublicKey,且签发时得用*rsa.PrivateKey - 校验前先检查
tokenString是否为空或长度过短(如len(tokenString) ),避免 <code>Parse对空字符串 panic
Token 过期后 iris.JWT() 仍返回有效 claims?
这是典型的时间校验被绕过:要么没启用 VerifyExpiresAt,要么系统时间不准,或 token 里压根没写 exp 字段。
实操建议:
- 签发时务必设置
ExpiresAt,且用time.Now().Add(...).Unix(),别用固定时间戳 - 解析时显式启用验证:
token, err := jwt.ParseWithClaims(tokenString, &MyClaims{}, keyFunc, func(t *jwt.Token) error { return t.Method.Alg() == "HS256" }) // 必须手动检查 if !token.Valid { // 处理无效 } - 检查
MyClaims是否嵌入了jwt.StandardClaims(它含ExpiresAt、IssuedAt等字段) - 服务器时间和 NTP 同步,否则本地时间快几分钟就会导致刚生成的 token 被判为已过期
Iris 对 JWT 没有开箱即用的全自动方案,所有关键环节——提取、解析、校验、拦截——都得手动控制。最容易被忽略的是:解析成功不等于 token 有效,必须显式调用 token.Valid 并处理各种 jwt.ValidationError 子类型(比如 jwt.ValidationErrorExpired)。

















