Как ограничить API-ключ одним проектом

Создайте отдельный ключ для серверной сверки инвойсов одного проекта: выберите проект, чтение и нужный раздел API, настройте IP и срок действия, затем проверьте границу доступа.

Обновлено:

API-ключ можно привязать к одному проекту Cryptanio. Разберём процесс сверки заказов, который должен читать инвойсы интернет-магазина, но не получать данные остальных проектов аккаунта. Для него нужен отдельный ключ: связь с проектом определяет область данных, а права и разделы API — допустимые операции.

Ни название ключа, ни номер проекта в вашем приложении сами по себе не ограничивают доступ. Ограничение нужно сохранить в политике ключа. Доступ действует для публичного API v1; ключ не является паролем для входа в кабинет.

1. Подготовьте проект и права

Нужны права владельца или администратора аккаунта и существующий активный проект с услугой «Платежи». Сначала убедитесь, что его название и назначение вам понятны: выбор неправильного проекта может дать корректный ключ с неподходящей областью доступа.

Откройте «API-ключи». В форме «Создание API-ключа» задайте «Название», например «Сверка магазина». Отдельное имя помогает отличать серверные процессы, но фактическую защиту задают следующие поля.

2. Выберите режим и конкретный проект

Для чтения реальных инвойсов выберите «Рабочий режим» в поле «Режим». Ключ должен соответствовать режиму данных, которые запрашивает ваш сервер.

В поле «Проект» выберите нужный проект вместо «Все проекты». Кабинет показывает подсказку об ограничении услугой выбранного проекта. Привязка к проекту и доступ к услуге применяются вместе: ключ не включает услугу и не расширяет её возможности сам по себе.

3. Оставьте только чтение инвойсов

В поле «Доступ» выберите «Только чтение». В «Разделы API» оставьте «Инвойсы» и снимите остальные отметки, если процессу они не нужны. Для обычной сверки состояния счёта не требуется управление адресами, вебхуками или симуляцией.

Если другой сервер должен создавать инвойсы, ему потребуется «Чтение и запись» и соответствующий раздел. Выделите ему отдельный ключ с понятным назначением, не расширяя права процесса сверки без необходимости. Доступ на запись действует внутри выбранных разделов, а не открывает весь API.

4. Настройте IP и срок действия

В «Разрешённые IP-адреса» укажите исходящие публичные IP вашего сервера либо необходимые диапазоны CIDR, по одному в строке. Нужен адрес, с которого запрос приходит к API, а не IP покупателя. При использовании хостинга или прокси уточните фактический выходной адрес.

Пустое поле разрешает любой IP. Если сервер использует несколько выходных адресов, учитывайте их при настройке; иначе правильный ключ может не пройти проверку. IP-ограничение дополняет выбор проекта и разделов, а не заменяет их.

При необходимости задайте «Срок действия». Выбранная дата действует до конца дня по UTC. Согласуйте её со сроком работы интеграции: истёкший ключ не является признаком того, что клиент не заплатил.

5. Создайте ключ и сохраните секрет

Нажмите «Создать ключ» и выполните подтверждение защиты, если кабинет его запросит. Скопируйте секрет из показанного окна и сохраните на сервере процесса сверки. Не помещайте его в клиентский JavaScript, платёжную ссылку, переписку с покупателем или публичный журнал.

После закрытия окна не рассчитывайте восстановить секрет из списка: там показано сокращённое обозначение ключа. Проверьте «Область доступа», проект, доступные разделы, срок и статус. Если нужен доступ разработчику, передавайте его через подходящее защищённое хранилище, а не публикуйте ключ вместе с инструкцией.

6. Проверьте разрешённый и запрещённый доступ

С сервера с разрешённым IP прочитайте известный инвойс этого проекта. Ниже — пример чтения из каталога API; используйте собственный ID инвойса и созданный ключ:

#!/usr/bin/env bash
set -euo pipefail
: "${CRYPTANIO_RESOURCE_ID:?Set CRYPTANIO_RESOURCE_ID}"
: "${CRYPTANIO_API_KEY:?Set CRYPTANIO_API_KEY}"
urlencode() {
  local LC_ALL=C text="$1" char index
  for ((index=0; index<${#text}; index++)); do
    char="${text:index:1}"
    case "$char" in [a-zA-Z0-9.~_-]) printf '%s' "$char" ;; *) printf '%%%02X' "'$char" ;; esac
  done
}
response_file="$(mktemp)"
trap 'rm -f "$response_file"' EXIT
transfer_status=0
http_status="$(curl \
  --silent --show-error --max-time 30 --request GET \
  --header "Authorization: Bearer $CRYPTANIO_API_KEY" \
  --header 'Accept: application/json' \
  "https://api.cryptanio.com/v1/invoices/$(urlencode "$CRYPTANIO_RESOURCE_ID")" \
  --output "$response_file" --write-out '%{http_code}')" || transfer_status=$?
if [[ "$http_status" == 2?? ]]; then
  cat "$response_file"
  exit "$transfer_status"
fi
printf 'HTTP %s\n' "$http_status" >&2
cat "$response_file" >&2
exit 1

Скачать пример

Затем проверьте границу на известном инвойсе другого вашего проекта: его данные не должны возвращаться. Списки также должны оставаться в выбранном проекте. Для этого ключа создание и изменение инвойсов запрещены, даже если раздел «Инвойсы» включён. Организация дальнейшей сверки описана в руководстве по проверке оплаты через API.

Если запрос не проходит, проверьте проект, режим, IP, срок и разрешения. Не делайте вывод о неоплате по одной ошибке доступа и не подставляйте вместо ограниченного ключа общий ключ аккаунта. Платёж оценивается по состоянию инвойса.

Как уточнить доступ позже

У существующего ключа нажмите «Доступ», измените проект, разделы, IP или срок и выберите «Сохранить доступ». Режим выбирается при создании ключа. «Заменить ключ» меняет секрет и сразу отключает прежний; «Отозвать» прекращает его использование. Перед заменой подготовьте обновление серверных клиентов, чтобы сверка заказов не остановилась.