Задать вопрос
@evgen9586
Backend-dev. Лублу Enterprise и не люблю понты)

Так ли делать подтверждение письма в течении двух часов?

Суть в чём, клиенту высылают письмо и ему нужно его подтвердить.

Чтобы подтвердить  <a href="http://med.maz.by/site/confim?secretkey=<?=$secretkey;?>">нажмите здесь.</a>


Где secretkey
$secretkey = Yii::$app->security->hashData($id, '8036121');


В Action просто получаю ID заказа с помощью validateData и меняю статус на 1.

Но сейчас проблема в том что клиент может подтвердить и через 8 часов и через 12.

А нужно чтобы допустим в течение двух часов с отправки ему письма.

Как я понимаю в письме get-параметром нужно отправлять текущую дату.

А потом уже при подтверждении проверять разницу между временем когда он подтверждает и временем которое летит get-ом и если допустим больше двух часов, то выводить другую вьюху что истекло время подтверждения.

Или есть другие варианты?
  • Вопрос задан
  • 87 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
kimono
@kimono
Web developer
$token = Yii::$app->security->hashData(time().'|'.$id, 'secret-key');


$data = Yii::$app->security->validateData($token, 'secret-key');
try {
  list($time, $id) = explode('|', $data);
  $model = MyModel::findOne($id);
  if (null === $model || time() > $time + 2 * 3600) {
    throw new Exception();
  }
}
catch (Exception $e) {
  echo 'Token invalid';
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
qonand
@qonand
Software Engineer
1. Генерируете secretKey и сохраняете его вместе с датой и временем генерации
2. Отправляете письмо с ссылкой клиенту
3. Когда клиент переходит по ссылке - проверяете есть ли указанный secretKey и не истекла ли его дата.
4. В зависимости от результата проверке отображаете нужную страницу
Ответ написан
Комментировать
webinar
@webinar Куратор тега Yii
Учим yii: https://youtu.be/-WRMlGHLgRg
Не вижу смысла засорять базу. Надо формировать ссылку с id, временем и токеном для проверки
$secret = 'some string';
$i = $model->id;
$time = strtotime('now');
$token = md5($i.$time.$secret);
$url = Url::toRoute([
      'controller/action', 
      'i' => $id,
      't' => $time,
      's' => $token,
]);

и при обращении по такой ссылке - проверяем токен, если токен валидный, проверяем переданное время и т.д.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы