Поток проверки электронной почты Laravel 8 API с использованием Sanctum

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

  • Пользователь регистрируется в мобильном приложении и оно отправляет запрос в API
  • Laravel создает пользователя и отправляет электронное письмо
  • Пользователь получает электронное письмо и нажимает на ссылку
  • Laravel проверяет пользователя и перенаправляет его в мобильное приложение по глубокой ссылке.

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

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

В настоящее время это то, что я делаю:

// web.php

Route::get('/email/verify/{id}/{hash}', [EmailVerificationController::class, 'verify'])
    ->middleware('signed') //note that I don't use the auth or auth:sanctum middlewares
    ->name('verification.verify');
// EmailVerificationController.php

public function verify(Request $request)
{
    $user = User::findOrFail($request->id);

    if ($user->email_verified_at) {
        return '';
    }

    if ($user->markEmailAsVerified()) {
        event(new Verified($user));
    }

    return redirect()->away('app://open'); // The deep link
}
        

Есть ли здесь угроза безопасности? Должен ли я в любой момент аутентифицировать пользователя до или после перехода по ссылке? Я хотел максимально избежать рендеринга веб-представлений.


person Deegriz    schedule 23.01.2021    source источник
comment
Почему бы вам не отправить PIN-код пользователю по электронной почте, чтобы он был вставлен в приложение? Таким образом, вам вообще не нужны веб-просмотры.   -  person Wanny Miarelli    schedule 24.01.2021
comment
@WannyMiarelli На самом деле это хорошая идея. Но я бы предпочел все же попытаться понять, что именно здесь происходит. Тем не менее, я буду иметь в виду идею с PIN-кодом!   -  person Deegriz    schedule 24.01.2021
comment
Я воспроизвел ваш код и могу завершить проверку без какой-либо проверки подлинности. Если вас перенаправляет на страницу входа (маршрут входа не определен), это означает, что где-то этот маршрут подхватывается фильтром авторизации. Трудно сказать, откуда вы извлекли код (может быть, какое-то глобальное промежуточное ПО?). Теоретически вы должны аутентифицировать использование перед проверкой электронной почты, но я не вижу проблем с безопасностью в обратном.   -  person Wanny Miarelli    schedule 24.01.2021
comment
@WannyMiarelli, это моя ошибка, я не дал понять, что это произошло до, я написал этот код в примере и удалил промежуточное программное обеспечение аутентификации (если у кого-то есть права на редактирование, исправьте это) . То, что я там сделал, было именно обходом аутентификации, и я хотел знать, все ли в порядке. Получается не совсем нормально, если бы не тот факт, что я не проверяю хэш. Я закончил тем, что пошел с маршрутом PIN. Однако позже я также захочу, чтобы пользователи входили в систему через веб-приложение, поэтому мне придется решить, как в этом случае отправлять обычное электронное письмо с подтверждением.   -  person Deegriz    schedule 24.01.2021
comment
Я думаю, что это так же просто, как проверить источник. Если пользователь приходит из мобильного приложения, вы запускаете проверку PIN-кода, в противном случае запускается обычное электронное письмо.   -  person Wanny Miarelli    schedule 24.01.2021
comment
Я тоже так считаю. Идите вперед и создайте своего рода ответ, я хочу получить вам заслуженную репутацию :)   -  person Deegriz    schedule 24.01.2021


Ответы (1)


Я думаю, что лучший способ - реализовать два разных пути на основе источника пользователя.

Регулярная проверка электронной почты для пользователей, приходящих из браузера

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

Мобильные пользователи, приходящие из мобильного приложения

Я бы отправил PIN-код (с каким-то механизмом истечения срока действия) по электронной почте и попросил их поместить его в приложение для проверки учетной записи. Это можно даже защитить с помощью промежуточного программного обеспечения аутентификации, используя токен JWT с вызовом API проверки.

Я не вижу никаких проблем с безопасностью в этом последнем.

person Wanny Miarelli    schedule 24.01.2021