Как аутентифицировать / авторизовать анонимного пользователя на ограниченное время?

Допустим, у меня есть счет-фактура. Счет принадлежит какому-то пользователю (invoices.user_id).

Если пользователь вводит myapp.com/invoices/1, ему необходимо войти в систему, чтобы получить доступ к своему счету. Это нормально.

Иногда invoices.user_id равен нулю (у владельца счета нет учетной записи в нашей системе), но у нас есть столбец invoices.phone_number.

Цель состоит в том, чтобы создать систему аутентификации на основе проверки кода SMS для пользователей, у которых нет учетной записи в нашей системе. Если пользователь подтверждает, что ему действительно принадлежит номер телефона, связанный со счетом (проверка кода), я хочу предоставить ему временный доступ (15 минут) к этой странице сведений о счете (и только к этой странице).

Моя первая идея состояла в том, чтобы использовать токен JWT, хранящийся в сеансе.

Моя вторая идея заключалась в использовании настраиваемого брандмауэра.

Есть ли лучший подход?

Кажется, вы ищете сценарий подписанного URL-адреса. Этот пакет может помочь: github.com/spatie/url-signer

Pubudu Jayawardana 30.07.2018 16:42

К сожалению, по требованиям проверка смс обязательна. Но все равно спасибо, я не знал, что такое URL с подписью!

Kamil Latosinski 30.07.2018 17:14

Мне любопытно узнать, какова здесь цель; для подтверждения того, что аутентифицированный пользователь является тем, кем они себя называют, или для подтверждения того, что они настоящие люди? какие конкретные проблемы вы пытаетесь решить с помощью этого решения?

William Perron 02.08.2018 14:46

@WilliamPerron Я отредактировал вопрос. Должно быть кристально ясно, какова цель!

Kamil Latosinski 02.08.2018 15:23

Вы используете JWT для остальной части вашей аутентификации и авторизации? Мне интересно, почему вы не можете использовать существующий механизм контроля доступа вашего приложения для аутентификации и управления доступом к этой странице. Я хотел сказать, что вместо входа в систему с идентификатором пользователя + пароль, пользователь войдет в систему, используя номер телефона + smscode, а затем вы войдете в систему в течение 15 минут.

so-random-dude 08.08.2018 08:16

@ so-random-dude проблема в том, что во втором случае в таблице пользователей нет пользователя. В некоторых случаях у меня есть только какой-то номер телефона, не связанный с каким-либо конкретным пользователем из таблицы пользователей. Вот почему существующий механизм не подходит. Очевидно, что этот номер телефона есть у какого-то человека, и поэтому я хотел бы предоставить ему доступ, даже если у него нет учетной записи в моей системе.

Kamil Latosinski 08.08.2018 11:50
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
9
6
591
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Создайте kernel.requestслушатель. Таким образом, вы можете действовать до того, как что-либо будет выполнено, и все приложение не обращает внимания на тот факт, что пользователь может выйти из системы в любую минуту.

Вызовите «службу», которая проверит токен. Если токен недействителен, очистите статус аутентификации и переопределите запрос. Например, перенаправьте пользователя на страницу «вам нужно снова заплатить».

Таким образом, вам не нужно изменять какой-либо код, выполнять голосование и т. д., Все ваше приложение может быть защищено.

Что касается самой аутентификации, выберите таможенная охрана, где вы можете полностью контролировать, как будет работать процесс аутентификации.

Хотя я решил это немного иначе, вы наставили меня на правильный путь. Я добавлю свое окончательное решение вопроса. Спасибо!

Kamil Latosinski 09.08.2018 10:10

Рад помочь Камилю.

emix 09.08.2018 10:46

Вы можете аутентифицировать фиктивного пользователя в течение 15 минут, используя следующее действие:

use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
use Symfony\Component\Security\Http\Event\InteractiveLoginEvent;

public function indexAction(Request $request)
{
    $em = $this->getDoctrine()->getManager();

    /**
     * confirm that the user indeed owns 
     * phone number related to the invoice (code verification)
     */

    //create a user for this task only and fetch it
    $user = $em->getRepository(User::class)->find(1);

    //firewall name used for authentication in security.yml
    $firewall = "main_secured_area";

    $token = new UsernamePasswordToken($user, null, $firewall, $user->getRoles());
    $this->get('security.token_storage')->setToken($token);
    $this->get('session')->set("_security_$firewall", serialize($token));

    //$lifetime takes number of seconds to define session timeout 15min = 900sec
    $this->container->get('session')->migrate($destroy = false, $lifetime = 900);

    //fire the login event manually
    $event = new InteractiveLoginEvent($request, $token);
    $this->get("event_dispatcher")->dispatch("security.interactive_login", $event);

    return $this->render('default/index.html.twig');
}

Другие вопросы по теме