主題

HMAC 驗證與安全性

使用 FastOG 的 HMAC-SHA256 驗證來保護您的 HMAC 簽名 OG 圖片 URL。本指南涵蓋每個請求的簽署、驗證與疑難排解,讓您能即時提供動態 Open Graph 圖片——支援訂閱門檻,且渲染次數無上限(無每月渲染配額,也無超量計費)。註冊後,選擇 Dynamic API 方案,接著在儀表板中建立您的 API 金鑰與 HMAC 密鑰(付費 API 渲染乾淨無瑕)。在您的伺服器上簽署一次,幾分鐘內即可整合完成。

🚀 快速入門

第一次接觸 HMAC 簽章? 從這裡開始:

  1. 快速入門指南 — 5 分鐘內完成設定並開始使用
  2. JavaScript 教學 — 適用於 Node.js/Next.js 開發者的完整指南
  3. 所有框架教學 — 選擇您的技術棧:

📚 文件索引

核心概念

  • HMAC 簽章指南 — 完整參考資料,包含演算法細節、需求,以及 JavaScript、PHP 和 Python 的範例
  • HMAC 驗證 — 伺服器端實作細節、安全性功能與錯誤回應

教學課程

快速參考

演算法

method = "GET"
path = "/api/v1/og"
canonicalQuery = every query param EXCEPT `s` (including `key`): array values sorted too; each pair rfc3986Encode(key)=rfc3986Encode(value); pairs sorted lexicographically and joined with "&"

message = method + path + "\n" + canonicalQuery
signature = hex(HMAC-SHA256(message, hmac_secret))

URL: /api/v1/og?title=Hello&key=sk_quick_123abc&s=<signature>

查詢參數

參數 說明 範例
key 完整 API 金鑰 sk_quick_123abc
s HMAC-SHA256 簽章(64 個十六進位字元) 9f8a1b2c3d4e...

錯誤代碼

代碼 HTTP 狀態 說明
missing_signature 401 缺少 key 或 s 參數
invalid_signature 401 簽章不符

🎯 使用情境

部落格文章

為部落格文章產生動態 OG 圖片:

javascript
const ogUrl = generateSignedOgUrl({
    template: "blog",
    title: post.title,
    subtitle: post.excerpt,
    author: post.author.name,
});

// <meta property="og:image" content="{ogUrl}" />

電子商務商品

為商品頁面建立 OG 圖片:

javascript
const ogUrl = generateSignedOgUrl({
    template: "ecommerce",
    title: product.name,
    price: product.price,
    image: product.image,
});

客戶見證

為客戶見證引言產生 OG 圖片:

javascript
const ogUrl = generateSignedOgUrl({
    template: "testimonial",
    author_name: user.name,
    author_avatar: user.avatarUrl,
    quote: user.bio,
});

🔐 安全性

最佳實務

  1. 安全儲存密鑰 — 使用環境變數或密鑰管理服務
  2. 切勿在客戶端程式碼中暴露 HMAC 密鑰 — 僅在伺服器端簽章
  3. 使用 HTTPS — 防止中間人攻擊
  4. 定期輪換密鑰 — 特別是在可能遭到入侵時
  5. 監控簽章失敗 — 重複失敗可能表示遭受攻擊
  6. 每位使用者隔離 — 每個 API 金鑰都有各自的 HMAC 密鑰

取得您的 HMAC 密鑰

  1. 前往 儀表板 → API 金鑰
  2. 建立新的 API 金鑰
  3. 複製 HMAC 密鑰(僅顯示一次!)
  4. 儲存於環境變數中
bash
# .env
FASTOG_HMAC_SECRET=<your-64-char-hex-secret>

🧪 測試

產生測試 URL

bash
# Node.js
node -e "
const crypto = require('crypto');
const enc = (s) => encodeURIComponent(s).replace(/[!'()*]/g, (c) => '%' + c.charCodeAt(0).toString(16).toUpperCase());
const all = { title: 'Test', key: 'sk_quick_123abc' };
const pairs = [];
for (const [k, v] of Object.entries(all)) for (const vv of Array.isArray(v) ? v : [v]) pairs.push(enc(k) + '=' + enc(vv));
pairs.sort();
const canonical = pairs.join('&');
const sig = crypto.createHmac('sha256', 'YOUR_HMAC_SECRET').update('GET/api/v1/og\n' + canonical).digest('hex');
console.log('https://fastog.com/api/v1/og?title=Test&key=sk_quick_123abc&s=' + sig);
"

使用 curl 測試

bash
curl "https://fastog.com/api/v1/og?title=Test&key=sk_quick_123abc&s=<signature>"

預期回應

  • ✅ 有效的簽章 → 回傳 OG 圖片(若模板參數無效則回傳 422)
  • ❌ 無效的簽章 → {"code": "invalid_signature"}
  • ❌ 缺少參數 → {"code": "missing_signature"}

🛠 疑難排解

簽章不符

  1. 確認您使用的是正確的 HMAC 密鑰(請在儀表板中檢查 API 金鑰)
  2. 檢查正規化查詢字串:除了 s 以外的所有查詢參數(包含 key),值需以 rfc3986 編碼,金鑰需依字典序排序
  3. 確認簽章為小寫十六進位格式(64 個字元)

📖 其他資源

❓ 常見問題

問:為什麼使用查詢參數而不是標頭?
答:OG 圖片是由社群網路爬蟲(LinkedIn、Twitter、Facebook)擷取的,這些爬蟲不會傳送自訂標頭。簽章必須放在 URL 中。

問:我可以對多個請求使用相同的簽章嗎?
答:可以。簽章是根據確切的查詢(不含 s)計算出來的,因此只要參數不變,相同的簽署 URL 就會持續有效。若變更任何參數(包括 key),就必須重新簽署。

問:我是否需要為所有範本簽署請求?
答:需要。所有對 /api/v1/og 的請求都需要 HMAC 簽章。

問:如果我的 HMAC 密鑰遭到洩露,會發生什麼事?
答:請在儀表板中撤銷該 API 金鑰並建立新的金鑰。每個 API 金鑰都有各自的 HMAC 密鑰。

問:我可以為內部服務停用 HMAC 驗證嗎?
答:請聯絡支援團隊以取得客製化解決方案。HMAC 驗證是所有公開 API 端點的必要條件。

🆘 支援

需要協助嗎?

免費試用 — 無需註冊

在幾秒內預覽和測試動態 OG 圖片。

開啟免費 OG 圖片測試器

A BeCaSimulations site