Вопрос или проблема
Я искал способ аутентификации пользователей без необходимости загружать WordPress каждый раз. Проще говоря, я создаю приложения, которые не используют веб-киты никакого рода, поэтому, когда WordPress отправляет куки WordPress_logged_in, я сохраняю эту куки в виде строки и вручную отправляю ее обратно на свой сайт.
С одной стороны, я использую WordPress как обычный сайт и пишу плагины, которые взаимодействуют с таблицами WordPress и с моими собственными таблицами. Все это довольно стандартно… но я также хочу получить прямой доступ к базе данных, чтобы использовать его в реальном времени, так как приложения могут обращаться к базе данных в любое время по любой причине, и, очевидно, вы не хотите загружать WordPress каждый раз, когда хотите сделать что-то, не имеющее отношения к сайту…
Мне удалось понять, как аутентифицировать пользователя по имени пользователя и паролю, не загружая WordPress, но это сгенерирует куки, и именно ее я хочу использовать с этого момента. Я абсолютно не хочу отправлять имя пользователя и пароль для каждого действия, которое я выполняю в базе данных, поэтому мне нужно знать, как проверить куки WordPress_logged_in, не загружая WordPress.
Здесь я нашел идеальное решение своей проблемы! Это 100% идеально для моих нужд!
Есть ли способ использовать пользователей WordPress, но без загрузки всего ядра WordPress?
Вкратце: войдите в систему с помощью WordPress, как обычно, затем сгенерируйте свою собственную куки и используйте ЕЁ для аутентификации пользователя. Если эта куки сработает, то вы знаете, что пользователь уже прошел аутентификацию через WordPress, так что просто используйте этого пользователя… К сожалению, этот пост оставляет меня с одним вопросом, на который я не могу ответить…
В нем сказано использовать (если это ваши куки):
key: wordpress_logged_in_1234567890abcdef1234567890abcdef
value: admin|1234567890|abcdef1234567890abcdef1234567890
чтобы сгенерировать значение ваших куки следующим образом:
$key = ... // ключ из куки WP
$value = ... // значение из куки WP
$hash = hash_hmac ( 'md5' , $key.$value , 'некоторый секретный ключ' );
Все это имеет смысл с точки зрения того, как я буду использовать это позже для аутентификации моей куки MYCOOKIE по отношению к куки wordpress_logged_in, но то, что я не понимаю, это КАК я на самом деле получаю значения $key и $value, которые я использую, когда генерирую свои куки.
WordPress генерирует имя куки с добавленным к нему хэш-значением и сразу же отправляет его. Если бы это была обычная веб-страница, я мог бы позже получить значение из массива _COOKIE, но мне нужно это имя куки и значение СЕЙЧАС, то есть сразу после его генерации, чтобы я мог сгенерировать свою сопутствующую куки для отправки вместе с ней… есть ли фильтр или функция или что-то еще, что я могу вызвать, чтобы узнать имя и значение куки, который только что был установлен?
Спасибо
Не могу поверить, что я действительно смог найти этот ответ сам!!! 😀
На случай, если кто-то еще когда-либо будет любопытен по этому поводу:
Имя куки определяется в константе LOGGED_IN_COOKIE. Чтобы получить его значение, просто настройте действие следующим образом:
add_action( 'set_logged_in_cookie', 'action_set_logged_in_cookie', 10, 5 );
function action_set_logged_in_cookie( $logged_in_cookie, $expire, $expiration, $user_id, $logged_in )
$logged_in_cookie — это значение. Таким образом, чтобы ответить на свой вопрос, я должен сделать:
$hash = hash_hmac ( 'md5' , LOGGED_IN_COOKIE . $logged_in_cookie , 'некоторый секретный ключ' );
Ответ или решение
Ваш запрос на аутентификацию пользователей без загрузки кодовой базы WordPress поднимает несколько важных вопросов, связанных как с безопасностью, так и с производительностью. Давайте подробно рассмотрим, как можно реализовать эту задачу, используя существующие расширения WordPress, но без необходимости каждый раз загружать полноценный фреймворк WordPress.
1. Понимание структуры cookie WordPress
Каждый раз, когда пользователь аутентифицируется через WordPress, создается cookie wordpress_logged_in
, который используется для идентификации пользователя на сайте. Данный cookie включает в себя:
- Ключ, который формируется на основе сайта.
- Значение, которое содержит информацию о пользователе и время аутентификации.
2. Доступ к информации о cookie
Как вы уже заметили, для работы с cookie нужно знать как имя, так и значение cookie, которое устанавливается WordPress. Имя cookie хранятся в константе LOGGED_IN_COOKIE
, что дает нам ясное понимание его структуры.
3. Реализация функции для получения cookie
В WordPress можно использовать хуки для выполнения кода в момент создания cookie. Ваша задача—это зарегистрировать обработчик, который будет извлекать значение cookie в момент его установки:
add_action('set_logged_in_cookie', 'action_set_logged_in_cookie', 10, 5);
function action_set_logged_in_cookie($logged_in_cookie, $expire, $expiration, $user_id, $logged_in) {
// Здесь вы можете сохранить или обрабатывать значение $logged_in_cookie
}
Вы можете добавить этот код в файл вашего плагина или даже в файл functions.php
вашей темы.
4. Генерация вашего собственного cookie
После того как вы получили значение WordPress cookie, следующим шагом будет создание вашего собственного cookie, который будет служить для аутентификации. Как только вы знаете logged_in_cookie
, вы можете создать следующий код для генерации вашего cookie:
$my_cookie_key = 'MY_COOKIE';
$my_cookie_value = 'your_value';
$hash = hash_hmac('md5', LOGGED_IN_COOKIE . $logged_in_cookie, 'your_secret_key');
// Установите ваш cookie
setcookie($my_cookie_key, $my_cookie_value . '|' . $hash, time() + 3600, '/');
Здесь your_secret_key
должен быть уникальным и конфиденциальным для вашего приложения.
5. Проверка пользовательского cookie
Для безопасности следует также реализовать проверку вашего собственного cookie на серверной стороне. Это позволит убедиться, что доступ к базе данных осуществляется только авторизованными пользователями:
if(isset($_COOKIE[$my_cookie_key])) {
list($value, $hash) = explode('|', $_COOKIE[$my_cookie_key]);
// Проверка хеша
if(hash_equals($hash, hash_hmac('md5', LOGGED_IN_COOKIE . $logged_in_cookie, 'your_secret_key'))) {
// Пользователь аутентифицирован, можно выполнять дальнейшие действия
} else {
// Ошибка: cookie недействительно
}
}
Заключение
Выразив свои мысли, данное решение позволяет создать более легковесную и эффективную архитектуру аутентификации, позволяя использовать мощь WordPress, не перегружая систему излишними вызовами. Используя вышеописанные методы, вы сможете безопасно манипулировать данными пользователей в реальном времени, при этом сохранять высокую производительность вашего приложения.