Подписанные URL-адреса OG-изображений
Подписанный URL-адрес OG-изображения — это URL, параметры которого защищены подписью HMAC-SHA256, поэтому только вы (и код, хранящий ваш секрет) можете запрашивать рендеринг, который учитывается в вашей месячной квоте. FastOG подписывает содержимое — идентичные параметры всегда создают идентичный, кэшируемый URL, — что одновременно защищает вашу квоту и делает кэширование детерминированным.
Зачем подписывать URL-адреса OG-изображений
Эндпоинт OG-изображений, который отображает произвольный текст из неаутентифицированного URL-адреса, представляет собой бесплатную ферму рендеринга, доступную любому. В сервисе на основе подписки это означает, что любой может расходовать ваш баланс. Подписание каждого URL-адреса секретом, известным только вашему бэкенду, блокирует все несанкционированные запросы при первом (некешированном) обращении, при этом легитимные кешированные URL-адреса продолжают работать.
Как работает подпись контента
- Вы формируете каноническую строку запроса: все параметры (кроме подписи), отсортированные и закодированные по RFC-3986.
- Вы вычисляете
HMAC_SHA256(secret, "GET/api/v1/og\n" + canonical). - Вы добавляете подпись как параметр
s.
Сообщение не содержит метки времени, поэтому URL стабилен: одинаковые параметры → одинаковый URL → одна и та же запись в кэше.
canonical = "key=sk_...&template=default&title=Hello"
signature = HMAC-SHA256(secret, "GET/api/v1/og\n" + canonical)
url = ".../api/v1/og?key=...&template=default&title=Hello&s=" + signature
Компромисс, который часто понимают неправильно
| Опасение | Реальность |
|---|---|
| «Подписанный URL истечёт» | Нет — он подписан по содержимому и действителен, пока вы не смените секрет |
| «Изменённый URL ломает кэш» | Нет — поддельный s получает 401 только при промахе кэша; закэшированные изображения всё равно возвращаются |
| «Для безопасности нужны метки времени» | Подписи по содержимому достаточно, чтобы остановить злоупотребление квотой; часы не нужны |
Одностраничные SDK
FastOG поставляет один файл подписанта (signer) для каждого языка (без зависимостей), поэтому вам не придётся вручную реализовывать HMAC. Скачайте его со страницы SDK или curl напрямую с CDN:
curl -O https://fastog.com/sdk/node.js
FAQ
Истекают ли когда-либо подписанные URL?
По умолчанию нет — они остаются действительными, пока вы не переротируете HMAC-секрет ключа API. Подпись привязана к содержимому, а не ко времени.
Может ли кто-то другой потратить мою квоту, угадав URL?
Нет. Для формирования действительной подписи им нужен ваш HMAC-секрет; без него некэшированные рендеры возвращают 401 invalid_signature.
Подписываю ли я URL в браузере?
Нет. Подписывайте на серверной стороне (или в edge-функции), где секрет никогда не передается клиенту. URL отрендеренного изображения безопасно размещать в вашем публичном <head>.