External Partner API¶
LMS-платформы могут получать данные пользователей Flawbusters (профиль, статистику, Security Matrix, достижения) через External Partner API. Пользователь явно даёт согласие на передачу данных через OAuth consent screen.
Полный справочник: API Reference.
Модель доверия¶
- OAuth 2.0 Authorization Code + PKCE — для линковки конкретного пользователя.
- HMAC-SHA256 — для всех server-to-server запросов после линковки.
Регистрация партнёра¶
Администратор Flawbusters создаёт партнёра через Admin API и передаёт вам один раз:
client_id— публичный идентификатор.client_secret— для OAuth token exchange.hmac_secret— для HMAC-подписи запросов.
Секреты показываются один раз
client_secret и hmac_secret не могут быть восстановлены. Храните их в secure vault (AWS Secrets Manager, Vault, GCP Secret Manager).
Линковка пользователя (OAuth 2.0 + PKCE)¶
Шаг 1. PKCE challenge¶
```python import base64, hashlib, secrets
verifier = secrets.token_urlsafe(64) # 43–128 символов challenge = base64.urlsafe_b64encode( hashlib.sha256(verifier.encode()).digest() ).rstrip(b"=").decode() ```
Шаг 2. Authorize¶
Перенаправьте пользователя:
GET https://flawbusters.com/api/v1/oauth/authorize ?client_id={client_id} &redirect_uri={redirect_uri} &response_type=code &scope=profile:read &state={random_state} &code_challenge={challenge} &code_challenge_method=S256
Шаг 3. Consent¶
Пользователь увидит consent screen с запрашиваемыми scope и подтвердит доступ.
Шаг 4. Callback¶
Flawbusters перенаправит обратно:
{redirect_uri}?code={code}&state={state}
Проверьте state — он должен совпадать с отправленным.
Шаг 5. Обмен кода на токены¶
```http POST /api/v1/oauth/token Content-Type: application/x-www-form-urlencoded Authorization: Basic base64(client_id:client_secret)
grant_type=authorization_code &code={code} &redirect_uri={redirect_uri} &code_verifier={verifier} ```
Ответ содержит external_user_id — opaque-идентификатор пользователя в вашей системе. Сохраните его.
Server-to-server запросы (HMAC)¶
Для всех запросов к External API используйте HMAC-SHA256.
Заголовки¶
| Заголовок | Значение |
|---|---|
X-Partner-Key | client_id |
X-Timestamp | Unix timestamp (сек), отклонение от серверного — не более 5 минут |
X-Nonce | Случайный UUID для защиты от replay |
X-Signature | HMAC-SHA256 от method\npath\ntimestamp\nnonce\nbody_sha256, hex |
Пример подписи (Python)¶
```python import hashlib, hmac, time, uuid
method = "GET" path = "/api/v1/partner/users/{external_user_id}/profile" timestamp = str(int(time.time())) nonce = str(uuid.uuid4()) body = b"" body_sha = hashlib.sha256(body).hexdigest()
message = f"{method}\n{path}\n{timestamp}\n{nonce}\n{body_sha}" signature = hmac.new( hmac_secret.encode(), message.encode(), hashlib.sha256 ).hexdigest() ```
Доступные endpoints¶
| Endpoint | Описание |
|---|---|
GET /partner/users/{id}/profile | Публичный профиль пользователя |
GET /partner/users/{id}/stats | Статистика: решения, активность, время |
GET /partner/users/{id}/security-matrix | Security Matrix по всем категориям |
GET /partner/users/{id}/achievements | Список полученных ачивок |
Полная спецификация, схемы ответов, коды ошибок — в API Reference.
Best practices¶
- Храните
external_user_idкак основной ключ связки — он стабилен. - Не полагайтесь на email: пользователь может его сменить.
- Проверяйте
expиiatJWT-ответов, если используете их для сессий. - Соблюдайте
X-Timestampв пределах 5 минут и не переиспользуйтеX-Nonce. - Обрабатывайте
429 Too Many Requestsс экспоненциальным backoff.
Отзыв согласия¶
Пользователь может отозвать согласие в настройках Flawbusters. После этого все партнёрские запросы по его external_user_id вернут 403 Forbidden. Обрабатывайте это как мягкую деактивацию связки, не блокирующую работу LMS.