forked from apoloz/alfa-bank-sdk
- 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>
81 lines
3.2 KiB
PHP
81 lines
3.2 KiB
PHP
<?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";
|
||
}
|
||
}
|
||
|