Skip to main content

Пример интеграции Yii2

В этой статье мы разбессмотреим процимесср реалинтегрзации внешней авторизации через внешний API с использованием Yii2,Yii2. где кКлиент отправляет номер телефона для, получаеният кода для авторизации через прокси-сервер, а затем проверяет результат авторизации с регулярными запросами. В конце, после успешной автороизацессаии, пользователюь выдполучается токен для дальнейшей работы.

Шаг 1: Настройка маршрутов в Yii2

Для начала нам нужно настроздадимть маршруты для обработки запросов Yii2.от Вклиента. Yii2Мы создадим три маршрутыа:

м
  • /proxy/auth/code — для запрожно описывать в конфда авторигурзации на основе номера телефона.
  • /proxy/auth/result — для проверки статуса авторизации через code_id.
  • /proxy/auth/complete — для завершения авторизации и выдачи токена после успешного завершения процесса.

Настройка маршрутов производится в файле config/web.php в разделе rules:


'components' => [
    // config/web.phpПрочие компоненты
],
'urlManager' => [
    'enablePrettyUrl' => true,
    'showScriptName' => false,
    'rules' => [
        'POST /proxy/auth/code' => 'auth-proxy/get-code',
        'POST /proxy/auth/result' => 'auth-proxy/get-result',
        'POST /proxy/auth/complete' => 'auth-proxy/complete-auth',
    ],
],
    

Шаг 2: Создание контроллера для обработки запросов

Теперь создадим контроллер AuthProxyController.php, который будет отвечать за проксирование запросов на внешний API авторизации.

Контроллер будет проксимеровать три метода:

1. getCode() — для запросы к внешнему API с использованием вашего api_key. В контроллере мы создадим авметоризации.

 2. getResult() —ды для пркаждоверкиго результшатга авторизации.

 3. completeAuth() — для завершения процесса авторизации: получение кода, проверка результата и завыдершение ачи втокенризации.


namespace app\controllers;

use Yii;
use yii\web\Controller;
use yii\web\Response;
use yii\httpclient\Client;

class AuthProxyController extends Controller
{
    private $apiUrl = 'https://api.auth4app.com';
    private $apiKey = 'your_api_key';  // Замените на ваш реальный API-ключ

    public $enableCsrfValidation = false;

    // Метод для запроса кода авторизации
    public function actionGetCode()
    {
        Yii::$app->response->format = Response::FORMAT_JSON;

        $phone = Yii::$app->request->post('phone');
        $client = new Client();
        
        $response = $client->createRequest()
            ->setMethod('POST')
            ->setUrl($this->apiUrl . '/code/get')
            ->setData([
                'api_key' => $this->apiKey,
                'phone' => $phone,
            ])
            ->send();

        return $response->isOk ? $response->data : ['error' => 'ОшибкаAPI запросаrequest кода'failed'];
    }

    // Метод для проверки результата авторизации
    public function actionGetResult()
    {
        Yii::$app->response->format = Response::FORMAT_JSON;

        $codeId = Yii::$app->request->post('code_id');
        $client = new Client();

        $response = $client->createRequest()
            ->setMethod('POST')
            ->setUrl($this->apiUrl . '/code/result')
            ->setData([
                'api_key' => $this->apiKey,
                'code_id' => $codeId,
            ])
            ->send();

        return $response->isOk ? $response->data : ['error' => 'ОшибкаAPI проверкиrequest результата'failed'];
    }

    // Метод для завершения авторизации и выдачи токена
    public function actionCompleteAuth()
    {
        Yii::$app->response->format = Response::FORMAT_JSON;

        $codeId = Yii::$app->request->post('code_id');
        $client = new Client();

        // Про1. Сначала веряызываем сметод для получения результатус перед завершением авторизации
        $client = new Client();
        $responseauthResponse = $client->createRequest()
            ->setMethod('POST')
            ->setUrl($this->apiUrl . '/code/result')
            ->setData([
                'api_key' => $this->apiKey,
                'code_id' => $codeId,
            ])
            ->send();

        $data = $response->data;

        if ($authResponse->isOk && isset($authResponse->data['auth']) && $authResponse->data['auth'] === true) {
            // Ес2. Поли авторизация успешна, возвращчаем номер телефокена из дответанные
            $phone = $authResponse->data['phone'] ?? null;

            if ($phone) {
                // 3. Поиск пользователя returnпо [номеру 'token'телефона или его создание
                $user => 'generated_token_for_code_' . $codeId,
                'user_data' => User::findOne([
                    'phone' => $data['phone'],
                    'messenger' => $data['messenger'],
                ],
            ]phone]);

                }if else(!$user) {
                    // Если пользовавторизацияель не найден, создаем нового
                    $user = new User();
                    $user->phone = $phone;
                    // можно также добавить другие поля, например, имя, email и т.д.
                    $user->save();
                }

                // 4. Здесь можно сгенерировать токен для пользователя
                $token = "ТУТ ВАШ ТОКЕН"; // На этом этапеш можно создать токен

                // Возвращаем ответ с токеном и информацией о пользователе
                return [
                    'token' => $token,  // Верните сгенерированный токен здесь
                    'user' => $user,    // Возвращаем информацию о пользователе
                ];
            } else {
                return ['error' => 'Phone number not found in the response'];
            }
        } else {
            return ['error' => 'Authorization failed'failed or not completed'];
        }
    }
}
    

Шаг 3: Логика клиентской стороны

На клиентской стороне

Тнеперьобходимо реализберемовать логику, которадля выполняетсния нпоследова клиентельных шагов:

    1. За
  1. Отпросавка номера телефона для получения кода.

     2. Пеавторизации.

  2. Параллельное отправление запросов дическаля проверкаи срезультатуса авторизации с интервалом в 3 секунды.

  3. Как 3.только Зв ответе появится auth: true, запрос завершениея авторизации ис полуередаченией токенаcode_id.

1. Отправка номера телефона

 для запроса кода

Клиент отправляет POST-запрос на /proxy/auth/code, передавая номер телефона:


fetch('/proxy/auth/code', {
    method: 'POST',
    headers: {
        'Content-Type': 'application/json',
    },
    body: JSON.stringify({ phone: '+1234567890' }), // Замените на реальный номер телефона
})
.then(response => response.json())
.then(data => {
    if (data.code_id) {
        // Начинаем проверку статуса авторизации каждые 3 секунды
        const codeId = data.code_id;
        const intervalId = setInterval(() => {
            checkAuthStatus(codeId, intervalId);
        }, 3000);
    }
});
    

2. Периодическая проверка резульстатуса авторизации

Каждые 3 секунды клиент отпрнавлячинает запрос на /proxy/auth/result, проверяять статус авторизации, отправляя запросы на /proxy/auth/result:


function checkAuthStatus(codeId, intervalId) {
    fetch('/proxy/auth/result', {
        method: 'POST',
        headers: {
            'Content-Type': 'application/json',
        },
        body: JSON.stringify({ code_id: codeId }),
    })
    .then(response => response.json())
    .then(data => {
        if (data.auth === true) {
            // Останавливаем проверку
            clearInterval(intervalId);

            // Завершаем авторизацию
            completeAuth(codeId);
        }
    });
}
    

3. Завершение авторизации и получение токена

Как тогдалько авторизация завбудерт успешенаой, клиент отправляет запрос на /proxy/auth/complete для получения токена:


function completeAuth(codeId) {
    fetch('/proxy/auth/complete', {
        method: 'POST',
        headers: {
            'Content-Type': 'application/json',
        },
        body: JSON.stringify({ code_id: codeId }),
    })
    .then(response => response.json())
    .then(data => {
        if (data.token) {
            // Токен получен, можно использовать для дальнейшей работы
            console.log('Authorization successful, token:', data.token);
        }
    });
}
    
Ш

Заг 4: Генерация токена на сервере

На стороне Yii2 метод completeAuth() выдает токен после успешной авторизации. Для реальных приложючений лучше использовать JWT или аналогичную систему для безопасного хранения токенов.

Мы рассмоздатрели пример интеграции Yii2 для работы с внешним API для авторизации. В этом процессе клиент отправляет номер телефона, получа сервер проксирует запркосыд к API, управдляет процессом авторизации и, затем проверяет результат с исполучьзованием code_id. Когда авторизация завершается успешного, завершклиения,т выдполучает токен для дальнейшегй рабо использованияты.

Порядок действий:

1.

  1. Клиент отправляет номер телефона через прокси-метод /proxy/auth/code.

  2. 2. Параллельно, каждые 3 секунды, к

  3. Клиент запрашивает результат авторизации через /proxy/auth/result, передавая code_id.

  4.  3.

  5. Как только авторизация завершена (auth: true), клиент вызывает метод завершения авторизации /proxy/auth/complete.

  6. 4.

  7. Сервер выдает клиенту токен для дальнейшегй работы.
  8. использования клиентом.