go-swagger中无效bearer token如何返回401/404而非500状态码
解决方案
go-swagger的鉴权逻辑对错误类型有预设判定规则,你只需要在校验失败时,返回go-openapi/errors包内置的未授权错误即可触发401状态码返回,不需要修改全局响应逻辑。
实现步骤
- 首先导入依赖包:
import "github.com/go-openapi/errors"
- 修改你的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 }
- 测试验证,修改后鉴权失败时服务会自动返回如下响应:
{ "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
相关产品推荐
相关产品推荐

