Add H2H authentication service and new example flows

- Implement H2H authentication service for secure client authentication
- Add new examples for authorization code flow and H2H auth service
- Include example for generating client secret
- Update core connector and token request functionality
- Enhance README with new features

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
This commit is contained in:
2026-01-23 20:58:30 +03:00
parent 60c99bca40
commit 2964c391b5
11 changed files with 497 additions and 11 deletions

View File

@@ -0,0 +1,80 @@
<?php
declare(strict_types=1);
require_once __DIR__ . '/../vendor/autoload.php';
use Apoloz\AlfaBank\AlfaBank;
use Apoloz\AlfaBank\Enums\Environment;
use Apoloz\AlfaBank\Requests\NominalAccounts\Beneficiaries\GetBeneficiariesRequest;
/**
* Authorization Code Flow (H2H) Example
*
* Сценарий: Обмен полученного в браузере кода на токены и дальнейшая работа через refresh_token.
*/
// 1. Конфигурация
$config = [
'cert' => __DIR__ . '/certs/client.cer',
'key' => __DIR__ . '/certs/private.key',
'client_id' => getenv('ALFA_BAAS_CLIENT_ID'),
'client_secret' => getenv('ALFA_BAAS_CLIENT_SECRET'),
'redirect_uri' => 'https://your-app.com/callback', // Тот же, что указывали при получении кода
'account_number' => '40702810...'
];
// 2. Инициализация коннектора
$baas = AlfaBank::baas(
certificatePath: $config['cert'],
privateKeyPath: $config['key'],
environment: Environment::SANDBOX
);
// ВАЖНО: Мы пока НЕ вызываем login()!
try {
// --- СЦЕНАРИЙ А: Первый вход (у нас есть только код из браузера) ---
// Ссылка для получения кода: https://baas.alfabank.ru/oidc/authorize?response_type=code&client_id=...
$authCode = 'code_from_browser_url'; // <-- Вставьте сюда код
if ($authCode) {
echo "Обмениваем код на токены...\n";
$tokenData = $baas->authWithCode($authCode, $config['redirect_uri']);
echo "Access Token получен!\n";
echo "Refresh Token: " . $tokenData->refresh_token . "\n";
echo "(Сохраните refresh_token в базу данных)\n\n";
}
// --- СЦЕНАРИЙ Б: Повторный вход (у нас есть сохраненный refresh_token) ---
$savedRefreshToken = 'your_saved_refresh_token_from_db';
if ($savedRefreshToken) {
echo "Обновляем сессию по Refresh Token...\n";
$tokenData = $baas->refreshToken($savedRefreshToken);
echo "Сессия обновлена. Новый Access Token действует " . $tokenData->expires_in . " сек.\n";
if ($tokenData->refresh_token) {
echo "Пришел новый Refresh Token (сохраните его): " . $tokenData->refresh_token . "\n";
}
}
// 3. Выполняем защищенный запрос (например, список бенефициаров)
// Коннектор уже авторизован (внутри updateAccessToken/authWithCode вызывается authenticate())
echo "Запрашиваем список...\n";
$response = $baas->send(new GetBeneficiariesRequest(
accountNumber: $config['account_number'],
type: 'FL_RESIDENT'
));
echo "Успешно! Найдено: " . count($response->dto()->beneficiaries) . "\n";
} catch (\Exception $e) {
echo "Ошибка: " . $e->getMessage() . "\n";
if (method_exists($e, 'getResponse')) {
echo "Body: " . $e->getResponse()->body() . "\n";
}
}