Laravel fortify使用rest API验证电子邮件

ehxuflar  于 2023-03-09  发布在  其他
关注(0)|答案(1)|浏览(123)

我正在使用fortify进行用户认证和管理。我正在制作一个rest API应用程序,我想使用use Laravel\Fortify\Http\Controllers\VerifyEmailController或实现VerifyEmailResponse,但我得到的是route [login] not defined
我没有/login路由,因为我创建了一个rest API /api/login
下面是我的FortifyServiceProvider的外观

public function register (): void
{
        $this->app->instance(VerifyEmailResponse::class, new class implements VerifyEmailResponse {
            public function toResponse($request)
            {   
                if ($request->user->hasVerifiedEmail()) {
                    return response()->ok(null, __('Email already verified.'));
                }
                
                $request->user->markEmailAsVerified();
                event(new Verified($request->user));
                
                return response()->ok(null, __('Email successfully verified!'));
            }
        });
}

它没有返回我想要的响应,它将我重定向到登录路径。我使用返回正确响应的特定控制器创建了一个工作解决方案。我认为它与Fortify使用的控制器相同

class EmailVerificationController extends Controller
{
    public function __invoke(Request $request)
    {
        $user = User::findOrFail($request->route('id'));

        if ($user->hasVerifiedEmail()) {
            return response()->ok(null, __('Email already verified.'));
        }
        
        $user->markEmailAsVerified();
        event(new Verified($user));
        
        return response()->ok(null, __('Email successfully verified!'));

    }
}

我称之为

Route::get('/email/verify/{id}/{hash}', [EmailVerificationController::class, '__invoke'])->middleware(['signed', 'throttle:6,1'])->name('verification.verify');

有没有可能使用fortify功能或者需要像我做的那样定制?

1qczuiv0

1qczuiv01#

你可以做的一件事是首先忽略fortifyServiceProvider.php中的fortify路由在register方法中,如下所示:

public function register(){
     Fortify::ignoreRoutes();
}

在您fortifier.php中:

'prefix' => 'api',

在你的web.php中你可以创建一个路由并调用fortify控制器:

Route::get('api/email/verify/{id}/{hash}', [\Laravel\Fortify\Http\Controllers\EmailVerificationNotificationController::class, 'store'])->middleware(['signed', 'throttle:6,1'])->name('verification.verify');

或者如果你愿意,你可以创建一个控制器,并从Fortify控制器扩展它。我想出了这个解决方案。我希望它对你有帮助。请让我知道这是否会解决你的问题或没有。

相关问题