Laravel 8 API 使用 Sanctum 的电子邮件验证流程
Laravel 8 API email verification flow using Sanctum
我目前正在为移动应用制作 API,但我觉得我对电子邮件验证和身份验证的工作方式有点困惑。我正在尝试实施以下流程:
- 用户在移动应用程序中注册并向 API
发送请求
- Laravel 创建用户并发送电子邮件
- 用户收到电子邮件并点击 link
- Laravel 验证用户并通过 deep-link
将他们重定向到移动应用程序
但是,当用户单击电子邮件时 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 令牌的身份验证中间件来保护。
我没有发现最后一个有任何安全问题。
我目前正在为移动应用制作 API,但我觉得我对电子邮件验证和身份验证的工作方式有点困惑。我正在尝试实施以下流程:
- 用户在移动应用程序中注册并向 API 发送请求
- Laravel 创建用户并发送电子邮件
- 用户收到电子邮件并点击 link
- Laravel 验证用户并通过 deep-link 将他们重定向到移动应用程序
但是,当用户单击电子邮件时 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 令牌的身份验证中间件来保护。
我没有发现最后一个有任何安全问题。