Skip to main content

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

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

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

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

Можете сделать маршруты на усмотрение, ниже приведены примеры.

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

2. /proxy/auth/result — для проверки статуса авторизации через сессионный идентификатор (code_id).

3. /proxy/auth/complete — для завершения авторизации и выдачи токена после успешного завершения процесса.

Создайте следующие маршруты в файле routes/web.php:

use App\Http\Controllers\AuthProxyController;

Route::post('/proxy/auth/code', [AuthProxyController::class, 'getCode']);
Route::post('/proxy/auth/result', [AuthProxyController::class, 'getResult']);
Route::post('/proxy/auth/complete', [AuthProxyController::class, 'completeAuth']);
Шаг 2: Создание контроллера для обработки запросов

Контроллер будет проксировать запросы к внешнему API с использованием вашего api_key. В контроллере мы создадим методы для каждого шага процесса авторизации: получение кода, проверка результата и завершение авторизации.

Создайте контроллер AuthProxyController.php:

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Http;

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

    public $enableCsrfValidation = false;

    // Метод для запроса кода авторизации
    public function getCode(Request $request)
    {
        $response = Http::post($this->apiUrl . '/code/get', [
            'api_key' => $this->apiKey,
            'phone' => $request->input('phone'),  // Номер телефона от клиента
        ]);

        return response()->json($response->json());
    }

    // Метод для проверки результата авторизации
    public function getResult(Request $request)
    {
        $response = Http::post($this->apiUrl . '/code/result', [
            'api_key' => $this->apiKey,
            'code_id' => $request->input('code_id'),  // Используем code_id
        ]);

        return response()->json($response->json());
    }

    // Метод для завершения авторизации и выдачи токена
    public function completeAuth(Request $request)
    {
        $code_id = $request->input('code_id');

        // Проверяем статус сессии перед завершением авторизации
        $response = Http::post($this->apiUrl . '/code/result', [
            'api_key' => $this->apiKey,
            'code_id' => $code_id,
        ]);

        $data = $response->json();

        if ($data['auth'] === true) {
            // Если авторизация успешна, возвращаем токен и данные пользователя
            return response()->json([
                'token' => 'generated_token_for_code_' . $code_id,
                'user_data' => [
                    'phone' => $data['phone'],
                    'messenger' => $data['messenger'],
                ],
            ]);
        } else {
            // Если авторизация не успешна
            return response()->json(['error' => 'Authorization failed'], 401);
        }
    }
}

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

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

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

2. Параллельное отправление запросов для проверки результата авторизации с интервалом в 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:

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, передавая code_id, чтобы завершить процесс и получить токен:

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);
            }
        });
}
Шаг 4: Генерация токена на сервере

На сервере Laravel метод completeAuth будет генерировать токен для клиента. В реальном проекте, вместо фиктивного токена, вы можете использовать JWT (JSON Web Token) или другую систему аутентификации.

Заключение

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

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

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

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

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

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

4. Сервер выдает клиенту токен для дальнейшей работы.