118 lines
3.6 KiB
Go
Raw Permalink Normal View History

2022-03-07 20:49:02 +08:00
package design
import . "goa.design/goa/v3/dsl"
// 描述一个API的基本信息
var _ = API("Example Service", func() {
Title("A Goa Example Service")
Description("HTTP service for test")
Server("host", func() {
Host("localhost", func() { URI("http://localhost:8088") })
Host("integration", func() { URI("http://localhost:8088") })
})
})
// JWTAuth 描述了一个security scheme使用JWT tokens.
var JWTAuth = JWTSecurity("jwt", func() {
Description(`Secures endpoint by requiring a valid JWT token retrieved via the signin endpoint. Supports scopes "api:read" and "api:write".`)
})
// BasicAuth 描述了一个security scheme使用basic authentication.
var BasicAuth = BasicAuthSecurity("basic", func() {
Description("Basic authentication used to authenticate security principal during signin")
})
// Creds 描述了一个Json对象包含3个字段
var Creds = Type("Creds", func() {
Field(1, "jwt", String, "JWT token", func() {
Example("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ")
})
Field(2, "api_key", String, "API Key", func() {
Example("abcdef12345")
})
Field(3, "oauth_token", String, "OAuth2 token", func() {
Example("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ")
})
Required("jwt", "api_key", "oauth_token")
})
// 使用Service描述一个服务
var _ = Service("Service1", func() {
// 服务的描述信息
Description("The secured service exposes endpoints that require valid authorization credentials.")
// 该服务可能出现的异常情况
Error("unauthorized", String, "Credentials are invalid")
// 描述本服务全局可能可能返回的异常情况的状态码
HTTP(func() {
// 会匹配Error中描述的unauthorized
Response("unauthorized", StatusUnauthorized)
})
GRPC(func() {
Response("unauthorized", CodeUnauthenticated)
})
// 使用Method描述一个具体的请求(Operation)或grpc方法
Method("signin", func() {
// 本方法使用BasicAuth进行认证
Security(BasicAuth)
// 使用Payload描述请求的参数信息(Parameters)
// 如下描述了一个简单的包含了两个参数的请求
Payload(func() {
Description("Credentials used to authenticate to retrieve JWT token")
UsernameField(1, "username", String, "Username used to perform signin", func() {
Example("user")
})
PasswordField(2, "password", String, "Password used to perform signin", func() {
Example("password")
})
Required("username", "password")
})
// 接口正常时的返回结果
Result(Creds)
// HTTP描述
HTTP(func() {
// 使用POST方法请求这个时候Payload会以JSON Body的形式传入
POST("/signin")
// 接口返回时可能出现的状态码
Response(StatusOK)
Response(StatusBadRequest)
})
// GRPC描述
GRPC(func() {
// 接口返回时可能出现的状态码
Response(CodeOK)
Response(CodeInternal)
})
})
Method("secure", func() {
Description("这是一个需要JWT认证的接口")
// 定义使用JWT 认证
Security(JWTAuth)
// Payload信息
Payload(func() {
Field(1, "fail", Boolean, func() {
Description("Whether to force auth failure even with a valid JWT")
})
// 特殊的Field用于让Goa识别该字段为Token且在Header中
TokenField(2, "token", String, func() {
Description("JWT used for authentication")
})
Required("token")
})
// 返回的类型为字符串
Result(String)
HTTP(func() {
GET("/secure")
Response(StatusOK)
})
GRPC(func() {
Response(CodeOK)
})
})
})