在這篇中,我們要解決一個實務問題:
FinMind API Token 要放哪裡?
許多人在專案中會直接把 Token 寫在程式碼裡,例如:
var apiToken = "abcdefg123456"; // 不建議這樣做
這樣雖然方便,但存在高風險。
今天我們會介紹:
FINMIND_API_TOKEN
)當你將 Token 寫入原始碼中(例如在 .cs
檔或 appsettings.json
),
這些內容在 push 到 GitHub、雲端儲存或被他人查看原始碼時,
就等同於公開了你的授權金鑰。
常見風險包括:
正確做法是:
將 Token 放在「環境變數」中,程式執行時再讀取。
環境變數是作業系統層級的設定,
可以讓程式安全地在執行時取得設定值,
而不需要將內容放在程式碼或設定檔中。
建立一個批次檔 設定FinMindToken.bat
:
@echo off
chcp 65001 >nul
REM ==========================================
REM 批次檔:set_finmind_token.bat
REM 功能:建立/更新環境變數 FINMIND_API_TOKEN
REM ==========================================
set /p TOKEN=請輸入你的 FinMind API Token:
REM ===寫入使用者環境變數===
setx FINMIND_API_TOKEN "%TOKEN%" >nul
echo [OK] 已永久設定 FINMIND_API_TOKEN 到使用者環境變數。
echo (請重新開啟 VS/VSCode 或新的 cmd 視窗後才會生效)
pause
執行後,系統會把 Token 永久寫入使用者的環境變數。
重新啟動命令提示字元或 Visual Studio 後,設定才會生效。
在命令提示字元 (CMD) 中輸入:
echo %FINMIND_API_TOKEN%
若顯示出你的 Token,代表環境變數已正確設定。
C# 可以透過 Environment.GetEnvironmentVariable()
取得環境變數的值:
string? finmindToken = Environment.GetEnvironmentVariable("FINMIND_API_TOKEN");
if (string.IsNullOrEmpty(fmindToken))
{
Console.WriteLine("未設定 FinMind API Token,請先執行設定批次檔。");
return;
}
Console.WriteLine($"成功讀取 Token(長度 {fmindToken.Length})");
優點:
在 WPF 專案 MyStockApp 中,如果要整合 FinMind API,
可以在 App.xaml.cs
的 DI 註冊階段讀取環境變數並設定 HttpClient
:
services.AddHttpClient<IFinMindService, FinMindService>((sp, client) =>
{
var token = Environment.GetEnvironmentVariable("FINMIND_API_TOKEN");
if (string.IsNullOrEmpty(token))
throw new InvalidOperationException("未設定 FINMIND_API_TOKEN 環境變數。");
client.DefaultRequestHeaders.Add("Authorization", $"Bearer {token}");
client.BaseAddress = new Uri("https://api.finmindtrade.com/api/v4/");
});
這樣設定後:
若 Token 不慎外洩,會造成以下風險:
來源 | 說明 |
---|---|
原始碼 | 直接硬編在程式中並 push 到 GitHub |
設定檔 | appsettings.json 或 .config 被誤傳 |
Log 檔 | 程式輸出 Token 到日誌中 |
共用環境 | 他人能登入同一台主機並讀取環境變數 |
使用環境變數或 .env
檔(且不要加入 Git 版控)
若需多人共享設定,可使用:
避免在 Console、Exception 或 Log 中輸出 Token
若懷疑 Token 洩漏,應立即撤銷並重新申請
今天學習了:
Environment.GetEnvironmentVariable()
安全讀取