forked from apoloz/alfa-bank-sdk
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:
80
examples/12_auth_code_flow.php
Normal file
80
examples/12_auth_code_flow.php
Normal 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";
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user