Node.js: 處理機密資訊
如何使用 Node.js 處理機密資訊
👋 歡迎來到 Stackhero 文檔!
Stackhero 提供一個即用型的 Node.js 雲端 解決方案,帶來多項好處,包括:
- 只需一個簡單的
git push,即可在幾秒鐘內 部署您的應用程式。- 使用您自己的域名,並享受 HTTPS 證書的自動配置,增強安全性。
- 享受自動備份、一鍵更新,以及簡單、透明且可預測的定價,讓您安心無憂。
- 憑藉專用的私人 VM,獲得最佳的性能和強大的安全性。
節省時間並簡化您的生活:只需 5 分鐘即可嘗試 Stackhero 的 Node.js 雲端託管 解決方案!
當您的 Node.js 專案需要與資料庫、Object Storage 或外部 API 互動時,安全地儲存認證資訊(如用戶名稱、密碼或 Token)是非常重要的。這些認證資訊通常被稱為「機密資訊」(secrets)。保護您的機密資訊對於維護應用程式的安全性至關重要。
您可能會想這樣做
一開始,您可能會考慮直接在程式碼中寫入認證資訊,例如:
// 連接到 PostgreSQL 資料庫
const pg = new Client({
host: '<XXXXXX>.stackhero-network.com',
user: 'admin',
password: 'myPassword',
database: 'admin'
});
然而,這種做法並不安全。因為您的機密資訊很容易被提交到 Git repository,讓任何有權限的人都能看到。即使您認為只有自己有權限,這其實就像把寫有密碼的便利貼貼在螢幕上,然後希望沒有人會注意到一樣。最終這可能會導致嚴重的安全問題。
此外,將機密資訊硬編碼在程式碼中,會讓您難以順利管理不同的環境,例如開發與生產環境。
使用環境變數
業界常見的最佳實踐,是將機密資訊儲存在環境變數(environment variables)中。
環境變數是在程式碼之外定義,並於 Node.js 啟動前設定的。這樣,所有機密資訊都透過環境變數來管理,永遠不會硬編碼在應用程式裡。
定義您的第一個環境變數
您可以在啟動 Node.js 指令時設定環境變數,例如:
MY_PASSWORD=myDevelopmentPassword node app.js
這個指令會建立一個名為 MY_PASSWORD 的變數,值為 myDevelopmentPassword。格式很簡單:<KEY>=<value>。
依照慣例,環境變數會以大寫字母命名。請注意,環境變數只能儲存字串,不能是陣列或物件。
讀取環境變數
在您的 app.js 檔案中,您可以透過 process.env 來存取環境變數,例如:
console.log(process.env.MY_PASSWORD);
這會顯示 myDevelopmentPassword。
現在,您的密碼已經定義在程式碼之外,有助於避免它意外被提交到 Git repository。
如果您在生產環境中使用 Stackhero,可以直接在 Node.js 服務的 Dashboard 上新增一個名為 MY_PASSWORD 的環境變數,值設為 myProductionPassword。這樣可以讓不同環境之間的切換更加順暢。
Stackhero 控制台上的 Node.js 設定範例
有了這個設定,您的密碼就不會再儲存在程式碼中,並且可以輕鬆為開發與生產環境分別使用不同的認證資訊。
使用 dotenv 套件
在實際專案中,您通常需要管理多個機密資訊。例如,連接資料庫時,可能需要主機名稱、用戶名稱和密碼。
管理單一機密資訊很簡單,但如果要同時處理多個,啟動指令就會變得很複雜。例如:
POSTGRESQL_HOST=<XXXXXX>.stackhero-network.com POSTGRESQL_USER=admin POSTGRESQL_PASSWORD=myPassword node app.js
這樣很快就會變得難以閱讀與維護。在生產環境中,您可能還需要更多變數,這種方式就不太實用。
這時候,dotenv 套件就能派上用場。
使用 dotenv,您可以將機密資訊存放在一個獨立的 .env 檔案中。
首先,請安裝 dotenv 套件:
npm install dotenv
接著,建立一個 .env 檔案來存放您的變數:
POSTGRESQL_HOST=<XXXXXX>.stackhero-network.com
POSTGRESQL_USER=admin
POSTGRESQL_PASSWORD=myPassword
為了保護您的機密資訊,請確保 .env 檔案沒有被加入到 Git repository。您可以將它加入 .gitignore 檔案:
echo ".env" >> .gitignore
最後,在 app.js 檔案最上方載入 dotenv 套件:
require("dotenv").config();
這樣設定後,當您在開發機器上用 node app.js 啟動應用程式時,dotenv 會自動讀取 .env 檔案。在生產環境中,則不需要 .env 檔案,環境變數會直接從 Node.js 服務的設定中取得,您可以透過 Stackhero 控制台來管理。
實作範例
理論說明完畢,現在讓我們看看實際範例。
您可以在這裡找到完整的範例程式碼:https://github.com/stackhero-io/dotenvWithNodejs
透過這些技巧,您可以靈活且安全地管理機密資訊,讓整個流程既簡單又高效。