Laravel 8 API 使用 Sanctum 的电子邮件验证流程

Laravel 8 API email verification flow using Sanctum

我目前正在为移动应用制作 API,但我觉得我对电子邮件验证和身份验证的工作方式有点困惑。我正在尝试实施以下流程:

但是,当用户单击电子邮件时 link 会出现“未定义路由登录”错误。 这是有道理的,因为用户当时没有经过身份验证。但是我理解错了吗?

我应该在发送电子邮件之前对用户进行身份验证吗?考虑到我们使用的是 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
}
        

这里有安全隐患吗?我是否应该在用户单击 link 之前或之后随时对用户进行身份验证? 我想尽可能避免呈现“网络视图”。

我认为最好的办法是根据用户的来源实现两种不同的路径。

来自浏览器的用户的常规电子邮件验证

用户将只关注通过电子邮件发送的 link,您可以使用或不使用身份验证(可能使用透明 cookie 身份验证)。如果验证通过,将他们重定向回主页。

来自移动应用程序的移动用户

我会通过电子邮件发送一个 PIN(带有某种过期机制)并要求他们将其放入 APP 中以验证帐户。这甚至可以使用带有验证 API 调用的 JWT 令牌的身份验证中间件来保护。

我没有发现最后一个有任何安全问题。