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



我目前正在制作一个移动应用程序的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
}

这里有安全风险吗?我是否应该在用户点击链接之前或之后对其进行身份验证?我想避免渲染"网页视图"。尽可能多。

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

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

用户将遵循通过电子邮件传递的链接,您可以在有或没有身份验证的情况下这样做(可能使用透明cookie身份验证)。如果验证完成,则将它们重定向回主页。

来自移动应用的移动用户

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

我不认为最后一个有任何安全问题。

最新更新