Функция входа в систему — это базовая функция для каждой динамической системы. Она используется для различения идентификаторов пользователей, соответствующих разрешений и информации. Особенно важно разработать безопасную схему входа. Далее я представлю общие механизмы аутентификации.
HTTP — протокол без сохранения состояния,Каждый раз, когда клиент отправляет запрос,Сначала установите соединение с сервером,существовать После выполнения запроса соединение будет разорвано.。система Авторизоватьсяиз Суть в том,Подтвердите легитимность и личность пользователя。
существовать B/S В системе функция входа обычно основана на Cookie
добиться. Когда пользователь успешно входит в систему, статус входа обычно записывается в Session
середина.Для реализации связи сервер-клиентиз Авторизоваться Информация проверена,нуждатьсясуществовать Клиент сохраняет некоторую информацию(SessionId)
,И требовать, чтобы клиент нес их в каждом запросе. существовать При таком сценарии,использовать Cookie
Это, несомненно, наиболее удобно, поэтому мы обычно используем Session
из Id сохранить в Cookie
, когда сервер получает запрос, он проходит проверку Cookie
из информации для определения того, авторизован ли пользователь 。
1. Доступ пользователя www.stark.com/login
,и введите пароль Авторизоваться.
2. После того, как сервер проверит правильность пароля, он создаст SessionId
,и сохраните его.
3. Сервер на это отвечает HTTP запроси и передай Set-Cookie информация заголовка, будет SessionId
писать Cookie
середина.
После получения файла cookie вы сможете получить к нему прямой доступ позже.
1. Доступ пользователя www.stark.com/console
страницу, она автоматически откроется при первом запуске Авторизоваться писатьиз Cookie
。
2. Сравнение на стороне сервера Cookie
серединаиз SessionId
и сохранить существование на стороне сервера из SessionId
Последовательно ли это?
3. Если они совпадают, аутентификация прошла успешно и доступ к странице открыт; если она недействительна, пользователю необходимо снова войти в систему;
Следует отметить, что: Cookie + Session
изплансередина Самый критическийиз Главное – передать дальшеCookie
иногда ты можешь столкнутьсяCookie
Запрещатьиз Состояние,Помните, только что положилCookie
из Значение передается на сервер для полученияSessionId
Вот и все,Можно хранитьсуществоватьLocalStorage
,ХОРОШОиспользоватьURL передача в режиме GET.
Cookie + Session
изосновная точкасуществоватьв данныхиз Шифрование и дешифрованиеизалгоритм,существоватьпользователь Авторизоваться Шифровать、генерироватьCookie
,существует несет заголовок существования из информационного заголовка середина при взаимодействии.
Код функции шифрования:
function passportEncrypt($txt, $key = 'stark-server@2024@#$!'): string
{
$txt = 'уу-Йицзяи-' . time() . '-' . $txt;
srand((double)microtime() * 1000000);
$encrypt_key = md5(rand(0, 32000));
// инициализация переменной
$ctr = 0;
$tmp = '';
for ($i = 0; $i < strlen($txt); $i++) {
$ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
$tmp .= $encrypt_key[$ctr] . ($txt[$i] ^ $encrypt_key[$ctr++]);
}
return base64_encode(passportKey($tmp, $key));
}
function passportKey($txt, $encrypt_key): string
{
$encrypt_key = md5($encrypt_key);
$ctr = 0;
$tmp = '';
for ($i = 0; $i < strlen($txt); $i++) {
$ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
$tmp .= $txt[$i] ^ $encrypt_key[$ctr++];
}
return $tmp;
}
Функция расшифровки строки:
function passportDecrypt($txt, $key = 'stark-server@2024@#$!')
{
$txt = str_replace(' ', '+', $txt);
$txt = passportKey(base64_decode($txt), $key);
$tmp = '';
for ($i = 0; $i < strlen($txt); $i++) {
if (!isset($txt[$i]) || !isset($txt[$i + 1])) {
return 0;
} else {
$tmp .= $txt[$i] ^ $txt[++$i];
}
}
$tmp = explode('-', $tmp);
$tmp[3] = $tmp[3] ?? 0;
return $tmp[3];
}
Конкретная логика реализации шифрования и дешифрования:
//шифрование
$data = [
'admin_id' => $adminInfo['admin_id'],
'admin_name' => $adminInfo['admin_name'],
];
$demoStr = json_encode($data,JSON_UNESCAPED_UNICODE);
$authorization = passportEncrypt($demoStr);
Cookie::set('Auth-stark', $authorization,
['prefix' => 'think', 'expire' => 3600]
);
//Расшифровать
$json = passportDecrypt($authorization);
if(mb_strlen($json) > 0){
$demoData = json_decode($json,true);
}
Поскольку серверу необходимо подключаться к большому количеству клиентов, на нем также необходимо хранить большое количество клиентов. SessionId
,Это вызовет чрезмерную нагрузку на сервер.、неизбежный CSRF
Атаки и другие недостатки, которые мы можем использовать Token
из Авторизоваться Способ。
Token
дачерез сервергенерироватьизстрока,Запросить токен в качестве клиента. После первого раза Авторизоваться,Сервер будетгенерироватьодин Token
И вернуть клиенту, когда клиент придет в дальнейшем, ему останется только это принести. Token Вот и все Полная проверка личности,много компанийиспользоватьJWT
изтехнология Авторизоватьсяпроверять Способ。
1. Доступ пользователя www.stark.com/login
,Введите пароль учетной записи,и нажмите Авторизоваться。
2. Сервер проверяет правильность пароля учетной записи и создает Token
。
3. Серверная часть будет Token
Возвращаясь клиенту, клиент сохраняет существующую информацию заголовка.
1. Доступ пользователя www.stark.com/login
Получите из, когда принесете свой первый Авторизоваться Token
。
2. Сервер проверяет Token
,Если он действителен, аутентификация прошла успешно.,Если он недействителен, он будет отправлен обратно в из Авторизоваться.
Самый распространенный из Метод генерации токенадаиспользовать JWT(Json Web Token)
,Это краткий, автономный метод.,используется для связи между двумя сторонами JSON Объекты формы безопасности передают информацию.
Ответ на самом деле заключается в том, что токен существует, на самом деле токен — это не набор беспорядочных строк, а строка строк, склеенных и объединенных с помощью различных алгоритмов.
JWT Алгоритм в основном делится на 3 части:header
(информация заголовка),playload
(тело сообщения),signature
(знак)。
header
Частично уточняет JWT сипользоватьиз алгоритма подписи;playload
Частично указано JWT из намерения;signature
часть JWT из подписи, главным образом, чтобы позволить JWT
Его нельзя изменить по своему желанию.Compose Установить Jwt из двух способов: myuseiz — это версия 6.10. :
## Установить
composer require firebase/php-jwt 6.10
использовать composer.json Установить,Присоединиться к файлу,использоватьcomposer install
"require": {
"firebase/php-jwt": "^6.10"
}
Jwt в основном выполняет шифрование и дешифрование.,$payload
определениеиздатынуждатьсяхранилищеиз Информация о массиве:
public static function encode(int $adminId = 0): string
{
$redis = new Redis(config('cache.stores.redis'));
$secretKey = Env::get("JWT.key"); // Получите JWT для генерации подписи и ключа.
$alg = Env::get("JWT.alg"); // Получить алгоритм шифрования JWT
$payload = [
'admin_id' => $adminId, // Сохранить идентификатор пользователя
'exp' => time() + Env::get("JWT.exp"), // Установить срок годности
];
$jwt = JWT::encode($payload, $secretKey, $alg); // Создать токен JWT
$token = config('prefix.auth');
$redis->set($token.$adminId, $jwt,Env::get("JWT.exp") - rand(10,99));
return $jwt;
}
Расшифруйте логику:
public static function decode(string $AccessToken = ''){
$secretKey = Env::get("JWT.key"); // Получите JWT для генерации подписи и ключа.
$alg = Env::get("JWT.alg"); // Получить алгоритм шифрования JWT
$secretKeyObj = new Key($secretKey,$alg);
$headers = new stdClass();
return JWT::decode($AccessToken, $secretKeyObj,$headers); // использоватьJWTРасшифроватьToken
}