diff --git a/tools/goctl/api/swagger/annotation.go b/tools/goctl/api/swagger/annotation.go index 6af5cd3be..09f31097e 100644 --- a/tools/goctl/api/swagger/annotation.go +++ b/tools/goctl/api/swagger/annotation.go @@ -7,6 +7,15 @@ import ( "google.golang.org/grpc/metadata" ) +func hasKey(properties map[string]string, key string) bool { + if len(properties) == 0 { + return false + } + md := metadata.New(properties) + _, ok := md[key] + return ok +} + func getBoolFromKVOrDefault(properties map[string]string, key string, def bool) bool { if len(properties) == 0 { return def diff --git a/tools/goctl/api/swagger/command.go b/tools/goctl/api/swagger/command.go index 75767aac4..2c011a7d0 100644 --- a/tools/goctl/api/swagger/command.go +++ b/tools/goctl/api/swagger/command.go @@ -3,13 +3,13 @@ package swagger import ( "encoding/json" "errors" - "github.com/zeromicro/go-zero/tools/goctl/util/pathx" "os" "path/filepath" "strings" "github.com/spf13/cobra" "github.com/zeromicro/go-zero/tools/goctl/pkg/parser/api/parser" + "github.com/zeromicro/go-zero/tools/goctl/util/pathx" "gopkg.in/yaml.v2" ) diff --git a/tools/goctl/api/swagger/const.go b/tools/goctl/api/swagger/const.go index 1f2d94c7c..bee71ef89 100644 --- a/tools/goctl/api/swagger/const.go +++ b/tools/goctl/api/swagger/const.go @@ -29,4 +29,8 @@ const ( schemeHttps = "https" defaultHost = "127.0.0.1" defaultBasePath = "/" + + swaggerSecurityDefinitionBearerAuth = "BearerAuth" + swaggerSecurityDefinitionName = "Authorization" + swaggerSecurityDefinitionIn = "header" ) diff --git a/tools/goctl/api/swagger/example/example_cn.api b/tools/goctl/api/swagger/example/example_cn.api index 546ebf871..509cf1ddb 100644 --- a/tools/goctl/api/swagger/example/example_cn.api +++ b/tools/goctl/api/swagger/example/example_cn.api @@ -43,6 +43,7 @@ type ( tags: "query 演示" // 对应 swagger 的 tags,可以对 swagger 中的 api 进行分组 summary: "query 类型接口集合" // 对应 swagger 的 summary prefix: v1 + jwt: Auth ) service Swagger { @doc ( diff --git a/tools/goctl/api/swagger/parameter.go b/tools/goctl/api/swagger/parameter.go index 35941ba78..b8a1a4113 100644 --- a/tools/goctl/api/swagger/parameter.go +++ b/tools/goctl/api/swagger/parameter.go @@ -149,13 +149,13 @@ func parametersFromType(method string, tp apiSpec.Type) []spec.Parameter { ExclusiveMaximum: exclusiveMaximum, Minimum: minimum, ExclusiveMinimum: exclusiveMinimum, - Enum: enumsValueFromOptions(jsonTag.Options), + Enum: enumsValueFromOptions(jsonTag.Options), AdditionalProperties: mapFromGoType(member.Type), }, } switch sampleTypeFromGoType(member.Type) { case swaggerTypeArray: - schema.Items=itemsFromGoType(member.Type) + schema.Items = itemsFromGoType(member.Type) case swaggerTypeObject: p, r := propertiesFromType(member.Type) schema.Properties = p @@ -168,6 +168,7 @@ func parametersFromType(method string, tp apiSpec.Type) []spec.Parameter { resp = append(resp, spec.Parameter{ ParamProps: spec.ParamProps{ In: paramsInBody, + Name: paramsInBody, Required: true, Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ diff --git a/tools/goctl/api/swagger/path.go b/tools/goctl/api/swagger/path.go index e15a9bb41..04d4a8d2c 100644 --- a/tools/goctl/api/swagger/path.go +++ b/tools/goctl/api/swagger/path.go @@ -61,6 +61,15 @@ func mergePathItem(old, new spec.PathItem) spec.PathItem { } func spec2Path(info apiSpec.Info, group apiSpec.Group, route apiSpec.Route) spec.PathItem { + needJwt := hasKey(group.Annotation.Properties, "jwt") + var security []map[string][]string + if needJwt { + security = []map[string][]string{ + { + swaggerSecurityDefinitionBearerAuth: []string{}, + }, + } + } op := &spec.Operation{ OperationProps: spec.OperationProps{ Description: getStringFromKVOrDefault(route.AtDoc.Properties, "description", ""), @@ -72,6 +81,7 @@ func spec2Path(info apiSpec.Info, group apiSpec.Group, route apiSpec.Route) spec Deprecated: getBoolFromKVOrDefault(route.AtDoc.Properties, "deprecated", false), Parameters: parametersFromType(route.Method, route.RequestType), Responses: jsonResponseFromType(info, route.ResponseType), + Security: security, }, } externalDocsDescription := getStringFromKVOrDefault(route.AtDoc.Properties, "externalDocsDescription", "") diff --git a/tools/goctl/api/swagger/properties.go b/tools/goctl/api/swagger/properties.go index e9814f363..6a4ebe4f0 100644 --- a/tools/goctl/api/swagger/properties.go +++ b/tools/goctl/api/swagger/properties.go @@ -54,7 +54,7 @@ func propertiesFromType(tp apiSpec.Type) (spec.SchemaProperties, []string) { } switch sampleTypeFromGoType(member.Type) { case swaggerTypeArray: - schema.Items=itemsFromGoType(member.Type) + schema.Items = itemsFromGoType(member.Type) case swaggerTypeObject: p, r := propertiesFromType(member.Type) schema.Properties = p diff --git a/tools/goctl/api/swagger/swagger.go b/tools/goctl/api/swagger/swagger.go index c5f5a2f38..da100d3e8 100644 --- a/tools/goctl/api/swagger/swagger.go +++ b/tools/goctl/api/swagger/swagger.go @@ -12,6 +12,7 @@ import ( func spec2Swagger(api *apiSpec.ApiSpec) (*spec.Swagger, error) { extensions, info := specExtensions(api.Info) + swagger := &spec.Swagger{ VendorExtensible: spec.VendorExtensible{ Extensions: extensions, @@ -25,6 +26,9 @@ func spec2Swagger(api *apiSpec.ApiSpec) (*spec.Swagger, error) { Host: getStringFromKVOrDefault(api.Info.Properties, "host", defaultHost), BasePath: getStringFromKVOrDefault(api.Info.Properties, "basePath", defaultBasePath), Paths: spec2Paths(api.Info, api.Service), + SecurityDefinitions: spec.SecurityDefinitions{ + swaggerSecurityDefinitionBearerAuth: spec.APIKeyAuth(swaggerSecurityDefinitionName, swaggerSecurityDefinitionIn), + }, }, }