如何在go-chi中组合Basic Auth与API Key认证中间件?
Go-Chi 动态选择认证方式的自定义中间件实现
要实现当请求头存在X-API-KEY时使用API Key认证,否则使用Basic Auth的逻辑,你需要编写一个自定义中间件来动态路由认证流程,替代原来同时挂载两个中间件的方式(避免双重认证冲突)。
自定义组合中间件实现
// 自定义中间件,接收两个认证中间件作为参数 func CustomAuthMiddleware(basicAuthMw, apiKeyMw func(http.Handler) http.Handler) func(http.Handler) http.Handler { return func(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { // 检查请求头中是否存在X-API-KEY if _, hasAPIKey := r.Header["X-API-KEY"]; hasAPIKey { // 存在API Key,使用APIKeyMiddleware处理认证 apiKeyMw(next).ServeHTTP(w, r) } else { // 不存在API Key,使用BasicAuthMiddleware处理认证 basicAuthMw(next).ServeHTTP(w, r) } }) } }
路由配置修改
将原来的两个中间件挂载替换为自定义中间件:
router := chi.NewRouter() // 替换router.Use(BasicAuthMiddleware)和router.Use(APIKeyMiddleware) router.Use(CustomAuthMiddleware(BasicAuthMiddleware, APIKeyMiddleware)) // 后续添加你的路由规则 // router.Get("/api/resource", yourHandler)
逻辑说明
- 中间件会先检查请求头是否包含
X-API-KEY,优先走API Key认证流程 - 如果API Key认证失败(比如密钥无效),
APIKeyMiddleware会直接返回401响应,不会触发Basic Auth流程 - 当请求头无
X-API-KEY时,自动降级使用Basic Auth认证
内容的提问来源于stack exchange,提问作者poundifdef
相关产品推荐
相关产品推荐

