Laravel 8:注册后如何验证用户的电子邮件地址而无需登录信息?

时间:2020-10-02 13:10:13

标签: php laravel email-verification laravel-8 jetstream

我使用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');

是否可以在没有登录信息的情况下验证用户的电子邮件地址?

2 个答案:

答案 0 :(得分:0)

有可能。

您可以直接在Jetstream软件包中修改文件,但是我将介绍添加新文件并保持原始软件包不变的方法。

添加新的Controller 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

答案 1 :(得分:0)

打开 config/fortify.php 文件并取消注释 Features::emailVerification(), 行。

'features' => [
    Features::registration(),
    Features::resetPasswords(),
    // Features::emailVerification(),
    Features::updateProfileInformation(),
    Features::updatePasswords(),
    Features::twoFactorAuthentication([
        'confirmPassword' => true,
    ]),
],

接下来转到用户模式并实现MustVerifyEmail接口

class User extends Authenticatable implements MustVerifyEmail{
   use Notifiable;

}

注意:您应该了解Mail in Laravel