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

更新日期: 2022-09-01 阅读次数: 2331 字数: 312 分类: golang

虽然大家都推荐将 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 中的配置。

tags: swagger

关于作者 🌱

我是来自山东烟台的一名开发者,有敢兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊, 查看更多联系方式