Contents

使用 swagger-ui-cli 工具看 OpenAPI 文件與測試

前篇我們使用 Chrome 啟用 CORS 設定可以做跨域打 API,像使用 OpenAPI 瀏覽器都有關掉 CORS,所以在測試上都會很不方便。所以我在找 Chrome 有什麼方法可以做到這件事,這樣就不用自己寫 Electron 之類東西;我不太想用相關套件,因為之前有報過相關套件有些有會偷個資,有內建可繞過就很方便,最後爬到一篇可以用,Firefox沒有找到方法。

實例 OAS 做 Line OAuth

首先用 Line 新增一個 OAuth Login,需要有一組 clientIdsecret。需要設定 redirectUrl 為http://127.0.0.1:8080/oauth2-redirect.html ,不然會進不去 Line Login。

https://i.imgur.com/bzQcBON.png

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
openapi: '3.0.2'
info:
  title: Line OAuth2 測試
  version: '1.0'
servers:
  - url: https://api.line.me
paths:
  /v2/profile:
    get:
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                title: profileResponse
                type: object
                description: profile response data
                properties:
                  user:
                    type: string
                  displayName:
                    type: string
                  pictureUrl:
                    type: string

components:
  securitySchemes:
    LineAccessCode:
      type: oauth2
      flows: 
        authorizationCode:
          authorizationUrl: https://access.line.me/oauth2/v2.1/authorize
          tokenUrl: https://api.line.me/oauth2/v2.1/token
          scopes:
            profile: ""
            openid: ""


security:
  - LineAccessCode: []

可以使用swagger-ui-cli - npm,來啟用 swagger ui 。 但我只不到別的方法,所以直接看程式哪裡出問題,直接 Fork 出來修正,希望作者能 PR 上去,希望能成為我第一個 PR 項目XD。(2022-10-24 作者已經 Merge)

1
2
# 啟動 swagger ui
swagger-ui ./openapi.yaml 

我後來發現 http://127.0.0.1:8080/oauth2-redirect.html 帶參數會連不到,但是沒帶參數正常。
https://i.imgur.com/bL5V6Gb.png

用我修改 PR項目可以解決問題。Fix Swagger UI OAuth2 Redirect URL with parameters return 404 Response. by malagege · Pull Request #3 · egomobile/swagger-ui-cli,最後我這個 PR 順利到 Merge 專案,0.14版本就可以正常使用。

使用上面貼的指令。

1
2
3
4
5
# MacOS (in Terminal)
open -na Google\ Chrome --args --user-data-dir=/tmp/temporary-chrome-profile-dir --disable-web-security --disable-site-isolation-trials

# Windows (from "Run" dialog [Windows+R] or start menu in Windows 8+)
chrome.exe --user-data-dir=%TMP%\temporary-chrome-profile-dir --disable-web-security --disable-site-isolation-trials

就可以正常使用這個功能。

https://i.imgur.com/1UUyWjl.png

手動測試 profile API 可以取得到資料。

https://i.imgur.com/xNBdNrA.png

番外 Net Core Swagger 程式設定 OAuth2

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
            services.AddSwaggerGen(c =>
            {
                c.SwaggerDoc("v1", new OpenApiInfo
                {
                    Title = "Hybrid",
                    Version = "v1",
                    Description = "混合API使用",
                });
                // Set the comments path for the Swagger JSON and UI.
                var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
                var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);
                c.IncludeXmlComments(xmlPath, true);
                c.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
                {
                    In = ParameterLocation.Header,
                    Description = "Please insert JWT with Bearer into field",
                    Name = "Authorization",
                    Type = SecuritySchemeType.ApiKey
                });
                c.AddSecurityDefinition("Line", new OpenApiSecurityScheme
                {
                    Type = SecuritySchemeType.OAuth2,
                    Flows =  new OpenApiOAuthFlows()
                    {
                        AuthorizationCode = new OpenApiOAuthFlow()
                        {
                            AuthorizationUrl = new Uri("https://access.line.me/oauth2/v2.1/authorize"),
                            TokenUrl = new Uri("https://api.line.me/oauth2/v2.1/token"),
                            Scopes = { { "profile", ""}, { "openid", ""} }
                        }
                    }
                });
                c.AddSecurityRequirement(new OpenApiSecurityRequirement {
                {
                    new OpenApiSecurityScheme
                    {
                        Reference = new OpenApiReference
                        {
                        Type = ReferenceType.SecurityScheme,
                        Id = "Bearer"
                        }
                    },
                    new string[] { }
                } });
                c.AddSecurityRequirement(new OpenApiSecurityRequirement {
                {
                    new OpenApiSecurityScheme
                    {
                        Reference = new OpenApiReference
                        {
                        Type = ReferenceType.SecurityScheme,
                        Id = "Line"
                        }
                    },
                    new string[] { }
                } });
            });

番外 Pull Request

人生第一次用工具發現工具有問題,想說不應該發生這個問題就跑去看原始碼,第一次發現問題自己修正,然後 Pull Request 成功被 Merge 進去,第一次加進去 Contributors 有莫名其妙榮譽感(雖然 Star 數不多的),但是我還是很高興,不知道有沒有機會拿到PULL SHARK 徽章? 確定拿不到,因為要有 2個 Pull Request。不知道有生之年還有沒有第二次機會。

參考:How to get PULL SHARK acheivement? · Discussion #20357 · community/community