2022-03-07 20:49:02 +08:00

118 lines
3.6 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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)
})
})
})