gin.BasicAuth 为生产环境 Swagger UI 文档加上密码保护

文章目录

    虽然大家都推荐将 Swagger 接口文档服务部署在开发环境,但是由于现公司前后端开发人员异地办公,我还是倾向于将 swaggo 服务部署在生产环境。加上个简单的账号密码访问限制即可。

    方案选型

    最终,我选择了 gin basic auth 的方案,主要是写在代码里,省去了线上一丢丢地配置麻烦。以后迁移服务器也不用太操心。

    安全问题

    url 中不使用 swagger 前缀,防止 swagger 出现比较大的漏洞,被人扫出漏洞。例如这里使用了 api-doc,虽然也很容易被猜出。。。还是自己想个复杂的 url 前缀比较安全。

    实现代码

    package main
    
    import (
    	"github.com/gin-gonic/gin"
    	swaggerFiles "github.com/swaggo/files"
    	ginSwagger "github.com/swaggo/gin-swagger"
    	docs "sunzhongwei.com/some_service/api_docs"
    )
    
    func main() {
    	gin.SetMode(gin.ReleaseMode)
    
    	r := gin.Default()
    	docs.SwaggerInfo.Host = "api.sunzhongwei.com"
    	docs.SwaggerInfo.BasePath = "/api"
    
    	authorized := r.Group("/api-doc", gin.BasicAuth(gin.Accounts{
    		"some_user": "some_password",
    	}))
    	authorized.GET("/*any", ginSwagger.WrapHandler(swaggerFiles.Handler))
    
    	r.Run(":8089") // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080")
    }
    

    意外的惊喜

    之前记录了一个需求,就是开发环境与生产环境如何使用不同的 host 配置。

    将 swaggo 与 api 服务剥离之后,就完美实现了这一点,即 docs.SwaggerInfo.Host 覆盖掉 api main.go 中的配置。

    关于作者 🌱

    我是来自山东烟台的一名开发者,有感兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊,或者关注我的个人公众号“大象工具”, 查看更多联系方式