Быстрая авторизация
Решил организовать на сайте быстрый вход, т.е., пользователь вводит email, а ему на почту приходит письмо типа
https://site/account?token=WKtwIZ8Hw47oWb8-HVMdQ6Xy1fNmMzPOfSVSPfBBGp5YzjgglHK_itZM-VPsF
Как организовать подобную идею?
поможет ли мне в этом wp_set_auth_cookie()?
делаю так
файл function.php
add_shortcode( 'fast_custom_login', 'fast_login' ); function fast_login() { $return = '<hr> <h3>Быстрый вход</h3><form method="post" action="http://localhost:8888/wp-content/themes/twentynineteen-parts/templates/php/signon.php " ><div id="gridForm" class="justify-content-center"> <div class="text-center text-muted mb-4"> <input type="text" name="fastlogin" id="fasrlogin" class="form-control" placeholder="Email" size="20"> </div> <input type="submit" id="resetpass-button" class="btn btn-primary " value="Войти"></form>'; if ( isset( $_REQUEST['errno'] ) ) { $error_codes = explode( ',', $_REQUEST['errno'] ); foreach ( $error_codes as $error_code ) { switch ( $error_code ) { case 'empty_email': $return .= '<span class="badge badge-pill badge-danger">Вы не забыли указать свой email/имя пользователя ?</span>'; break; case 'invalid_email': $return .= '<span class="badge badge-pill badge-danger">На сайте не найдено указанного пользователя.</span>'; break; } } } return $return; }
файл signon.php
<?php require_once ($_SERVER['DOCUMENT_ROOT'] . '/wp-load.php'); require_once ($_SERVER['DOCUMENT_ROOT'] . '/wp-admin/includes/upgrade.php'); global $wpdb; if ( $_SERVER['REQUEST_METHOD'] === 'POST' ) { if ( $_POST['fastlogin'] ) { $resul = $wpdb->get_results(" SELECT ID FROM `wp_users` WHERE `user_email` = '" .$_POST['fastlogin'] . "'"); foreach ($resul as $resul) { nocache_headers(); wp_clear_auth_cookie(); $set_auth = wp_set_auth_cookie($resul->ID); } $login_url = home_url( '/login/' ); $login_url = add_query_arg( 'errno', $set_auth , $login_url ); $to = $_POST['fastlogin']; $subject = 'Быстрый вход'; $message = $login_url; wp_mail( $to, $subject, $message);
после того как нажимаю кнопку, приходит письмо на почту, но без token, так как
wp_set_auth_cookie() срабатывает только после перезагрузки страницы, потом заново отправляю,уже приходит с токеном, но смысла от этого письма уже нет, так как пользователь и так уже авторизован, так вот ,как сделать что бы приходило сразу письмо с токеном, при этом пока пользователь не перейдет по ссылке,он не авторизуется?
Спасибо!
И что он потом всегда будет авторизовываться по ссылке?
Вообще, для таких случаев, делают подтверждения мыла например и ограничивают функционал профиля если мыло не подтверждено ну или не авторизовывать если мыло не подтверждено.
Подтверждение мыла в свою очередь делается примерно так: создается пароль и записывается в метаполе, и отправляется ссылка на почту. При переходе по этой ссылке, сверяется пароль и метаполе удаляется. Так, если метаполе есть, то аккаунт (мыло) не подтверждено.