虽然大家都推荐将 Swagger 接口文档服务部署在开发环境,但是由于现公司前后端开发人员异地办公,我还是倾向于将 swaggo 服务部署在生产环境。加上个简单的账号密码访问限制即可。
方案选型
- Nginx auth
- golang gin auth
最终,我选择了 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 聊聊, 查看更多联系方式