Laravel 8:我如何在注册后验证用户的电子邮件地址而无需提供登录信息?
Posted
技术标签:
【中文标题】Laravel 8:我如何在注册后验证用户的电子邮件地址而无需提供登录信息?【英文标题】:Laravel 8: How do i verify the users email address after registration without having to require login information? 【发布时间】:2021-01-18 03:58:32 【问题描述】:我使用 Jetstream 设置了 Laravel 8 安装并实现了自定义用户注册,在成功创建数据库记录 event(new Registered($user));
后触发事件。
初始注册过程应该不需要密码,因为将来只有选定的一组用户才能登录仪表板。
注册后,用户会收到一封带有验证链接的电子邮件,但他仍然需要登录才能获得验证。
我尝试删除 routes/web.php
中的身份验证中间件,但在尝试验证用户电子邮件地址后收到错误消息。
Route::get('/email/verify/id/hash', function (EmailVerificationRequest $request)
$request->fulfill();
return view('home');
)->middleware(['auth','signed'])->name('verification.verify');
是否可以在没有登录信息的情况下验证用户的电子邮件地址?
【问题讨论】:
【参考方案1】:有可能。
您可以直接在 Jetstream 包中修改文件,但我将介绍添加新文件并保持原始包不变的方法。
添加新的控制器 App\Http\Controllers\VerifyEmailController.php
<?php
namespace App\Http\Controllers;
use Illuminate\Auth\Events\Verified;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use App\Models\User;
class VerifyEmailController extends Controller
public function __invoke(Request $request): RedirectResponse
$user = User::find($request->route('id')); //takes user ID from verification link. Even if somebody would hijack the URL, signature will be fail the request
if ($user->hasVerifiedEmail())
return redirect()->intended(config('fortify.home') . '?verified=1');
if ($user->markEmailAsVerified())
event(new Verified($user));
$message = __('Your email has been verified.');
return redirect('login')->with('status', $message); //if user is already logged in it will redirect to the dashboard page
在 web.php 中添加一个不带auth
中间件的新路由:
use App\Http\Controllers\VerifyEmailController;
...
Route::get('/email/verify/id/hash', [VerifyEmailController::class, '__invoke'])
->middleware(['signed', 'throttle:6,1'])
->name('verification.verify');
最后清除路由缓存:
php artisan route:cache
【讨论】:
感谢您的回答!我可以确认它正在工作 @jsowa 我不禁注意到您没有验证哈希值。原始代码会检查它。【参考方案2】:打开 config/fortify.php 文件并取消注释 Features::emailVerification(),
行。
'features' => [
Features::registration(),
Features::resetPasswords(),
// Features::emailVerification(),
Features::updateProfileInformation(),
Features::updatePasswords(),
Features::twoFactorAuthentication([
'confirmPassword' => true,
]),
],
接下来转到 User modal 并实现 MustVerifyEmail 接口。
class User extends Authenticatable implements MustVerifyEmail
use Notifiable;
注意:你应该了解Mail in Laravel
【讨论】:
此解决方案可能仅在安装了 Fortify 的情况下才有效。作者没有这样说。 注意到了,我的错。感谢您的反馈,我稍后会修复它。以上是关于Laravel 8:我如何在注册后验证用户的电子邮件地址而无需提供登录信息?的主要内容,如果未能解决你的问题,请参考以下文章
验证电子邮件并注册用户后,如何在电子邮件上生成链接后获取令牌?
用户注册后如何在 aws cognito 中自动验证电子邮件。稍后状态后在 Cognito 中验证电子邮件