большая разработка аутентификации

This commit is contained in:
2023-03-02 11:46:14 +10:00
parent 0aae5b6558
commit 687db4e4b1
129 changed files with 2282 additions and 646 deletions

View File

@@ -0,0 +1,203 @@
<?php
declare(strict_types=1);
namespace mirzaev\site\account\controllers;
// Файлы проекта
use mirzaev\site\account\controllers\core,
mirzaev\site\account\controllers\traits\errors,
mirzaev\site\account\models\invite,
mirzaev\site\account\models\account;
// Встроенные библиотеки
use exception;
/**
* Контроллер сессии
*
* @package mirzaev\site\account\controllers
* @author Arsen Mirzaev Tatyano-Muradovich <arsen@mirzaev.sexy>
*/
final class session extends core
{
use errors;
/**
* Записать входной псевдоним
*
* Проверяет существование аккаунта с этим входным псевдонимом
* и запоминает для использования в процессе аутентификации
*
* @param array $parameters Параметры запроса
*
* @return string JSON-документ с запрашиваемыми параметрами
*/
public function login(array $parameters = []): string
{
// Инициализация буфера ответа
$buffer = [];
// Инициализация реестра возвращаемых параметров
$return = explode(',', $parameters['return'], 50);
try {
// Проверка наличия обязательных параметров
if (empty($parameters['login'])) throw new exception('Необходимо передать входной псевдоним');
// Вычисление длины
$length = strlen($parameters['login']);
// Проверка параметров на соответствование требованиям
if ($length === 0) throw new exception('Входной псевдоним не может быть пустым');
if ($length > 100) throw new exception('Входной псевдоним не может быть длиннее 100 символов');
// Поиск аккаунта
$account = account::read($parameters['login'], $this->errors['account']);
// Генерация ответа по запрашиваемым параметрам
foreach ($return as $parameter) match ($parameter) {
'exist' => $buffer['exist'] = isset($account->instance),
'errors' => null,
default => throw new exception("Параметр не найден: $parameter")
};
if ($parameters['remember'] === '1') $this->session->remember('account.identification.login', $parameters['login']);
} catch (exception $e) {
// Запись в журнал ошибок
$this->errors['session'][] = [
'text' => $e->getMessage(),
'file' => $e->getFile(),
'line' => $e->getLine(),
'stack' => $e->getTrace()
];
}
// Запись реестра ошибок в буфер ответа
if (in_array('errors', $return, true)) $buffer['errors'] = self::parse_only_text($this->errors);
// Запись заголовка ответа
header('Content-Type: application/json');
return json_encode($buffer);
}
/**
* Записать пароль
*
* Проверяет на соответствие требованиям
* и запоминает для использования в процессе аутентификации
*
* @param array $parameters Параметры запроса
*
* @return string JSON-документ с запрашиваемыми параметрами
*/
public function password(array $parameters = []): string
{
// Инициализация буфера ответа
$buffer = [];
// Инициализация реестра возвращаемых параметров
$return = explode(',', $parameters['return'], 50);
try {
// Проверка наличия обязательных параметров
if (empty($parameters['password'])) throw new exception('Необходимо передать пароль');
// Вычисление длины
$length = strlen($parameters['password']);
// Проверка параметров на соответствование требованиям
if ($length === 0) throw new exception('Пароль не может быть пустым');
if ($length > 300) throw new exception('Пароль не может быть длиннее 300 символов');
// Генерация ответа по запрашиваемым параметрам
foreach ($return as $parameter) match ($parameter) {
'verify' => $buffer['verify'] = true,
'errors' => null,
default => throw new exception("Параметр не найден: $parameter")
};
if ($parameters['remember'] === '1') throw new exception('Запоминать пароль не безопасно');
} catch (exception $e) {
// Запись в журнал ошибок
$this->errors['session'][] = [
'text' => $e->getMessage(),
'file' => $e->getFile(),
'line' => $e->getLine(),
'stack' => $e->getTrace()
];
// Запись реестра ошибок в буфер ответа
if (in_array('verify', $return, true)) $buffer['verify'] = false;
}
// Запись реестра ошибок в буфер ответа
if (in_array('errors', $return, true)) $buffer['errors'] = self::parse_only_text($this->errors);
// Запись заголовка ответа
header('Content-Type: application/json');
return json_encode($buffer);
}
/**
* Записать код приглашения
*
* Проверяет существование приглашения с этим кодом
* и запоминает для использования в процессе регистрации
*
* @param array $parameters Параметры запроса
*
* @return string JSON-документ с запрашиваемыми параметрами
*/
public function invite(array $parameters = []): string
{
// Инициализация буфера ответа
$buffer = [];
// Инициализация реестра возвращаемых параметров
$return = explode(',', $parameters['return'], 50);
try {
// Проверка наличия обязательных параметров
if (empty($parameters['invite'])) throw new exception('Необходимо передать ключ приглашения');
// Вычисление длины
$length = strlen($parameters['invite']);
// Проверка параметров на соответствование требованиям
if ($length === 0) throw new exception('Получен пустой ключ приглашения');
// Поиск приглашения
$invite = invite::read($parameters['invite'], $this->errors['session']);
// Генерация ответа по запрашиваемым параметрам
foreach ($return as $parameter) match ($parameter) {
'exist' => $buffer['exist'] = isset($invite->instance),
// from временное решение пока не будет разработана система сессий
'from' => $return['from'] = ['login' => 'mirzaev'] ?? $invite->from(),
'errors' => null,
default => throw new exception("Параметр не найден: $parameter")
};
if ($parameters['remember'] === '1') $this->session->remember('account.registration.invite', $parameters['invite']);
} catch (exception $e) {
// Запись в журнал ошибок
$this->errors['session'][] = [
'text' => $e->getMessage(),
'file' => $e->getFile(),
'line' => $e->getLine(),
'stack' => $e->getTrace()
];
}
// Запись реестра ошибок в буфер ответа
if (in_array('errors', $return, true)) $buffer['errors'] = self::parse_only_text($this->errors);
// Запись заголовка ответа
header('Content-Type: application/json');
return json_encode($buffer);
}
}