前篇我們使用 Chrome 啟用 CORS 設定可以做跨域打 API,像使用 OpenAPI 瀏覽器都有關掉 CORS,所以在測試上都會很不方便。所以我在找 Chrome 有什麼方法可以做到這件事,這樣就不用自己寫 Electron 之類東西;我不太想用相關套件,因為之前有報過相關套件有些有會偷個資,有內建可繞過就很方便,最後爬到一篇可以用,Firefox沒有找到方法。
實例 OAS 做 Line OAuth
首先用 Line 新增一個 OAuth Login,需要有一組 clientId
和 secret
。需要設定 redirectUrl 為http://127.0.0.1:8080/oauth2-redirect.html
,不然會進不去 Line Login。
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
帶參數會連不到,但是沒帶參數正常。
用我修改 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
|
就可以正常使用這個功能。
手動測試 profile API 可以取得到資料。
番外 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