前言
最近串接一個電子簽核服務,要接「簽署完成」的通知。翻遍文件,關於這個通知欄位的說明只有一句話:
notifyUrl(字串、選填):簽署完成後,會發送通知到這個網址。
就這樣,沒了。POST 的內容是什麼?欄位有哪些?有沒有簽章驗證?打失敗會不會重送?文件通通沒寫。
最近串接一個電子簽核服務,要接「簽署完成」的通知。翻遍文件,關於這個通知欄位的說明只有一句話:
notifyUrl(字串、選填):簽署完成後,會發送通知到這個網址。
就這樣,沒了。POST 的內容是什麼?欄位有哪些?有沒有簽章驗證?打失敗會不會重送?文件通通沒寫。
很多前後分離專案的認證一路都是 JWT:後台管理員登入後拿到 Token,之後每個請求都帶 Authorization: Bearer ...。
用久了容易有個錯覺,好像 ASP.NET Core 的認證就只有 JWT 這條路。
其實不是。ASP.NET Core 的認證系統是可插拔的 Scheme 架構,JWT 只是其中一種掛上去的 Scheme。
這次剛好有個需求可以拿來示範:ERP 廠商要打我們的 API,但他們不是「會登入的使用者」,給不了帳密,也不適合走 JWT 換 Token 那一套。
這種機器對機器、長期有效的靜態金鑰,用 API Key 才對。
這篇想做兩件事:
前後端分離寫久了,總會遇到那個熟悉的紅字:
Access to fetch at 'https://api.example.com' from origin 'https://www.example.com'
has been blocked by CORS policy.
前端工程師看到這行,第一反應通常是轉頭問後端:「你 CORS 開了沒?」
後端工程師則是一臉無辜:「我本機明明可以啊。」
問題就在這裡:CORS 是瀏覽器的安全機制,本機用 Postman、Swagger 打都不會擋,
只有真的從另一個網域用瀏覽器發請求才會觸發。所以「我本機可以」這句話在 CORS 面前完全沒意義。
這篇就把 ASP.NET Core 的 CORS 設定一次講清楚,並把它封裝成一個擴充方法,
搭配設定檔的允許清單,讓 Program.cs 只剩乾淨的一行。
JWT 大家都在用,但「怎麼產生」這件事其實有不只一種寫法。
早期我手刻過一版——自己組 header、payload,自己做 Base64Url 編碼,自己用 HMACSHA256 算簽名。
能動是能動,但每次要加個 claim、換個演算法都得回去改一堆字串拼接,心裡總是毛毛的。
後來改用套件,又面臨一個選擇題:
要用微軟官方的 Microsoft.IdentityModel,還是社群很受歡迎的 jwt-dotnet?
這篇就把這兩套放在一起比。重點是它們在我的專案裡實作的是同一份介面 IJsonWebTokenService,
所以可以靠 DI 一行切換引擎,呼叫端完全無感。
近期因為工作需求和電子商務相關,所以來做個範例。
開發功能之前不免俗要來吐槽一下,
研究顯示,網頁機器人解 CAPTCHA 能力優於人類
本來 reCaptcha 是要擋機器人的,但最後都是拿來為難人類自己。
本篇文章是基於建立一個本地端的應用程式的情境,
用 Minimal API 搭配 Vue 可以輕鬆建構類單機應用,
透過設定把靜態檔案嵌入並發佈單一檔案,
就可以讓前端工程師專注在畫面的設計,
算是個不錯的解決方案。
一份好的 API 文件應該要有明確充足的說明,
不過在台灣一條龍開發的文化行之有年,要完善文件說明相對不容易。
工程師討厭的事情:「討厭別人不寫文件,討厭自己要寫文件」。
所以透過好用的工具配合程式註解產出文件可以有效降低大家的痛苦。
本文說明如何設定 API 的網址大小寫,
雖說網址大小寫對 SEO 基本沒影響,只要格式一致均可。
不過如果有不喜歡大駝峰的命名規則有兩種做法
本文將透過更改選項的方式來設定路由規則。
基於 ASP.NET Core 6 開發的 Web API
讀取 appsettings.json 實作 跨來源資源共用
// 讀取允許列表
string[] corsOrigins = appsettings.GetSection("CORS:AllowOrigins").Get<string[]>();
// 加入具有預設原則的 CORS 和中介軟體
builder.Services.AddCors(options =>
{
options.AddDefaultPolicy(
policy =>
{
if (corsOrigins.Contains("localhost"))
{
policy.SetIsOriginAllowed(origin => new Uri(origin).Host == "localhost");
}
else
{
policy.WithOrigins(corsOrigins);
}
policy.AllowAnyHeader();
policy.AllowAnyMethod();
policy.AllowCredentials();
});
});
[[install_ubuntu_22.04]]
盡量照順序做
sudo apt update
sudo apt install nginx
sudo apt-get update
sudo apt-get install -y dotnet-sdk-6.0
指定專案發佈目錄並輸入指令