tigusigalpa/sber-id-php

Laravel package for Sber ID (SberBank OAuth) integration

Installs: 0

Dependents: 0

Suggesters: 0

Security: 0

Stars: 0

Watchers: 0

Forks: 0

Open Issues: 0

pkg:composer/tigusigalpa/sber-id-php

v1.0.0 2025-12-22 16:15 UTC

This package is auto-updated.

Last update: 2025-12-22 16:21:39 UTC


README

SberID PHP

Latest Version on Packagist

Laravel пакет для интеграции с Sber ID (OAuth авторизация через Сбер). Поддержка тестового и промышленного окружения.

🌐 Язык: Русский | English

Содержание

Возможности

  • ✅ Полная реализация OAuth 2.0 / OpenID Connect
  • ✅ Поддержка тестового и промышленного окружения
  • ✅ Управление access token и refresh token
  • ✅ Получение данных профиля пользователя с расширенными скоупами
  • ✅ Отправка аналитических событий
  • ✅ Поддержка SSL сертификатов
  • ✅ Совместимость с Laravel 8-12
  • ✅ Простая настройка и кастомизация

Требования

  • PHP 7.4 или выше
  • Laravel 8.x, 9.x, 10.x, 11.x или 12.x
  • GuzzleHTTP 7.x

Установка

Шаг 1: Установка пакета

Установите пакет через Composer:

composer require tigusigalpa/sber-id-php

Шаг 2: Публикация конфигурации

Опубликуйте конфигурационный файл:

php artisan vendor:publish --tag=sberid-config

Это создаст файл config/sberid.php в вашем Laravel приложении.

Шаг 3: Регистрация приложения

Зарегистрируйте приложение на портале Sber ID для получения:

  • Client ID
  • Client Secret
  • SSL сертификата (для production)

Шаг 4: Настройка окружения

Добавьте следующие переменные в файл .env:

# Окружение: sandbox или production
SBERID_ENVIRONMENT=sandbox

# Учетные данные клиента
SBERID_CLIENT_ID=ваш-client-id
SBERID_CLIENT_SECRET=ваш-client-secret

# Redirect URI (должен совпадать с зарегистрированным в портале Sber ID)
SBERID_REDIRECT_URI=https://ваш-домен.ru/auth/sberid/callback

# Скоупы (список запрашиваемых данных через пробел)
SBERID_SCOPES="openid name email phone"

# Запрос refresh token (срок действия 30 дней)
SBERID_REQUEST_REFRESH_TOKEN=true

# SSL сертификат (опционально, требуется для production)
SBERID_CERTIFICATE_PATH=/путь/к/сертификату.pem
SBERID_CERTIFICATE_PASSWORD=пароль-сертификата

# Проверка SSL (установите false только для локальной разработки)
SBERID_VERIFY_SSL=true

# Аналитика (обязательно в production)
SBERID_SEND_ANALYTICS=true

# Таймаут запроса в секундах
SBERID_TIMEOUT=10

Шаг 5: Миграция базы данных (опционально)

Если вы хотите хранить данные Sber ID в таблице пользователей:

php artisan make:migration add_sberid_to_users_table

Добавьте в миграцию:

public function up()
{
    Schema::table('users', function (Blueprint $table) {
        $table->string('sberid_sub')->nullable()->unique()->after('id');
        $table->text('sberid_access_token')->nullable();
        $table->text('sberid_refresh_token')->nullable();
        $table->timestamp('sberid_token_expires_at')->nullable();
        $table->timestamp('last_login_at')->nullable();
    });
}

Выполните миграцию:

php artisan migrate

Настройка

Параметры окружения

Переменная Тип По умолчанию Описание
SBERID_ENVIRONMENT string sandbox Окружение: 'sandbox' или 'production'
SBERID_CLIENT_ID string - Ваш Sber ID client ID
SBERID_CLIENT_SECRET string - Ваш Sber ID client secret
SBERID_REDIRECT_URI string - Callback URL (должен совпадать с порталом)
SBERID_SCOPES string openid name email phone Скоупы через пробел
SBERID_REQUEST_REFRESH_TOKEN bool true Запрос refresh token
SBERID_CERTIFICATE_PATH string - Путь к SSL сертификату
SBERID_CERTIFICATE_PASSWORD string - Пароль сертификата
SBERID_VERIFY_SSL bool true Проверка SSL сертификатов
SBERID_SEND_ANALYTICS bool true Отправка аналитических событий
SBERID_TIMEOUT int 10 Таймаут запроса (секунды)

Окружения

Sandbox (Тестовое)

  • Базовый URL: https://oauth-ift.sber.ru
  • Используйте для разработки и тестирования
  • Установите SBERID_ENVIRONMENT=sandbox

Production (Промышленное)

  • Базовый URL: https://oauth.sber.ru
  • Требуется SSL сертификат
  • Аналитические события обязательны
  • Установите SBERID_ENVIRONMENT=production

Использование

Базовое использование со встроенными маршрутами

Пакет предоставляет готовые маршруты:

<!-- Перенаправление на авторизацию Sber ID -->
<a href="{{ route('sberid.redirect') }}">Войти через Сбер ID</a>

<!-- Callback маршрут обрабатывается автоматически: /auth/sberid/callback -->

Пользовательская реализация

1. Перенаправление на Sber ID

use Tigusigalpa\SberID\Facades\SberID;

public function redirectToSberID()
{
    $state = \Illuminate\Support\Str::random(40);
    $nonce = \Illuminate\Support\Str::random(40);
    
    session(['sberid_state' => $state, 'sberid_nonce' => $nonce]);
    
    $authUrl = SberID::getAuthorizationUrl($state, $nonce);
    
    return redirect($authUrl);
}

2. Обработка Callback

use Tigusigalpa\SberID\Facades\SberID;
use Tigusigalpa\SberID\Exceptions\SberIDException;

public function handleCallback(Request $request)
{
    $code = $request->input('code');
    $state = $request->input('state');
    
    // Проверка state
    if ($state !== session('sberid_state')) {
        abort(403, 'Неверный параметр state');
    }
    
    try {
        // Обмен кода на токены
        $tokenData = SberID::getAccessToken($code);
        
        $accessToken = $tokenData['access_token'];
        $refreshToken = $tokenData['refresh_token'] ?? null;
        
        // Получение информации о пользователе
        $userInfo = SberID::getUserInfo($accessToken);
        
        // Отправка аналитики (только production)
        SberID::confirmAuthenticationSuccess($accessToken);
        
        // Создание или обновление пользователя в БД
        $user = User::updateOrCreate(
            ['sberid_sub' => $userInfo['sub']],
            [
                'email' => $userInfo['email'] ?? null,
                'phone' => $userInfo['phone_number'] ?? null,
                'name' => $userInfo['given_name'] ?? null,
                'family_name' => $userInfo['family_name'] ?? null,
            ]
        );
        
        // Авторизация пользователя
        auth()->login($user);
        
        return redirect()->route('home');
        
    } catch (SberIDException $e) {
        return redirect()->route('login')
            ->with('error', 'Ошибка авторизации: ' . $e->getMessage());
    }
}

3. Обновление Access Token

use Tigusigalpa\SberID\Facades\SberID;

public function refreshToken($refreshToken)
{
    try {
        $tokenData = SberID::refreshAccessToken($refreshToken);
        
        $newAccessToken = $tokenData['access_token'];
        $newRefreshToken = $tokenData['refresh_token'] ?? null;
        
        // Обновление сохраненных токенов
        
        return $newAccessToken;
        
    } catch (SberIDException $e) {
        // Обработка ошибки
    }
}

Использование на чистом PHP (без Laravel)

Пакет можно использовать в любом PHP приложении без Laravel:

1. Инициализация клиента

<?php
require_once 'vendor/autoload.php';

use Tigusigalpa\SberID\SberIDClient;
use Tigusigalpa\SberID\Exceptions\SberIDException;

// Запуск сессии для управления state
session_start();

// Инициализация клиента
$client = new SberIDClient([
    'environment' => 'sandbox', // или 'production'
    'client_id' => 'ваш-client-id',
    'client_secret' => 'ваш-client-secret',
    'redirect_uri' => 'https://ваш-домен.ru/callback.php',
    'scopes' => 'openid name email phone',
    'request_refresh_token' => true,
    'certificate_path' => null, // Путь к сертификату для production
    'certificate_password' => null,
    'verify_ssl' => true,
    'send_analytics' => true,
    'timeout' => 10,
]);

2. Перенаправление на Sber ID (login.php)

<?php
require_once 'vendor/autoload.php';
require_once 'client.php'; // Файл с инициализацией клиента

// Генерация state и nonce для безопасности
$state = bin2hex(random_bytes(20));
$nonce = bin2hex(random_bytes(20));

// Сохранение в сессии
$_SESSION['sberid_state'] = $state;
$_SESSION['sberid_nonce'] = $nonce;

// Получение URL авторизации
$authUrl = $client->getAuthorizationUrl($state, $nonce);

// Перенаправление пользователя
header('Location: ' . $authUrl);
exit;

3. Обработка Callback (callback.php)

<?php
require_once 'vendor/autoload.php';
require_once 'client.php'; // Файл с инициализацией клиента

// Получение параметров из callback
$code = $_GET['code'] ?? null;
$state = $_GET['state'] ?? null;
$error = $_GET['error'] ?? null;

// Обработка ошибки
if ($error) {
    $errorDescription = $_GET['error_description'] ?? 'Неизвестная ошибка';
    die("Ошибка авторизации: {$error} - {$errorDescription}");
}

// Проверка параметра state
if (!$state || $state !== $_SESSION['sberid_state']) {
    die('Неверный параметр state. Возможна CSRF атака.');
}

// Очистка state из сессии
unset($_SESSION['sberid_state'], $_SESSION['sberid_nonce']);

if (!$code) {
    die('Код авторизации не получен');
}

try {
    // Обмен кода на токены
    $tokenData = $client->getAccessToken($code);
    
    $accessToken = $tokenData['access_token'];
    $refreshToken = $tokenData['refresh_token'] ?? null;
    $idToken = $tokenData['id_token'] ?? null;
    
    // Получение информации о пользователе
    $userInfo = $client->getUserInfo($accessToken);
    
    // Декодирование ID токена (опционально)
    if ($idToken) {
        $idTokenData = $client->decodeIdToken($idToken);
    }
    
    // Отправка аналитики (только production)
    $client->confirmAuthenticationSuccess($accessToken);
    
    // Сохранение данных пользователя в сессии или БД
    $_SESSION['user'] = [
        'id' => $userInfo['sub'],
        'email' => $userInfo['email'] ?? null,
        'phone' => $userInfo['phone_number'] ?? null,
        'name' => $userInfo['given_name'] ?? null,
        'family_name' => $userInfo['family_name'] ?? null,
        'middle_name' => $userInfo['middle_name'] ?? null,
    ];
    
    // Сохранение токенов безопасно (шифруйте в production!)
    $_SESSION['access_token'] = $accessToken;
    $_SESSION['refresh_token'] = $refreshToken;
    $_SESSION['token_expires_at'] = time() + $tokenData['expires_in'];
    
    // Перенаправление на защищенную страницу
    header('Location: /dashboard.php');
    exit;
    
} catch (SberIDException $e) {
    die('Ошибка авторизации: ' . $e->getMessage() . 
        ' (Код: ' . $e->getErrorCode() . ')');
}

4. Обновление токена (refresh.php)

<?php
require_once 'vendor/autoload.php';
require_once 'client.php';

$refreshToken = $_SESSION['refresh_token'] ?? null;

if (!$refreshToken) {
    die('Refresh token недоступен');
}

try {
    $tokenData = $client->refreshAccessToken($refreshToken);
    
    // Обновление токенов в сессии
    $_SESSION['access_token'] = $tokenData['access_token'];
    $_SESSION['refresh_token'] = $tokenData['refresh_token'] ?? $refreshToken;
    $_SESSION['token_expires_at'] = time() + $tokenData['expires_in'];
    
    echo "Токен успешно обновлен!";
    
} catch (SberIDException $e) {
    // Refresh token истек или недействителен - нужна повторная авторизация
    unset($_SESSION['access_token'], $_SESSION['refresh_token']);
    header('Location: /login.php');
    exit;
}

5. Пример защищенной страницы (dashboard.php)

<?php
session_start();

// Проверка авторизации пользователя
if (!isset($_SESSION['user'])) {
    header('Location: /login.php');
    exit;
}

// Проверка необходимости обновления токена
if (isset($_SESSION['token_expires_at']) && time() >= $_SESSION['token_expires_at']) {
    // Токен истек, попытка обновления
    header('Location: /refresh.php');
    exit;
}

$user = $_SESSION['user'];
?>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Личный кабинет</title>
</head>
<body>
    <h1>Добро пожаловать, <?= htmlspecialchars($user['name'] ?? 'Пользователь') ?>!</h1>
    <p>Email: <?= htmlspecialchars($user['email'] ?? 'Не указан') ?></p>
    <p>Телефон: <?= htmlspecialchars($user['phone'] ?? 'Не указан') ?></p>
    <a href="/logout.php">Выйти</a>
</body>
</html>

6. Полный пример с базой данных

<?php
// callback.php с сохранением в БД через PDO
require_once 'vendor/autoload.php';
require_once 'client.php';

// Подключение к БД
$pdo = new PDO('mysql:host=localhost;dbname=myapp', 'username', 'password');

// ... код проверки state ...

try {
    $tokenData = $client->getAccessToken($code);
    $userInfo = $client->getUserInfo($tokenData['access_token']);
    
    // Проверка существования пользователя
    $stmt = $pdo->prepare('SELECT * FROM users WHERE sberid_sub = ?');
    $stmt->execute([$userInfo['sub']]);
    $user = $stmt->fetch(PDO::FETCH_ASSOC);
    
    if ($user) {
        // Обновление существующего пользователя
        $stmt = $pdo->prepare('
            UPDATE users 
            SET email = ?, 
                phone = ?, 
                sberid_access_token = ?, 
                sberid_refresh_token = ?,
                sberid_token_expires_at = ?,
                last_login_at = NOW()
            WHERE sberid_sub = ?
        ');
        $stmt->execute([
            $userInfo['email'] ?? null,
            $userInfo['phone_number'] ?? null,
            $tokenData['access_token'],
            $tokenData['refresh_token'] ?? null,
            date('Y-m-d H:i:s', time() + $tokenData['expires_in']),
            $userInfo['sub']
        ]);
    } else {
        // Создание нового пользователя
        $stmt = $pdo->prepare('
            INSERT INTO users (
                sberid_sub, email, phone, name, family_name, middle_name,
                sberid_access_token, sberid_refresh_token, 
                sberid_token_expires_at, created_at
            ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, NOW())
        ');
        $stmt->execute([
            $userInfo['sub'],
            $userInfo['email'] ?? null,
            $userInfo['phone_number'] ?? null,
            $userInfo['given_name'] ?? null,
            $userInfo['family_name'] ?? null,
            $userInfo['middle_name'] ?? null,
            $tokenData['access_token'],
            $tokenData['refresh_token'] ?? null,
            date('Y-m-d H:i:s', time() + $tokenData['expires_in'])
        ]);
    }
    
    // Установка сессии
    $_SESSION['user_id'] = $userInfo['sub'];
    
    header('Location: /dashboard.php');
    exit;
    
} catch (SberIDException $e) {
    die('Ошибка: ' . $e->getMessage());
}

Кастомизация контроллера (Laravel)

Расширьте стандартный контроллер:

namespace App\Http\Controllers;

use Tigusigalpa\SberID\Http\Controllers\SberIDController as BaseSberIDController;

class CustomSberIDController extends BaseSberIDController
{
    protected function handleSuccess(array $userInfo, string $accessToken, ?string $refreshToken)
    {
        // Ваша логика успешной авторизации
        $user = User::firstOrCreate(
            ['sberid_sub' => $userInfo['sub']],
            ['email' => $userInfo['email'] ?? null]
        );
        
        auth()->login($user);
        
        return redirect()->route('dashboard');
    }
    
    protected function handleError(string $error, string $description)
    {
        // Ваша обработка ошибок
        \Log::error("Ошибка Sber ID: {$error} - {$description}");
        
        return redirect()->route('login')
            ->with('error', 'Не удалось войти через Сбер ID');
    }
}

API Справочник

Методы SberIDClient

getAuthorizationUrl(string $state = null, string $nonce = null): string

Генерирует URL авторизации для перенаправления пользователей на Sber ID.

getAccessToken(string $code): array

Обменивает код авторизации на access token, refresh token и ID token.

Возвращает:

[
    'access_token' => 'string',      // Access token (60 секунд)
    'token_type' => 'bearer',
    'expires_in' => 60,
    'scope' => 'openid name email',
    'id_token' => 'string',
    'refresh_token' => 'string'      // Refresh token (30 дней)
]

refreshAccessToken(string $refreshToken): array

Обновляет истекший access token используя refresh token.

getUserInfo(string $accessToken): array

Получает информацию профиля пользователя используя access token.

confirmAuthenticationSuccess(string $accessToken): bool

Отправляет аналитическое событие в Sber ID (обязательно в production).

decodeIdToken(string $idToken): array

Декодирует и возвращает содержимое ID token.

SberIDException

Класс исключений для ошибок Sber ID API.

Методы:

  • getErrorCode(): string - Возвращает код ошибки
  • getErrorDescription(): string - Возвращает описание ошибки

Распространенные коды ошибок:

  • invalid_request - Неверные параметры запроса
  • invalid_client - Неверные учетные данные клиента
  • invalid_grant - Неверный код авторизации или refresh token
  • unauthorized_client - Клиент не авторизован
  • unsupported_grant_type - Тип grant не поддерживается
  • invalid_scope - Неверный или неавторизованный scope
  • access_denied - Пользователь отклонил авторизацию

Доступные скоупы

Базовые скоупы (Light пакет)

Скоуп Описание Поля
openid Идентификатор пользователя (обязательно) sub
name ФИО family_name, given_name, middle_name
email Email адрес email
phone Номер телефона phone_number
birthdate Дата рождения birthdate
gender Пол gender

Расширенные скоупы (Standard пакет)

Скоуп Описание Поля
identification Паспортные данные identification.*
inn ИНН inn.number
snils СНИЛС snils.number
driving_license Водительское удостоверение driving_license.number
address_reg Адрес регистрации address_reg.*
address_of_actual_residence Адрес проживания Как address_reg
work_address Рабочий адрес Как address_reg
delivery_address Адрес доставки Как address_reg

Professional скоупы

Скоуп Описание
priority_doc Приоритетный документ
citizenship Гражданство
place_of_birth Место рождения
sts СТС
previous_identification Предыдущий паспорт
previous_name Предыдущее ФИО
education Образование
place_of_work Место работы
job_title Должность
marital_status Семейное положение

Примеры использования скоупов

Только авторизация:

'scopes' => 'openid email'

Базовый профиль:

'scopes' => 'openid name email phone'

KYC (Знай своего клиента):

'scopes' => 'openid name birthdate identification inn snils address_reg'

Служба доставки:

'scopes' => 'openid name phone delivery_address'

Полный список: Документация Sber ID Scopes

Решение проблем

Проблемы установки

Не удается установить через Composer

  • Проверьте версию PHP: php -v (требуется 7.4+)
  • Обновите Composer: composer self-update
  • Очистите кэш: composer clear-cache

Service Provider не найден

  • Выполните composer dump-autoload
  • Очистите конфиг: php artisan config:clear
  • Очистите кэш: php artisan cache:clear

Проблемы конфигурации

Неверный Redirect URI

  • Проверьте, что SBERID_REDIRECT_URI точно совпадает с зарегистрированным в портале
  • Проверьте наличие завершающих слэшей
  • Убедитесь в использовании HTTPS в production

Неверные учетные данные

  • Проверьте SBERID_CLIENT_ID и SBERID_CLIENT_SECRET
  • Проверьте на наличие лишних пробелов
  • Убедитесь, что учетные данные для правильного окружения

Проблемы с SSL сертификатом

  • Для разработки: SBERID_VERIFY_SSL=false
  • Для production: проверьте путь и пароль сертификата
  • Проверьте права доступа: chmod 600 certificate.pem

Проблемы авторизации

Несовпадение параметра state

  • Очистите cookies браузера и сессию
  • Проверьте конфигурацию драйвера сессий
  • Убедитесь, что middleware сессии активен

Код авторизации истек

  • Не обновляйте страницу callback
  • Реализуйте правильную обработку ошибок
  • Направьте пользователя на повторную авторизацию

Неверный refresh token

  • Проверьте, не истек ли токен (30 дней)
  • Убедитесь, что запрашивался scope offline_access
  • Не используйте один refresh token дважды

Отладка

Включите детальное логирование:

use Illuminate\Support\Facades\Log;

try {
    $tokenData = SberID::getAccessToken($code);
    Log::info('Токен получен', ['expires_in' => $tokenData['expires_in']]);
} catch (SberIDException $e) {
    Log::error('Ошибка Sber ID', [
        'error_code' => $e->getErrorCode(),
        'error_description' => $e->getErrorDescription(),
    ]);
}

Тестирование

Запуск тестов:

composer test

Мок клиента для тестирования:

use Tigusigalpa\SberID\SberIDClient;
use Mockery;

$mockClient = Mockery::mock(SberIDClient::class);
$mockClient->shouldReceive('getAccessToken')
    ->andReturn([
        'access_token' => 'test-token',
        'token_type' => 'bearer',
        'expires_in' => 60,
    ]);

$this->app->instance(SberIDClient::class, $mockClient);

Безопасность

Лучшие практики безопасности

1. Настройка окружения

Всегда используйте HTTPS в production:

APP_URL=https://ваш-домен.ru
SBERID_REDIRECT_URI=https://ваш-домен.ru/auth/sberid/callback

Включите проверку SSL:

SBERID_VERIFY_SSL=true

Используйте production окружение для боевых сайтов:

SBERID_ENVIRONMENT=production

2. Управление учетными данными

Никогда не коммитьте учетные данные в систему контроля версий:

  • Добавьте .env в .gitignore
  • Используйте переменные окружения для всех чувствительных данных
  • Регулярно меняйте учетные данные

Защитите файл .env:

chmod 600 .env

3. Хранение токенов

Шифруйте токены в базе данных:

'sberid_access_token' => encrypt($accessToken),
'sberid_refresh_token' => encrypt($refreshToken),

Никогда не раскрывайте токены в URL или логах:

// Плохо
Log::info('Token: ' . $accessToken);

// Хорошо
Log::info('Токен получен', ['token_length' => strlen($accessToken)]);

4. Валидация параметра State

Всегда проверяйте параметр state:

if ($state !== session('sberid_state')) {
    abort(403, 'Неверный параметр state');
}

Используйте криптографически безопасные случайные строки:

$state = \Illuminate\Support\Str::random(40);

5. Безопасность сессий

Настройте безопасные параметры сессий:

// config/session.php
'secure' => env('SESSION_SECURE_COOKIE', true),
'http_only' => true,
'same_site' => 'lax',

6. Безопасность сертификатов

Защитите SSL сертификаты:

chmod 600 /path/to/certificate.pem

Храните сертификаты вне веб-корня:

/storage/certificates/sberid.pem  ✓ Хорошо
/public/certificates/sberid.pem   ✗ Плохо

7. Валидация входных данных

Проверяйте все параметры callback:

$code = $request->input('code');
if (!$code || !is_string($code)) {
    abort(400, 'Неверный код авторизации');
}

8. Ограничение частоты запросов

Реализуйте rate limiting на маршрутах авторизации:

Route::middleware(['throttle:10,1'])->group(function () {
    Route::get('/auth/sberid/redirect', [SberIDController::class, 'redirect']);
    Route::get('/auth/sberid/callback', [SberIDController::class, 'callback']);
});

9. Обработка ошибок

Не раскрывайте чувствительную информацию в ошибках:

// Плохо
return response()->json(['error' => $e->getMessage()]);

// Хорошо
Log::error('Ошибка авторизации', ['exception' => $e]);
return response()->json(['error' => 'Ошибка авторизации']);

10. Безопасность базы данных

Используйте параметризованные запросы (Laravel делает это по умолчанию):

// Хорошо - Laravel ORM
User::where('sberid_sub', $sub)->first();

// Избегайте сырых запросов с пользовательским вводом

Соображения безопасности

Время жизни токенов

  • Access токены истекают через 60 секунд
  • Refresh токены истекают через 30 дней
  • Реализуйте логику обновления токенов
  • Удаляйте истекшие токены из базы данных

Разрешения скоупов

  • Запрашивайте только необходимые скоупы
  • Пользователи могут отклонить определенные скоупы
  • Корректно обрабатывайте отсутствующие данные скоупов

Управление сертификатами

  • Сертификаты периодически истекают
  • Отслеживайте срок действия сертификата
  • Имейте процесс обновления сертификатов

Отслеживание аналитики

  • Аналитика обязательна в production
  • Неотправка аналитики может повлиять на сервис
  • Реализуйте логику повторных попыток для аналитики

Соответствие требованиям

Защита данных: Этот пакет обрабатывает персональные данные. Обеспечьте соответствие:

  • GDPR (если применимо)
  • Федеральный закон РФ № 152-ФЗ
  • Другие применимые нормы защиты данных

Согласие пользователя:

  • Получайте согласие пользователя перед сбором данных
  • Предоставьте политику конфиденциальности
  • Позвольте пользователям отозвать согласие
  • Реализуйте процедуры удаления данных

Сообщение об уязвимостях безопасности

Пожалуйста, не сообщайте об уязвимостях безопасности через публичные GitHub issues.

Если вы обнаружили уязвимость безопасности, отправьте email на: sovletig@gmail.com

Включите:

  • Тип уязвимости
  • Полные пути к файлам исходного кода, связанным с уязвимостью
  • Пошаговые инструкции для воспроизведения проблемы
  • Proof-of-concept или эксплойт код (если возможно)
  • Влияние уязвимости

Сроки ответа:

  • Подтверждение получения в течение 48 часов
  • Оценка серьезности
  • Координация исправления и раскрытия
  • Упоминание в advisory по безопасности (если желаете)

Поддержка

Проблемы с пакетом

Проблемы с Sber ID API

Ссылки на документацию

Лицензия

Лицензия MIT. Подробности в файле LICENSE.

Автор

Отказ от ответственности

Этот пакет не является официальным продуктом Сбербанка. Используйте на свой риск.