iT邦幫忙

2025 iThome 鐵人賽

DAY 26
0

今日目標

在這篇中,我們要解決一個實務問題:
FinMind API Token 要放哪裡?

許多人在專案中會直接把 Token 寫在程式碼裡,例如:

var apiToken = "abcdefg123456";  // 不建議這樣做

這樣雖然方便,但存在高風險。
今天我們會介紹:

  1. 為什麼不應該把 Token 寫在程式裡
  2. 如何使用「環境變數 (Environment Variable)」儲存 Token
  3. Windows 上實際設定範例(FINMIND_API_TOKEN
  4. 在 C# 中安全讀取環境變數
  5. Token 暴露的風險與防護建議

1. 為什麼不要把 Token 寫死在程式中

當你將 Token 寫入原始碼中(例如在 .cs 檔或 appsettings.json),
這些內容在 push 到 GitHub、雲端儲存或被他人查看原始碼時,
就等同於公開了你的授權金鑰

常見風險包括:

  • 一旦 push 到 GitHub,機器人會自動掃描並竊取 Token
  • 私有專案中的其他開發者也能輕易看到
  • 修改 Token 需要重新編譯程式

正確做法是:
將 Token 放在「環境變數」中,程式執行時再讀取。


2. 使用環境變數儲存 Token

環境變數是作業系統層級的設定,
可以讓程式安全地在執行時取得設定值,
而不需要將內容放在程式碼或設定檔中。

在 Windows 上設定

建立一個批次檔 設定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,代表環境變數已正確設定。


3. 在 C# 中讀取環境變數

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

優點:

  • Token 不會出現在程式碼中
  • 不會被 Git 版本控制追蹤
  • 不同環境可使用不同設定

4. 在 MyStockApp 專案中使用 Token

在 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 不會出現在原始碼中
  • 每次程式執行時自動讀取 Token
  • 可針對不同開發環境設定不同 Token

5. API Token 暴露的風險

若 Token 不慎外洩,會造成以下風險:

  • 他人可使用你的 Token 發出 API 請求,導致流量超額或帳號被封鎖
  • 攻擊者可利用 Token 獲取資料或進行惡意操作
  • 若是具授權金流、資料修改權限的 API,後果更嚴重

常見的暴露管道

來源 說明
原始碼 直接硬編在程式中並 push 到 GitHub
設定檔 appsettings.json.config 被誤傳
Log 檔 程式輸出 Token 到日誌中
共用環境 他人能登入同一台主機並讀取環境變數

6. 安全建議

  • 使用環境變數或 .env 檔(且不要加入 Git 版控)

  • 若需多人共享設定,可使用:

    • GitHub Secrets
    • Azure Key Vault
    • AWS Secrets Manager
  • 避免在 Console、Exception 或 Log 中輸出 Token

  • 若懷疑 Token 洩漏,應立即撤銷並重新申請


小結

今天學習了:

  1. 為什麼不應該將 Token 寫死在程式中
  2. 如何使用環境變數在 Windows 儲存 Token
  3. 在 C# 中透過 Environment.GetEnvironmentVariable() 安全讀取
  4. Token 暴露的風險與防護方式


上一篇
Day 25 — 在 WPF 使用 Microsoft.Extensions.DependencyInjection 做 DI
下一篇
Day 27 — 開發者閒聊:Try-Catch 怎麼寫才算「有用」?
系列文
30天快速上手製作WPF選股工具 — 從C#基礎到LiteDB與Web API整合28
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言