You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

go-swagger中无效bearer token如何返回401/404而非500状态码

解决方案

go-swagger的鉴权逻辑对错误类型有预设判定规则,你只需要在校验失败时,返回go-openapi/errors包内置的未授权错误即可触发401状态码返回,不需要修改全局响应逻辑。

实现步骤

  1. 首先导入依赖包:
import "github.com/go-openapi/errors"
  1. 修改你的bearer token校验方法,在token无效(过期、签名错误、不存在等场景)时,不要返回自定义error,而是返回errors.Unauthorized()方法生成的错误:
// 原来的校验方法示例(返回自定义错误,会被识别为服务内部错误,返回500)
func validateBearerToken(token string) (interface{}, error) {
    valid, userInfo := checkTokenValid(token)
    if !valid {
        // 错误写法:返回自定义错误
        return nil, errors.New("Token is expired")
    }
    return userInfo, nil
}

// 修改后的校验方法(返回指定类型错误,自动触发401)
func validateBearerToken(token string) (interface{}, error) {
    valid, userInfo := checkTokenValid(token)
    if !valid {
        // 正确写法:返回errors包的Unauthorized错误,第二个参数是你要返回的错误提示文本
        return nil, errors.Unauthorized("Token is expired")
    }
    return userInfo, nil
}
  1. 测试验证,修改后鉴权失败时服务会自动返回如下响应:
{
    "code": 401,
    "message": "Token is expired"
}

补充说明

go-swagger的错误处理逻辑会自动识别errors包下的特定错误类型:

  • 返回errors.Unauthorized() → 响应401状态码
  • 返回errors.Forbidden() → 响应403状态码
  • 返回其他自定义error → 默认响应500状态码

可选:自定义401响应结构

如果默认的响应格式不符合你的业务要求,可以在服务生成的configure_<你的服务名>.go文件中,修改ServeError方法,对Unauthorized类型的错误做自定义结构封装:

func configureAPI(api *operations.MyRestAPI) http.Handler {
    // 其他配置...
    api.ServeError = func(w http.ResponseWriter, r *http.Request, err error) {
        if e, ok := err.(*errors.CompositeError); ok && e.Code == http.StatusUnauthorized {
            // 自定义返回结构
            w.Header().Set("Content-Type", "application/json")
            w.WriteHeader(http.StatusUnauthorized)
            json.NewEncoder(w).Encode(map[string]interface{}{
                "code": 10001, // 自定义业务错误码
                "msg": e.Message,
                "data": nil,
            })
            return
        }
        // 其他错误走默认逻辑
        defaults.ServeError(w, r, err)
    }
    // 其他配置...
}

内容的提问来源于stack exchange,提问作者KIRAN KUMAR B

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 22:45:07