PHP code example of tigusigalpa / tbank-id-php

1. Go to this page and download the library: Download tigusigalpa/tbank-id-php library. Choose the download type require.

2. Extract the ZIP file and open the index.php.

3. Add this code to the index.php.
    
        
<?php
require_once('vendor/autoload.php');

/* Start to develop here. Best regards https://php-download.com/ */

    

tigusigalpa / tbank-id-php example snippets


return [
    'client_id' => env('TBANK_ID_CLIENT_ID', ''),
    'client_secret' => env('TBANK_ID_CLIENT_SECRET', ''),
    'redirect_uri' => env('TBANK_ID_REDIRECT_URI', ''),
    'scopes' => [
        'openid',
        'email',
        'phone',
    ],
];



igusigalpa\TBankID\TBankIDClient;
use Tigusigalpa\TBankID\Models\TBankUser;
use Tigusigalpa\TBankID\Exceptions\TBankIDException;

session_start();

$client = new TBankIDClient(
    'your_client_id',
    'your_client_secret',
    'https://your-domain.com/callback.php'
);

// Страница авторизации (index.php)
if (!isset($_SESSION['tbank_user'])) {
    $state = bin2hex(random_bytes(16));
    $_SESSION['tbank_state'] = $state;
    
    $authUrl = $client->getAuthorizationUrl(['openid', 'email', 'phone'], $state);
    
    echo '<a href="' . htmlspecialchars($authUrl) . '">Войти через TBank ID</a>';
    exit;
}

// Пользователь авторизован
$user = new TBankUser($_SESSION['tbank_user']);
echo 'Привет, ' . htmlspecialchars($user->getName());


// callback.php

ID\TBankIDClient;
use Tigusigalpa\TBankID\Exceptions\TBankIDException;

session_start();

$client = new TBankIDClient(
    'your_client_id',
    'your_client_secret',
    'https://your-domain.com/callback.php'
);

$code = $_GET['code'] ?? null;
$state = $_GET['state'] ?? null;
$sessionState = $_SESSION['tbank_state'] ?? null;

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

if (!$client->verifyState($state, $sessionState)) {
    die('Ошибка: проверка безопасности не пройдена');
}

try {
    // Получаем токен
    $tokenData = $client->getAccessToken($code);
    
    // Сохраняем токены
    $_SESSION['tbank_access_token'] = $tokenData['access_token'];
    $_SESSION['tbank_refresh_token'] = $tokenData['refresh_token'] ?? null;
    
    // Получаем информацию о пользователе
    $userInfo = $client->getUserInfo($tokenData['access_token']);
    $_SESSION['tbank_user'] = $userInfo;
    
    // Очищаем state
    unset($_SESSION['tbank_state']);
    
    // Перенаправляем на главную
    header('Location: index.php');
    exit;
    
} catch (TBankIDException $e) {
    die('Ошибка авторизации: ' . $e->getMessage());
}


// logout.php

nkID\TBankIDClient;
use Tigusigalpa\TBankID\Exceptions\TBankIDException;

session_start();

$client = new TBankIDClient(
    'your_client_id',
    'your_client_secret',
    'https://your-domain.com/callback.php'
);

$accessToken = $_SESSION['tbank_access_token'] ?? null;

if ($accessToken) {
    try {
        $client->revokeToken($accessToken);
    } catch (TBankIDException $e) {
        // Логируем ошибку, но продолжаем выход
        error_log('Failed to revoke token: ' . $e->getMessage());
    }
}

// Очищаем сессию
unset($_SESSION['tbank_access_token']);
unset($_SESSION['tbank_refresh_token']);
unset($_SESSION['tbank_user']);

header('Location: index.php');
exit;



use Tigusigalpa\TBankID\TBankIDClient;
use Tigusigalpa\TBankID\Exceptions\TBankIDException;

session_start();

$client = new TBankIDClient(
    'your_client_id',
    'your_client_secret',
    'https://your-domain.com/callback.php'
);

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

if ($refreshToken) {
    try {
        $newTokenData = $client->refreshAccessToken($refreshToken);
        
        $_SESSION['tbank_access_token'] = $newTokenData['access_token'];
        
        if (isset($newTokenData['refresh_token'])) {
            $_SESSION['tbank_refresh_token'] = $newTokenData['refresh_token'];
        }
        
        echo 'Токен успешно обновлен';
    } catch (TBankIDException $e) {
        echo 'Ошибка обновления токена: ' . $e->getMessage();
    }
}



use Tigusigalpa\TBankID\Models\TBankUser;

session_start();

if (isset($_SESSION['tbank_user'])) {
    $user = new TBankUser($_SESSION['tbank_user']);
    
    echo 'ID: ' . $user->getId() . '<br>';
    echo 'Email: ' . $user->getEmail() . '<br>';
    echo 'Телефон: ' . $user->getPhone() . '<br>';
    echo 'Имя: ' . $user->getName() . '<br>';
    echo 'Фамилия: ' . $user->getFamilyName() . '<br>';
    echo 'Отчество: ' . $user->getMiddleName() . '<br>';
    
    if ($user->isEmailVerified()) {
        echo 'Email подтвержден<br>';
    }
    
    if ($user->isPhoneVerified()) {
        echo 'Телефон подтвержден<br>';
    }
}

// routes/web.php
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\TBankAuthController;

Route::get('/auth/tbank', [TBankAuthController::class, 'redirect'])->name('tbank.login');
Route::get('/auth/tbank/callback', [TBankAuthController::class, 'callback'])->name('tbank.callback');
Route::post('/auth/tbank/logout', [TBankAuthController::class, 'logout'])->name('tbank.logout');

// app/Http/Controllers/TBankAuthController.php


namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Tigusigalpa\TBankID\Facades\TBankID;
use Tigusigalpa\TBankID\Exceptions\TBankIDException;

class TBankAuthController extends Controller
{
    public function redirect(Request $request)
    {
        $state = bin2hex(random_bytes(16));
        $request->session()->put('tbank_state', $state);
        
        $authUrl = TBankID::getAuthorizationUrl(['openid', 'email', 'phone'], $state);
        
        return redirect($authUrl);
    }

    public function callback(Request $request)
    {
        $code = $request->get('code');
        $state = $request->get('state');
        $sessionState = $request->session()->get('tbank_state');

        if (!$code) {
            return redirect('/')->with('error', 'Авторизация отменена');
        }

        if (!TBankID::verifyState($state, $sessionState)) {
            return redirect('/')->with('error', 'Ошибка проверки безопасности');
        }

        try {
            $tokenData = TBankID::getAccessToken($code);
            
            $accessToken = $tokenData['access_token'];
            $refreshToken = $tokenData['refresh_token'] ?? null;
            
            $userInfo = TBankID::getUserInfo($accessToken);
            
            $request->session()->put('tbank_access_token', $accessToken);
            $request->session()->put('tbank_refresh_token', $refreshToken);
            $request->session()->put('tbank_user', $userInfo);
            
            return redirect('/dashboard')->with('success', 'Вы успешно авторизованы');
            
        } catch (TBankIDException $e) {
            return redirect('/')->with('error', 'Ошибка авторизации: ' . $e->getMessage());
        }
    }

    public function logout(Request $request)
    {
        $accessToken = $request->session()->get('tbank_access_token');
        
        if ($accessToken) {
            try {
                TBankID::revokeToken($accessToken);
            } catch (TBankIDException $e) {
                // Логируем ошибку, но продолжаем выход
            }
        }
        
        $request->session()->forget(['tbank_access_token', 'tbank_refresh_token', 'tbank_user']);
        
        return redirect('/')->with('success', 'Вы вышли из системы');
    }
}

use Tigusigalpa\TBankID\TBankIDClient;

class AuthService
{
    protected TBankIDClient $tbankClient;

    public function __construct(TBankIDClient $tbankClient)
    {
        $this->tbankClient = $tbankClient;
    }

    public function authenticate(string $code): array
    {
        return $this->tbankClient->getAccessToken($code);
    }
}

use Tigusigalpa\TBankID\Facades\TBankID;
use Tigusigalpa\TBankID\Models\TBankUser;

$accessToken = session('tbank_access_token');
$userInfo = TBankID::getUserInfo($accessToken);
$user = new TBankUser($userInfo);

// Получение данных пользователя
$userId = $user->getId();
$email = $user->getEmail();
$phone = $user->getPhone();
$name = $user->getName();
$givenName = $user->getGivenName();
$familyName = $user->getFamilyName();
$middleName = $user->getMiddleName();

// Проверка верификации
$isEmailVerified = $user->isEmailVerified();
$isPhoneVerified = $user->isPhoneVerified();

// Получение всех данных
$allData = $user->toArray();

use Tigusigalpa\TBankID\Facades\TBankID;

$refreshToken = session('tbank_refresh_token');

try {
    $newTokenData = TBankID::refreshAccessToken($refreshToken);
    
    session()->put('tbank_access_token', $newTokenData['access_token']);
    
    if (isset($newTokenData['refresh_token'])) {
        session()->put('tbank_refresh_token', $newTokenData['refresh_token']);
    }
} catch (\Exception $e) {
    // Обработка ошибки
}

// app/Http/Middleware/TBankAuthenticated.php


namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;

class TBankAuthenticated
{
    public function handle(Request $request, Closure $next)
    {
        if (!$request->session()->has('tbank_access_token')) {
            return redirect()->route('tbank.login');
        }

        return $next($request);
    }
}

protected $routeMiddleware = [
    // ...
    'tbank.auth' => \App\Http\Middleware\TBankAuthenticated::class,
];

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

[
    'access_token' => 'string',
    'token_type' => 'Bearer',
    'expires_in' => 3600,
    'refresh_token' => 'string',
    'scope' => 'openid email phone'
]

[
    'sub' => 'user_id',
    'email' => '[email protected]',
    'email_verified' => true,
    'phone_number' => '+79001234567',
    'phone_number_verified' => true,
    'name' => 'Иван Иванов',
    'given_name' => 'Иван',
    'family_name' => 'Иванов',
    'middle_name' => 'Иванович',
    'preferred_username' => 'ivan'
]

use Tigusigalpa\TBankID\Exceptions\TBankIDException;

try {
    $tokenData = TBankID::getAccessToken($code);
} catch (TBankIDException $e) {
    Log::error('TBank ID Error: ' . $e->getMessage());
    return redirect('/')->with('error', 'Ошибка авторизации');
}

public function callback(Request $request)
{
    // ... получение токена и информации о пользователе ...
    
    $user = User::updateOrCreate(
        ['tbank_id' => $userInfo['sub']],
        [
            'email' => $userInfo['email'] ?? null,
            'phone' => $userInfo['phone_number'] ?? null,
            'name' => $userInfo['name'] ?? null,
            'email_verified_at' => $userInfo['email_verified'] ? now() : null,
        ]
    );
    
    auth()->login($user);
    
    return redirect('/dashboard');
}

use Illuminate\Http\Resources\Json\JsonResource;

class TBankUserResource extends JsonResource
{
    public function toArray($request)
    {
        return [
            'id' => $this->getId(),
            'email' => $this->getEmail(),
            'phone' => $this->getPhone(),
            'name' => $this->getName(),
            'verified' => [
                'email' => $this->isEmailVerified(),
                'phone' => $this->isPhoneVerified(),
            ],
        ];
    }
}
bash
composer 
bash
composer