У меня есть двухэтапный процесс при входе пользователя с клиентским приложением на сайт WordPress
1-й шаг: клиентское приложение вызывает URL-адрес API сайта WordPress, создает одноразовый номер и возвращает одноразовый токен приложению.
$nonce = wp_create_nonce("my-action");
2-й шаг: клиентское приложение загружает сайт WordPress, используя веб-представление с GET-запросом, включая одноразовый номер в параметре GET. Затем проверяет одноразовый номер.
wp_verify_nonce( $_GET['token'], 'my-action' );
Я смоделировал это с помощью Postman и настольного браузера. Но одноразовый номер не может быть проверен. Это всегда терпит неудачу.
Это где я создаю nonce
if(username_exists($username)){
$user = get_user_by('login', $username );
$result['status'] = "already_registered";
$token = sha1(date('H:i'));
$result['token'] = $token;
$result['nonce'] = wp_create_nonce("my-action");
return $result;
}
Это где я проверяю nonce …
function userAuth(){
echo $_GET['token'];
$nonce = wp_verify_nonce( $_GET['token'], 'my-action' );
//Do more things based on above verification
}
Есть идеи, что случилось?
У меня была ситуация когда wp_verify_nonce()
на моем живом сервере WP сайт никогда не возвращал true. И в то же время копия сайта (идентичный код) на моем сценическом сервере постоянно подтвердила это.
Проблема была на той же странице с формой, включающей одноразовый номер был открыт дважды (в разных окнах Chrome) с одного и того же живого URL сайта. Вторая копия страницы была открыта намного позже первой (скажем, 15 минут спустя). И я забыл о первом открывающемся (который генерировал другой одноразовый номер как связанный с более ранним временем), пытаясь проверить одноразовый одноразовый номер страницы без успеха.
Причина была wp_verify_nonce()
как-то сравнил младшую страницу с старшей.
То есть wp_create_nonce()
Я повторил на своем бэкэнде, чтобы проверить проблему, дал мне два неидентичных одноразовых номера. Один в скрытом поле формы, которое я отправил через AJAX, и другой в обработчике AJAX моего сервера рядом с wp_verify_nonce()
проверить линию. Кратный Ctrl-F5
+ открытая сеть Chrome Dev Tools с отключенным кешем не имела никакого эффекта. Одноразовые номера были разные.
Как только я закрыл старую страницу и очистил кеш для новой страницы, одноразовый номер подтвердил значение true.
Других решений пока нет …