Skip to main content

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

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

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

Для начала создадим маршруты в Yii2. В Yii2 маршруты можно описывать в конфигурационном файле config/web.php в разделе rules:

// 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() — для запроса кода авторизации.

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-ключ

    // Отключаем CSRF для API-запросов
    public $enableCsrfValidation = false;

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

        $phone = $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' => 'Ошибка запроса кода'];
    }

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

        $sessionId = $request->post('session_id');

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

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

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

        $sessionId = $request->post('session_id');

        // Пример генерации фиктивного токена
        return [
            'token' => 'generated_token_for_session_' . $sessionId,
        ];
    }
}
Шаг 3: Логика на клиентской стороне

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

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

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

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

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.session_id) {
            // Начинаем проверку статуса авторизации каждые 3 секунды
            const sessionId = data.session_id;
            const intervalId = setInterval(() => {
                checkAuthStatus(sessionId, intervalId);
            }, 3000);
        }
    });

2. Проверка результата авторизации

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

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

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

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

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

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

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

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

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

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

2. Параллельно, каждые 3 секунды, клиент запрашивает результат авторизации через /proxy/auth/result.

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

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