Пример интеграции Laravel
В этой статье мы рассмотрим, как приможноер реализоватьции авторизациюи через внешний API с использованием Laravel,Laravel. где кКлиент будотправляет номер телефона, получаеть код для авторизации через прокси-сервер, а затакжем проверяеть результат авторизации с регулярными запросами. Мы также опишем,В как выдавать токнцен, после успешной авторизации, пользователь получает токен.
Шаг 1: Настройка маршрутов в Laravel
Для начала нам нужно создать маршруты, которые будут обрабатывать запросы от клиента. Мы создадим три маршрута:
Можете сделать маршруты на усмотрение, ниже приведены примеры.
1.
2.
code_id
. 3.
СоздайтПриме следующиер маршрутыов в файле 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.
- Отправка номера телефона для получения кода авторизации.
- Параллельное отправление запросов для проверки результата авторизации с интервалом в 3 секунды.
- Как только в ответе появится
2.
3. 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. Сервер выдает клиенту токен для дальнейшей работы.