tigusigalpa/alfa-id-php

Laravel package for Alfa ID OAuth authentication integration

Installs: 0

Dependents: 0

Suggesters: 0

Security: 0

Stars: 1

Watchers: 0

Forks: 0

Open Issues: 0

pkg:composer/tigusigalpa/alfa-id-php

v1.0.0 2025-12-21 10:34 UTC

This package is auto-updated.

Last update: 2025-12-21 10:42:11 UTC


README

AlfaID PHP

Laravel пакет для интеграции OAuth авторизации Alfa ID (сервис авторизации Альфа-Банка). Полная реализация OAuth 2.0 Authorization Code Flow с поддержкой песочницы и промышленного окружения.

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

Содержание

Возможности

OAuth 2.0 Authorization Code Flow - Полная реализация
Поддержка двух окружений - Песочница и промышленный режим
Интеграция с Laravel - Service provider, facade, middleware
Встроенные роуты - Готовые OAuth endpoints
Управление токенами - Получение, обновление и отзыв токенов
Профиль пользователя - Получение информации об аутентифицированном пользователе
CSRF защита - Валидация state параметра
Вспомогательные функции - Удобные утилиты
Модульные тесты - Включен набор тестов PHPUnit
Мультиверсионность - Laravel 8-12, PHP 7.4-8.3

Требования

  • PHP: 7.4, 8.0, 8.1, 8.2 или 8.3
  • Laravel: 8.x, 9.x, 10.x, 11.x или 12.x
  • GuzzleHTTP: 7.x

Быстрый старт

Запустите за 5 минут!

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

composer require tigusigalpa/alfa-id-php

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

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

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

Добавьте в ваш .env файл:

ALFAID_ENVIRONMENT=sandbox
ALFAID_SANDBOX_CLIENT_ID=ваш_client_id
ALFAID_SANDBOX_CLIENT_SECRET=ваш_client_secret
ALFAID_SANDBOX_REDIRECT_URI=http://localhost:8000/alfaid/callback

Получите учетные данные на: https://developers.alfabank.ru/

Шаг 4: Добавление роутов

Добавьте в routes/web.php:

// Обработчик успеха
Route::get('/dashboard', function () {
    $user = session('alfaid_user');
    return view('dashboard', compact('user'));
})->middleware('alfaid')->name('alfaid.success');

// Обработчик ошибок
Route::get('/auth/error', function () {
    return view('errors.auth')->with('error', session('error'));
})->name('alfaid.error');

// Успешный выход
Route::get('/', function () {
    return view('welcome');
})->name('alfaid.logout.success');

Шаг 5: Регистрация Middleware

Добавьте в app/Http/Kernel.php:

protected $routeMiddleware = [
    // ... существующие middleware
    'alfaid' => \Tigusigalpa\AlfaID\Middleware\AlfaIDAuthenticated::class,
];

Шаг 6: Добавление кнопки входа

В вашем blade шаблоне:

<a href="{{ route('alfaid.login') }}" class="btn btn-primary">
    Войти через Альфа-Банк
</a>

Шаг 7: Тестирование!

php artisan serve

Посетите http://localhost:8000 и нажмите "Войти через Альфа-Банк" 🎉

Установка

Вариант A: Через Composer (после публикации)

composer require tigusigalpa/alfa-id-php

Вариант B: Локальная разработка

Добавьте в ваш composer.json:

{
    "repositories": [
        {
            "type": "path",
            "url": "./packages/alfa-id-php"
        }
    ],
    "require": {
        "tigusigalpa/alfa-id-php": "*"
    }
}

Затем выполните:

composer update tigusigalpa/alfa-id-php

Публикация файла конфигурации

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

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

Настройка переменных окружения

Добавьте в ваш .env файл:

# Выберите окружение: sandbox или production
ALFAID_ENVIRONMENT=sandbox

# Конфигурация песочницы
ALFAID_SANDBOX_CLIENT_ID=ваш_sandbox_client_id
ALFAID_SANDBOX_CLIENT_SECRET=ваш_sandbox_client_secret
ALFAID_SANDBOX_REDIRECT_URI=http://localhost:8000/alfaid/callback

# Конфигурация промышленного окружения
ALFAID_PRODUCTION_CLIENT_ID=ваш_production_client_id
ALFAID_PRODUCTION_CLIENT_SECRET=ваш_production_client_secret
ALFAID_PRODUCTION_REDIRECT_URI=https://yourdomain.com/alfaid/callback

# Опциональные настройки
ALFAID_SCOPES="openid profile email"
ALFAID_VERIFY_SSL=true

Настройка роутов

Пакет автоматически регистрирует эти роуты:

  • GET /alfaid/login
  • GET /alfaid/callback
  • POST /alfaid/logout
  • POST /alfaid/refresh
  • GET /alfaid/user

Вам нужно создать роуты для успеха/ошибки в вашем routes/web.php:

Route::get('/alfaid/success', function () {
    return redirect('/dashboard');
})->name('alfaid.success');

Route::get('/alfaid/error', function () {
    return view('auth.error');
})->name('alfaid.error');

Route::get('/alfaid/logout/success', function () {
    return redirect('/');
})->name('alfaid.logout.success');

Получение учетных данных Alfa ID

Окружение песочницы

  1. Посетите Портал разработчиков Альфа-Банка
  2. Зарегистрируйтесь или войдите в свой аккаунт
  3. Создайте новое приложение
  4. Выберите "Alfa ID" в качестве продукта
  5. Настройте redirect URI (например, http://localhost:8000/alfaid/callback)
  6. Скопируйте Client ID и Client Secret
  7. Используйте эти учетные данные в вашем .env файле

Промышленное окружение

  1. Завершите тестирование в песочнице
  2. Отправьте ваше приложение на одобрение для промышленного использования
  3. После одобрения вы получите промышленные учетные данные
  4. Обновите ваш .env промышленными учетными данными
  5. Измените ALFAID_ENVIRONMENT=production

Конфигурация

Файл config/alfaid.php содержит следующие опции:

return [
    // Окружение: 'sandbox' или 'production'
    'environment' => env('ALFAID_ENVIRONMENT', 'sandbox'),
    
    // Конфигурация песочницы
    'sandbox' => [
        'base_url' => 'https://id-sandbox.alfabank.ru',
        'client_id' => env('ALFAID_SANDBOX_CLIENT_ID'),
        'client_secret' => env('ALFAID_SANDBOX_CLIENT_SECRET'),
        'redirect_uri' => env('ALFAID_SANDBOX_REDIRECT_URI'),
    ],
    
    // Конфигурация промышленного окружения
    'production' => [
        'base_url' => 'https://id.alfabank.ru',
        'client_id' => env('ALFAID_PRODUCTION_CLIENT_ID'),
        'client_secret' => env('ALFAID_PRODUCTION_CLIENT_SECRET'),
        'redirect_uri' => env('ALFAID_PRODUCTION_REDIRECT_URI'),
    ],
    
    // OAuth scopes
    'scopes' => env('ALFAID_SCOPES', 'openid profile email'),
    
    // Длина state параметра для CSRF защиты
    'state_length' => 32,
    
    // HTTP таймаут в секундах
    'timeout' => 30,
    
    // SSL верификация
    'verify_ssl' => env('ALFAID_VERIFY_SSL', true),
];

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

Базовый процесс аутентификации

Пакет автоматически регистрирует роуты для OAuth процесса:

  • GET /alfaid/login - Перенаправление на страницу авторизации Alfa ID
  • GET /alfaid/callback - Обработка OAuth callback
  • POST /alfaid/logout - Выход пользователя и отзыв токена
  • POST /alfaid/refresh - Обновление access token
  • GET /alfaid/user - Возвращает данные аутентифицированного пользователя

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

use Tigusigalpa\AlfaID\Facades\AlfaID;

// Получить URL авторизации
$authUrl = AlfaID::getAuthorizationUrl();

// Получить access token из кода авторизации
$tokenData = AlfaID::getAccessToken($code);

// Получить профиль пользователя
$userProfile = AlfaID::getUserProfile($accessToken);

// Обновить access token
$newTokenData = AlfaID::refreshAccessToken($refreshToken);

// Отозвать токен
AlfaID::revokeToken($accessToken);

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

use Tigusigalpa\AlfaID\AlfaIDClient;

class YourController extends Controller
{
    protected $alfaId;

    public function __construct(AlfaIDClient $alfaId)
    {
        $this->alfaId = $alfaId;
    }

    public function login()
    {
        return redirect($this->alfaId->getAuthorizationUrl());
    }
}

Защита роутов с помощью Middleware

Зарегистрируйте middleware в app/Http/Kernel.php:

protected $routeMiddleware = [
    // ... другие middleware
    'alfaid' => \Tigusigalpa\AlfaID\Middleware\AlfaIDAuthenticated::class,
];

Используйте в ваших роутах:

Route::middleware('alfaid')->group(function () {
    Route::get('/dashboard', [DashboardController::class, 'index']);
    Route::get('/profile', [ProfileController::class, 'show']);
});

Использование вспомогательных функций

use Tigusigalpa\AlfaID\Helpers\AlfaIDHelper;

// Проверить, аутентифицирован ли пользователь
if (AlfaIDHelper::isAuthenticated()) {
    // Пользователь аутентифицирован
}

// Получить access token
$accessToken = AlfaIDHelper::getAccessToken();

// Получить данные пользователя
$user = AlfaIDHelper::getUser();

// Получить конкретный атрибут пользователя
$email = AlfaIDHelper::getUserAttribute('email');
$name = AlfaIDHelper::getUserAttribute('name', 'Гость');

// Проверить, истек ли токен
if (AlfaIDHelper::isTokenExpired()) {
    // Токен нужно обновить
}

Переключение окружений

use Tigusigalpa\AlfaID\Facades\AlfaID;

// Переключиться на production
AlfaID::setEnvironment('production');

// Переключиться на sandbox
AlfaID::setEnvironment('sandbox');

// Получить текущее окружение
$env = AlfaID::getEnvironment();

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

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

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

composer require tigusigalpa/alfa-id-php

Базовая настройка

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

use Tigusigalpa\AlfaID\AlfaIDClient;

// Конфигурация
$config = [
    'environment' => 'sandbox', // или 'production'
    'sandbox' => [
        'base_url' => 'https://id-sandbox.alfabank.ru',
        'client_id' => 'ваш_client_id',
        'client_secret' => 'ваш_client_secret',
        'redirect_uri' => 'http://localhost:8000/callback.php',
    ],
    'production' => [
        'base_url' => 'https://id.alfabank.ru',
        'client_id' => 'ваш_production_client_id',
        'client_secret' => 'ваш_production_client_secret',
        'redirect_uri' => 'https://yourdomain.com/callback.php',
    ],
    'scopes' => 'openid profile email',
    'state_length' => 32,
    'timeout' => 30,
    'verify_ssl' => true,
];

// Создание клиента
$alfaId = new AlfaIDClient($config);

Пример: Страница входа (login.php)

<?php
session_start();
require_once 'vendor/autoload.php';

use Tigusigalpa\AlfaID\AlfaIDClient;

$config = [/* ваша конфигурация */];
$alfaId = new AlfaIDClient($config);

// Генерация state для CSRF защиты
$state = bin2hex(random_bytes(16));
$_SESSION['alfaid_state'] = $state;

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

// Перенаправление на Alfa ID
header('Location: ' . $authUrl);
exit;

Пример: Обработка callback (callback.php)

<?php
session_start();
require_once 'vendor/autoload.php';

use Tigusigalpa\AlfaID\AlfaIDClient;
use Tigusigalpa\AlfaID\Exceptions\AlfaIDException;

$config = [/* ваша конфигурация */];
$alfaId = new AlfaIDClient($config);

try {
    // Получение кода и state из параметров
    $code = $_GET['code'] ?? null;
    $state = $_GET['state'] ?? null;
    
    if (!$code || !$state) {
        throw new Exception('Отсутствуют необходимые параметры');
    }
    
    // Проверка state (CSRF защита)
    if (!isset($_SESSION['alfaid_state']) || $_SESSION['alfaid_state'] !== $state) {
        throw new Exception('Неверный state параметр');
    }
    
    // Удаление использованного state
    unset($_SESSION['alfaid_state']);
    
    // Обмен кода на токен
    $tokenData = $alfaId->getAccessToken($code);
    
    // Сохранение токенов в сессии
    $_SESSION['alfaid_access_token'] = $tokenData['access_token'];
    $_SESSION['alfaid_refresh_token'] = $tokenData['refresh_token'];
    $_SESSION['alfaid_expires_in'] = $tokenData['expires_in'];
    $_SESSION['alfaid_token_created_at'] = time();
    
    // Получение профиля пользователя
    $userProfile = $alfaId->getUserProfile($tokenData['access_token']);
    
    // Сохранение данных пользователя
    $_SESSION['alfaid_user'] = $userProfile;
    
    // Перенаправление на защищенную страницу
    header('Location: dashboard.php');
    exit;
    
} catch (AlfaIDException $e) {
    echo "Ошибка авторизации: " . $e->getMessage();
} catch (Exception $e) {
    echo "Ошибка: " . $e->getMessage();
}

Пример: Защищенная страница (dashboard.php)

<?php
session_start();
require_once 'vendor/autoload.php';

use Tigusigalpa\AlfaID\AlfaIDClient;

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

// Проверка истечения токена
$tokenAge = time() - ($_SESSION['alfaid_token_created_at'] ?? 0);
$expiresIn = $_SESSION['alfaid_expires_in'] ?? 0;

if ($tokenAge >= $expiresIn) {
    // Токен истек, нужно обновить
    $config = [/* ваша конфигурация */];
    $alfaId = new AlfaIDClient($config);
    
    try {
        $newTokenData = $alfaId->refreshAccessToken($_SESSION['alfaid_refresh_token']);
        
        $_SESSION['alfaid_access_token'] = $newTokenData['access_token'];
        $_SESSION['alfaid_refresh_token'] = $newTokenData['refresh_token'];
        $_SESSION['alfaid_expires_in'] = $newTokenData['expires_in'];
        $_SESSION['alfaid_token_created_at'] = time();
    } catch (Exception $e) {
        // Не удалось обновить токен, требуется повторная авторизация
        session_destroy();
        header('Location: login.php');
        exit;
    }
}

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

Пример: Выход (logout.php)

<?php
session_start();
require_once 'vendor/autoload.php';

use Tigusigalpa\AlfaID\AlfaIDClient;

if (isset($_SESSION['alfaid_access_token'])) {
    $config = [/* ваша конфигурация */];
    $alfaId = new AlfaIDClient($config);
    
    try {
        // Отзыв токена
        $alfaId->revokeToken($_SESSION['alfaid_access_token']);
    } catch (Exception $e) {
        // Игнорируем ошибки отзыва
    }
}

// Очистка сессии
session_destroy();

// Перенаправление на главную
header('Location: index.php');
exit;

Пример: Получение данных пользователя

<?php
session_start();
require_once 'vendor/autoload.php';

use Tigusigalpa\AlfaID\AlfaIDClient;

if (!isset($_SESSION['alfaid_access_token'])) {
    http_response_code(401);
    echo json_encode(['error' => 'Не авторизован']);
    exit;
}

$config = [/* ваша конфигурация */];
$alfaId = new AlfaIDClient($config);

try {
    $userProfile = $alfaId->getUserProfile($_SESSION['alfaid_access_token']);
    
    header('Content-Type: application/json');
    echo json_encode($userProfile);
    
} catch (Exception $e) {
    http_response_code(500);
    echo json_encode(['error' => $e->getMessage()]);
}

Работа с разными окружениями

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

use Tigusigalpa\AlfaID\AlfaIDClient;

$config = [/* ваша конфигурация */];
$alfaId = new AlfaIDClient($config);

// Переключение на production
$alfaId->setEnvironment('production');

// Переключение на sandbox
$alfaId->setEnvironment('sandbox');

// Получение текущего окружения
$currentEnv = $alfaId->getEnvironment();
echo "Текущее окружение: " . $currentEnv;

Справочник API

Класс AlfaIDClient

Основной клиентский класс для взаимодействия с Alfa ID OAuth API.

Конструктор

public function __construct(array $config = null)

Создает новый экземпляр AlfaIDClient.

Параметры:

  • $config (array|null): Опциональный массив конфигурации. Если null, использует Laravel config.

Методы

getAuthorizationUrl()
public function getAuthorizationUrl($state = null, $scopes = null): string

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

Параметры:

  • $state (string|null): CSRF state параметр. Генерируется автоматически, если null.
  • $scopes (string|null): OAuth scopes. Использует значение по умолчанию из конфига, если null.

Возвращает: Строку URL авторизации

Пример:

$url = AlfaID::getAuthorizationUrl();
return redirect($url);
getAccessToken()
public function getAccessToken($code): array

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

Параметры:

  • $code (string): Код авторизации из callback

Возвращает: Массив, содержащий:

  • access_token (string)
  • refresh_token (string)
  • expires_in (int)
  • token_type (string)

Выбрасывает: TokenException при ошибке

Пример:

$tokenData = AlfaID::getAccessToken($request->input('code'));
refreshAccessToken()
public function refreshAccessToken($refreshToken): array

Обновляет истекший access token.

Параметры:

  • $refreshToken (string): Refresh token

Возвращает: Массив с новыми данными токена

Выбрасывает: TokenException при ошибке

Пример:

$newTokenData = AlfaID::refreshAccessToken($oldRefreshToken);
getUserProfile()
public function getUserProfile($accessToken): array

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

Параметры:

  • $accessToken (string): Действительный access token

Возвращает: Массив с данными профиля пользователя:

  • sub (string): ID пользователя
  • name (string): Полное имя
  • email (string): Email адрес
  • phone_number (string): Номер телефона
  • Другие поля профиля

Выбрасывает: AlfaIDException при ошибке

Пример:

$user = AlfaID::getUserProfile($accessToken);
revokeToken()
public function revokeToken($token, $tokenTypeHint = 'access_token'): bool

Отзывает access или refresh token.

Параметры:

  • $token (string): Токен для отзыва
  • $tokenTypeHint (string): Тип токена ('access_token' или 'refresh_token')

Возвращает: Булево значение успеха

Выбрасывает: AlfaIDException при ошибке

Пример:

AlfaID::revokeToken($accessToken);

Класс AlfaIDHelper

Статические вспомогательные методы для общих задач.

isAuthenticated()

public static function isAuthenticated(): bool

Проверяет, аутентифицирован ли пользователь.

Возвращает: True, если аутентифицирован

Пример:

if (AlfaIDHelper::isAuthenticated()) {
    // Пользователь вошел в систему
}

Исключения

AlfaIDException

Базовый класс исключений для всех ошибок Alfa ID.

Свойства:

  • $response: HTTP response объект (если доступен)

Методы:

  • getResponse(): Получить HTTP response

InvalidStateException

Выбрасывается при ошибке валидации state параметра (CSRF защита).

TokenException

Выбрасывается при ошибках операций с токенами.

Ключи сессии

Пакет использует следующие ключи сессии:

  • alfaid_state: CSRF state параметр (временный)
  • alfaid_access_token: Access token
  • alfaid_refresh_token: Refresh token
  • alfaid_expires_in: Время истечения токена (секунды)
  • alfaid_token_type: Тип токена (обычно "Bearer")
  • alfaid_token_created_at: Временная метка создания токена
  • alfaid_user: Данные профиля пользователя

OAuth Scopes

Доступные scopes:

  • openid: Требуется для OpenID Connect
  • profile: Информация профиля пользователя
  • email: Email адрес
  • phone: Номер телефона

Scopes по умолчанию: openid profile email

API Endpoints

Окружение песочницы

  • Базовый URL: https://id-sandbox.alfabank.ru
  • Для тестирования и разработки

Промышленное окружение

  • Базовый URL: https://id.alfabank.ru
  • Для реальных приложений

OAuth Endpoints

  • /oauth/authorize - Endpoint авторизации
  • /oauth/token - Endpoint токена
  • /oauth/userinfo - Endpoint профиля пользователя
  • /oauth/revoke - Endpoint отзыва токена

Продвинутая интеграция

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

Хранение пользователей Alfa ID в вашей базе данных:

use App\Models\User;
use Illuminate\Http\Request;
use Tigusigalpa\AlfaID\Facades\AlfaID;

class AlfaIDAuthController extends Controller
{
    public function callback(Request $request)
    {
        try {
            $code = $request->input('code');
            $state = $request->input('state');
            
            AlfaID::validateState($state);
            $tokenData = AlfaID::getAccessToken($code);
            $profile = AlfaID::getUserProfile($tokenData['access_token']);
            
            // Найти или создать пользователя
            $user = User::updateOrCreate(
                ['email' => $profile['email']],
                [
                    'name' => $profile['name'],
                    'alfa_id' => $profile['sub'],
                    'phone' => $profile['phone_number'] ?? null,
                ]
            );
            
            // Сохранить токены (зашифрованные)
            $user->update([
                'alfa_access_token' => encrypt($tokenData['access_token']),
                'alfa_refresh_token' => encrypt($tokenData['refresh_token']),
                'alfa_token_expires_at' => now()->addSeconds($tokenData['expires_in']),
            ]);
            
            // Войти пользователя
            auth()->login($user);
            
            return redirect('/dashboard');
            
        } catch (\Exception $e) {
            return redirect('/login')->with('error', $e->getMessage());
        }
    }
}

Автоматическое обновление токена

Middleware для автоматического обновления истекших токенов:

namespace App\Http\Middleware;

use Closure;
use Tigusigalpa\AlfaID\Facades\AlfaID;
use Tigusigalpa\AlfaID\Helpers\AlfaIDHelper;

class RefreshAlfaIDToken
{
    public function handle($request, Closure $next)
    {
        if (AlfaIDHelper::isTokenExpired()) {
            try {
                $refreshToken = AlfaIDHelper::getRefreshToken();
                $tokenData = AlfaID::refreshAccessToken($refreshToken);
                
                session([
                    'alfaid_access_token' => $tokenData['access_token'],
                    'alfaid_refresh_token' => $tokenData['refresh_token'],
                    'alfaid_expires_in' => $tokenData['expires_in'],
                    'alfaid_token_created_at' => time(),
                ]);
            } catch (\Exception $e) {
                return redirect()->route('alfaid.login');
            }
        }
        
        return $next($request);
    }
}

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

Лучшие практики

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

Не делайте так: Хранение токенов в открытом виде

// Плохо
$user->alfa_token = $token;

Делайте так: Шифруйте токены

// Хорошо
$user->alfa_token = encrypt($token);

2. State параметр

Всегда валидируйте state параметр (автоматически обрабатывается пакетом):

AlfaID::validateState($request->input('state'));

3. HTTPS в промышленном окружении

Всегда используйте HTTPS для redirect URI в промышленном окружении:

ALFAID_PRODUCTION_REDIRECT_URI=https://yourdomain.com/alfaid/callback

Чеклист для промышленного окружения

Перед развертыванием в промышленное окружение:

  • Переключиться на промышленное окружение: ALFAID_ENVIRONMENT=production
  • Обновить промышленные учетные данные в .env
  • Проверить, что redirect URI соответствует промышленному домену
  • Включить SSL верификацию: ALFAID_VERIFY_SSL=true
  • Хранить токены в базе данных (зашифрованные)
  • Реализовать механизм обновления токенов
  • Добавить логирование ошибок и мониторинг
  • Протестировать полный OAuth процесс
  • Проверить лучшие практики безопасности
  • Настроить HTTPS на вашем домене
  • Настроить параметры безопасности сессии
  • Добавить ограничение частоты запросов к auth endpoints

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

Пакет включает режим песочницы для тестирования:

  1. Установите ALFAID_ENVIRONMENT=sandbox в вашем .env
  2. Используйте учетные данные песочницы из портала разработчиков Альфа-Банка
  3. Протестируйте полный OAuth процесс

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

Частые проблемы

Проблема: "Invalid redirect_uri"

Причина: Redirect URI не соответствует зарегистрированному URI

Решение:

  1. Проверьте .env файл: ALFAID_SANDBOX_REDIRECT_URI
  2. Убедитесь, что он точно совпадает в консоли Alfa ID
  3. Включите протокол (http/https)
  4. Включите порт, если не стандартный (80/443)

Проблема: "Invalid state parameter"

Причина: Ошибка CSRF защиты

Решение: Убедитесь, что сессии работают корректно в вашем Laravel приложении.

Проблема: Ошибка SSL сертификата

Причина: Ошибка SSL верификации

Решение: Для локальной разработки вы можете установить ALFAID_VERIFY_SSL=false в .env. Никогда не делайте этого в промышленном окружении.

Проблема: Роуты не найдены

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

Решение:

php artisan route:clear
php artisan config:clear

Участие в разработке

Спасибо за интерес к участию в разработке этого пакета!

Как участвовать

  1. Сделайте fork репозитория
  2. Создайте новую ветку для вашей функции или исправления
  3. Внесите изменения
  4. Напишите или обновите тесты при необходимости
  5. Убедитесь, что все тесты проходят
  6. Отправьте pull request

Стандарты кодирования

  • Следуйте стандартам кодирования PSR-12
  • Пишите понятные, описательные сообщения коммитов
  • Добавляйте комментарии для сложной логики
  • Обновляйте документацию при необходимости

Сообщение о проблемах

При сообщении о проблемах, пожалуйста, укажите:

  • Версию Laravel
  • Версию PHP
  • Версию пакета
  • Шаги для воспроизведения
  • Ожидаемое поведение
  • Фактическое поведение
  • Любые сообщения об ошибках или логи

История изменений

[1.0.0] - 2024-12-21

Добавлено

  • Первый релиз
  • Реализация OAuth 2.0 Authorization Code Flow
  • Поддержка песочницы и промышленного окружения
  • Laravel service provider и facade
  • Middleware для аутентификации
  • Встроенные роуты для OAuth процесса
  • Управление токенами (получение, обновление, отзыв)
  • Получение профиля пользователя
  • Хранение аутентификации в сессии
  • Вспомогательные функции для общих задач
  • Всесторонняя документация
  • Примеры использования и руководства по интеграции
  • Модульные тесты с PHPUnit
  • GitHub Actions CI/CD workflow

Ссылки

Лицензия

MIT License

Copyright (c) 2025 Igor Sazonov

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

Автор

Igor Sazonov

Поддержка

По вопросам и проблемам: