Ham*_*ini 5 laravel laravel-sanctum
我全新安装了 Laravel Sanctum API。当我尝试在注册后登录用户或提交注册表两次时,出现异常并显示消息“找不到路线仪表板”。我不明白为什么它试图将用户重定向到“仪表板”路线。我在项目中唯一可以看到“仪表板”的地方是 RouteServiceProvider。这对我来说似乎也是 Sanctum 的一个错误。
你是对的,App\Providers\RouteServiceProvider\RouteServiceProvider::HOMEconst 设置为“/dashboard”。如果您遵循此 const 的用法,您可以看到它被App\Http\Middleware\RedirectIfAuthenticated中间件使用
class RedirectIfAuthenticated {
/**
 * Handle an incoming request.
 *
 * @param  \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response)  $next
 */
public function handle(Request $request, Closure $next, string ...$guards): Response
{
    $guards = empty($guards) ? [null] : $guards;
    foreach ($guards as $guard) {
        if (Auth::guard($guard)->check()) {
            return redirect(RouteServiceProvider::HOME);
        }
    }
    return $next($request);
}
}
Run Code Online (Sandbox Code Playgroud)
该中间件在以下文件中别名为“guest” App\Http\Kernel:
protected $middlewareAliases = [
    'auth' => \App\Http\Middleware\Authenticate::class,
    'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
    'auth.session' => \Illuminate\Session\Middleware\AuthenticateSession::class,
    'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
    'can' => \Illuminate\Auth\Middleware\Authorize::class,
    'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
    'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class,
    'signed' => \App\Http\Middleware\ValidateSignature::class,
    'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
    'verified' => \App\Http\Middleware\EnsureEmailIsVerified::class,
];
Run Code Online (Sandbox Code Playgroud)
该中间件用于由以下定义的未经身份验证的路由routes/auth.php
Route::post('/register', [RegisteredUserController::class, 'store'])
            ->middleware('guest')
            ->name('register');
Route::post('/login', [AuthenticatedSessionController::class, 'store'])
            ->middleware('guest')
            ->name('login');
Route::post('/forgot-password', [PasswordResetLinkController::class, 'store'])
            ->middleware('guest')
            ->name('password.email');
Route::post('/reset-password', [NewPasswordController::class, 'store'])
            ->middleware('guest')
            ->name('password.store');
Run Code Online (Sandbox Code Playgroud)
如果您已经通过身份验证,此内置中间件中间件将尝试将您重定向到主页。我认为 Laravel Breeze 脚手架 (php artisan Breeze:install api) 中存在一个问题,即不提供对中间件中响应类型的检查
App\Http\Middleware\RedirectIfAuthenticated。如果您看到App\Http\Middleware\Authenticate这里的中间件会自动提供一个redirectTo方法来检查预期响应 ( $request->expectsJson()):
class Authenticate extends Middleware
{
    /**
     * Get the path the user should be redirected to when they are not authenticated.
     */
    protected function redirectTo(Request $request): ?string
    {
        return $request->expectsJson() ? null : route('login');
    }
}
Run Code Online (Sandbox Code Playgroud)
TLDR
简而言之,为了App\Http\Middleware\RedirectIfAuthenticated在基于 API 的身份验证中正确使用中间件,您可以在中间件中手动添加以下检查:
foreach ($guards as $guard) {
if (Auth::guard($guard)->check()) {
  if ($request->expectsJson()) {
    return response()->json(['error' => 'Already authenticated.'], 200);
  }
  return redirect(RouteServiceProvider::HOME);
}
}
Run Code Online (Sandbox Code Playgroud)
        |   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           2926 次  |  
        
|   最近记录:  |