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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 13:42:09