3

我使用 Jetstream 设置了 Laravel 8 安装并实现了自定义用户注册,在成功创建数据库记录后触发事件event(new Registered($user));

初始注册过程还不需要密码,因为将来只有一组选定的用户才能登录仪表板。

注册后,用户会收到一封带有验证链接的电子邮件,但是他仍然需要登录才能获得验证。

我试图删除 auth 中间件routes/web.php,但是在尝试验证用户电子邮件地址后收到错误消息。

Route::get('/email/verify/{id}/{hash}', function (EmailVerificationRequest $request) {
  $request->fulfill();
  return view('home');
})->middleware(['auth','signed'])->name('verification.verify');

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

4

2 回答 2

2

有可能的。

您可以直接在 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
于 2020-11-11T00:19:38.880 回答
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;

}

注意:你应该对Laravel 中的邮件有所了解

于 2021-02-12T08:02:20.300 回答