Слова "лучше" и "наиболее" здесь, конечно, неприменимы, как и в большинстве связанных с программированием вопросов.
Я на одном из проектов сделал это так:
- Есть таблица token_actions, куда записывается секретный токен, название действия (Enum) и его аргументы в json.
- Действия могуть быть многоразовым и единичными.
- У токена может быть ограничено время жизни.
- Есть классы, каждый из которых обрабатывают конкретное действие, но имеют один интерфейс.
- Среди них есть и класс LogIn, который как раз авторизует пользователя.
- Есть контроллер, который принимает токен и по нему получает действие, создаёт объект его обработчика и выполняет его (для этого и нужен стандартный интерфейс).
- В письма, собственно, вставляются ссылки на обработчик токенов.
- Ну и ещё немного мелкой логики, добавляющей красоты и удобства.
Система получилась очень гибкой (по email можно сделать всё, что можно сделать на сайте - принять заявку в друзья, отправить комментарий со стандартным текстом, открыть форму редактирования чего либо) и безопасной (все важные действия одноразовые и есть проверка по правам доступа, насколько это возможно). А авторизацию по ссылке вы получаете как бонус, потому что каждое действие требует авторизованного пользователя, иначе и токены не нужны были бы.
Вот, я вам даже часть кода подарю:
https://gist.github.com/alexey-m-ukolov/9588dcefc9...