跳到正文
土土金API

API Key 安全最佳實踐:只放服務端,每個專案一把 Key

誰拿到 API Key,誰就能用你的餘額呼叫模型。本文給出 8 條做法:只在服務端使用,用環境變數或金鑰管理服務儲存,按專案拆分,設額度上限和過期時間,開 IP 與模型白名單,定期輪換,盯操作日誌,以及洩露後的處理步驟。

誰拿到你的 API Key,誰就能用你的餘額呼叫模型。守住三條底線:Key 只放在服務端;不進前端程式碼、App 安裝包和 git 倉庫;每把 Key 都設額度上限。再加上過期時間、IP 白名單和模型白名單,就算某把 Key 洩露了,損失也只限於它自己的額度。

Key 是怎麼洩露的

常見場景為什麼危險正確做法
寫在網頁、小程式的前端程式碼裡開啟瀏覽器開發者工具就能看到前端呼叫自己的後端,由後端呼叫 API
打包進 App 安裝包安裝包可以被解包,一搜字串就能找到同樣經由後端轉發
提交到 git 倉庫倉庫一旦公開或被別人克隆就洩露了;刪掉檔案,歷史記錄裡還在用環境變數;提交過的 Key 一律當作已洩露,馬上更換
貼在聊天群、工單、截圖裡轉發幾次就不知道到了誰手裡發出去之前先打碼
日誌裡列印完整的請求頭日誌系統裡的明文很多人都能看到列印前脫敏,只保留首尾幾位

8 條做法

1. 只在服務端呼叫

瀏覽器或 App 呼叫你自己的後端介面,後端先做登入校驗和限流,再帶上 Key 請求土土金 API:

Node.js
import express from 'express'
import OpenAI from 'openai'

const app = express()
app.use(express.json())
const client = new OpenAI({ baseURL: 'https://www.tutujin.com/v1', apiKey: process.env.TUTUJIN_API_KEY })

app.post('/ask', async (req, res) => {
  // 先校验你自己的登录状态,并按用户限流
  const resp = await client.chat.completions.create({
    model: 'gpt-5.4-mini',
    messages: [{ role: 'user', content: String(req.body.question ?? '').slice(0, 2000) }],
    max_tokens: 500,
  })
  res.json({ answer: resp.choices[0].message.content })
})

app.listen(3000)

Key 只出現在伺服器的環境變數裡,瀏覽器拿到的只有回答。

2. 用環境變數或金鑰管理服務儲存

cURL
# 在服务器上设置环境变量,或写进只存在于服务器上的 .env 文件
export TUTUJIN_API_KEY="sk-你的Key"

# 确保 .env 不会被提交到仓库
echo ".env" >> .gitignore

團隊規模大一些,可以用雲廠商的金鑰管理服務或 Vault 統一儲存和下發,程式碼裡只讀取,不寫死。

3. 一個專案、一個環境一把 Key

比如「客服機器人-生產」「客服機器人-測試」各用一把。出問題時只停一把,不影響其他業務;操作日誌也能按 Key 分清每個專案花了多少。

4. 設額度上限和過期時間

額度上限是這把 Key 最多能花的錢,用完自動停用。過期時間適合臨時專案、外包合作和演示環境,到期自動失效,不用記著去刪。

5. 開 IP 白名單

只允許你的伺服器出口 IP 呼叫,不在名單裡的請求會被拒絕,返回 403。這樣 Key 就算被別人拿到,在他的機器上也用不了。伺服器換了出口 IP,記得同步更新白名單。

6. 開模型白名單

只放行業務需要的模型,呼叫名單外的模型會返回 403。Key 洩露後,別人也沒法拿它去調昂貴的模型。

7. 定期輪換

每隔一段時間(比如每個季度)換一次 Key:先新建,更新服務端配置,確認呼叫正常後再刪舊的。有人離職、外包專案結束時也要換。

8. 盯著操作日誌

操作日誌裡出現沒見過的模型、半夜的呼叫或者用量突然暴漲,先停用對應的 Key,再查原因。

懷疑洩露時怎麼處理

  1. 在控制台停用或刪除這把 Key。
  2. 新建一把 Key,更新服務端配置並重新部署。
  3. 在操作日誌裡核對洩露期間的呼叫和費用。
  4. 排查洩露途徑:git 歷史、日誌、前端程式碼、聊天記錄。
  5. 如果有異常消費,加客服微信 JsnonoChat,提供時間段和報錯資訊裡的 request id。

控制台裡的 Key

控制台的 Key 列表只顯示掩碼,需要時再檢視完整 Key。建立後直接寫進伺服器的環境變數或金鑰管理服務,別存在個人電腦的文本檔案或聊天記錄裡。

請求頭的寫法見認證與 Base URL,401、403 等錯誤的含義見錯誤碼與重試。額度上限和白名單同時也是控制成本的手段,見如何控制 API 成本。

常見問題

Key 洩露了怎麼辦?

馬上在控制台停用或刪除這把 Key,新建一把並更新服務端配置,再到操作日誌裡核對洩露期間的呼叫。發現異常消費,加客服微信 JsnonoChat,提供時間段和報錯裡的 request id。

網頁或 App 能直接呼叫 API 嗎?

不建議。前端程式碼和安裝包對使用者是可見的,Key 放在裡面遲早會洩露。前端應呼叫你自己的後端介面,由後端帶上 Key 請求土土金 API。

IP 白名單填什麼?

填呼叫 API 的伺服器出口公網 IP,可以填多個 IP 或網段。不在白名單裡的請求會被拒絕,返回 403。

為什麼控制台的 Key 列表只顯示一部分?

列表只顯示掩碼,需要時再檢視完整 Key,這樣在螢幕共享、截圖時不容易意外洩露。