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 中验证电子邮件

在 Laravel 中验证没有电子邮件的用户

如何使用 Laravel 5.5 身份验证使电子邮件登录不区分大小写

如何在 JWT API - Laravel 5.8 上验证用户群?