Я исследовал потоки внутри и снаружи SO, но ничего не решило проблему.
Справочная информация: Создание небольшой системы входа в систему с PHP, Wordpress и ACF (расширенные настраиваемые поля).При сохранении сообщения, содержащего пароль, пароль хэшируется, а значение заменяется в базе данных.Пока все хорошо (насколько я могу судить).Когда пользователь заходит на страницу входа в систему, отправляет попытку пароля, php-файл проверки вызывает API-интерфейс Wordpress, извлекает PW с сохраненным хэшем и затем запускает password_verify.Каждый раз, когда он запускается, он возвращает false.Код ниже ...
$pw_submit = $_POST['pw-submit'];
//Call WP API
$urlPrefix = isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off' ?
'https' : 'http';
$siteURL = $urlPrefix . "://" . $_SERVER['SERVER_NAME'];
function callAPI($method, $url, $data){
$curl = curl_init();
$url = sprintf("%s?%s", $url, http_build_query($data));
// OPTIONS:
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-Type:
application/json'));
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
// EXECUTE:
$result = curl_exec($curl);
if(!$result){die("Connection Failure");}
curl_close($curl);
return $result;
}
$get_data = callAPI('GET', $siteURL . '/wp-json/acf/v3/pages/25', false);
$response = json_decode($get_data, true);
$db_password = $response[acf][portal_password];
if( password_verify( $pw_submit, $db_password) ){
echo "Well that worked";
}
else{
echo "No it didn't";
}
Даже если я скопирую / вставлю хешированный пароль и попытаюсь подтвердить, он все равно возвращает ложь ...
$hash = '$2y$10$2/PuBIYuhEJ69fSc2/ae.OOVr4nMrpKu.9ahRm90TuSBu0EJulWki';
$verify = password_verify('foobar', $hash);
var_dump($verify);
... он возвращаетbool (false).
ЕДИНСТВЕННЫЙ способ, когда password_verify когда-либо возвращает true, - это если я создаю хешированный пароль и проверяю его сразу же.Итак, в скрипте проверки ...
$pw_hash = password_hash('foobar', PASSWORD_DEFAULT);
$verify = password_verify('foobar', $pw_hash);
var_dump($verify); // Returns TRUE
Я проверил базу данных и убедился, что ячейка таблицы содержит весь хэш (когда я var_dump извлекаю значение, я получаю строку из 60 символов).Я удостоверился, что нет никаких пробелов до / после с помощью trim ().Я пытался заменить содержащие двойные кавычки, содержащие хеш-строку, одинарными кавычками.Я понятия не имею, что отсутствует / идет не так.Любая помощь / руководство с благодарностью.Спасибо!
ОБНОВЛЕНИЕ Итак, ошибка в том, что я забыл обновить переменную при исправлении предыдущей проблемы.Для тех, кто может наткнуться на это, первоначальная проблема заключалась в том, что Wordpress дважды запускал мой скрипт хэширования, что приводило к хэшированию первого хешированного пароля.Поэтому всегда проверяйте, что на самом деле делает WordPress.Кроме того, одна вещь, с которой я столкнулся, заключалась в использовании ACF get_field () для получения нехэшированного пароля, но поскольку я использовал фильтр wp_insert_post_data (), я фактически получал старое / текущее значение вместо того, чтобы получить новый / вводимый пароль.Исправлено с помощью фильтра 'acf / save_post'.Спасибо всем за помощь!