Skip to main content

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

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

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

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

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

1. 

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

  •  2.

  • /proxy/auth/result — для проверки статуса авторизации через сессионныйcode_id.
  • идентификатор (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');
    
            // Про1. Сначала веряызываем сметод для получения результатус сессии перед завершением авторизации
            $responseauthResponse = Http::post($this->apiUrl . '/code/result', [
                'api_key' => $this->apiKey,
                'code_id' => $code_id,
            ]);
    
            // Преобразуем ответ в JSON
            $dataauthData = $response-authResponse->json();
    
            if ($data['auth'] === true) {
                // ЕПроверяем, если авторизация успешна,
            вif (isset($authData['auth']) && $authData['auth'] === true) {
                // 2. Позвращлучаем номер телефокена из дответанные
                $phone = $authData['phone'] ?? null;
    
                if ($phone) {
                    // 3. Поиск пользователя по номеру телефона или его создание
                    $user = User::where('phone', $phone)->first();
    
                    if (!$user) {
                        // Если пользователь не найден, создаем нового
                        $user = User::create([
                            'phone' => $phone,
                            // можно также добавить другие поля, например, имя, email и т.д.
                        ]);
                    }
    
                    // 4. Здесь можно сгенерировать токен для пользователя
                    $token = "ТУТ ВАШ ТОКЕН"; // На этом этапе можно создать токен
    
                    // Возвращаем ответ с токеном и информацией о пользователе
                    return response()->json([
                        'token' => 'generated_token_for_code_'$token,  .// $code_id,Верните сгенерированный токен здесь
                        'user_data' => [
                        'phone'user' => $data[user,    // Возвращаем информацию о пользователе
                    ]);
                } else {
                    // Если номер телефона не был возвращен
                    return response()->json(['phone'],
                        'messenger'error' => $data['messenger'Phone number not found in the response'], ],400);
                ]);}
            } else {
                // Если авторизация не успешна
                return response()->json(['error' => 'Authorization failed'failed or not completed'], 401)400);
            }
        }
    }
        

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

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

    1.

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

    2. 2.

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

    4.  3.

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

      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)completeAuth(codeId) {
        fetch('/proxy/auth/result'complete', {
            method: 'POST',
            headers: {
                'Content-Type': 'application/json',
            },
            body: JSON.stringify({ code_id: codeId }),
        })
        .then(response => response.json())
        .then(data => {
            if (data.auth === true)token) {
                // Останавливаем проверку
                    clearInterval(intervalId);
    
                    // Завершаем авторизацию
                    completeAuth(codeId);
                }
            });
    }
    Шаг 4: Генерация токена на сервере

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

    Заключение

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

    Такоеconsole.log('Authorization решениеsuccessful, помогает безопасно управлять процессом авторизацииtoken:', проксируяdata.token); запросы через ваш сервер, скрывая ключ API и поддерживая централизованную логику обработки запросов.

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

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

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

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

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

    }