Пример интеграции 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. Заосавка номера телефона для получения кода.
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, проверяять статус авторизации, отправляя запросы на /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.
- Клиент отправляет номер телефона через прокси-метод
/proxy/auth/code
. - Клиент запрашивает результат авторизации через
/proxy/auth/result
, передаваяcode_id
. - Как только авторизация завершена (
- Сервер выдает клиенту токен для дальнейше
гй работы.
2. Параллельно, каждые 3 секунды, к
3. auth: true
), клиент вызывает метод завершения авторизации /proxy/auth/complete
.
4.