当我尝试访问 Laravel API 中的端点时,Jetstream 重定向到
dashboard
页面。我已经登录,当我从仪表板转到端点时,它会返回到仪表板。我在没有 Jetstream 的情况下制作了应用程序,然后创建了一个新项目并将代码复制到其中(控制器、模型、策略等)。我使用的是 Laravel 10 和 Jetstream 4。这是我的 web.php:
Route::get('/', function () {
return view('welcome');
});
Route::middleware([
'auth:sanctum',
config('jetstream.auth_session'),
'verified',
])->group(function () {
Route::get('/dashboard', function () {
return view('dashboard');
})->name('dashboard');
});
api.php(我正在尝试访问
assets
路线)
Route::middleware('auth:sanctum')->get('/user', function (Request $request) {
return $request->user();
});
Route::group(['namespace' => '\App\Http\Controllers\Api', 'middleware' => 'auth:sanctum', config('jetstream.auth_session'),
'verified',], function() {
Route::apiResource('users', UserController::class)->names('users');
Route::apiResource('assets', AssetController::class)->names('assets');
Route::apiResource('events', EventController::class)->names('events');
Route::post('assets/bulk', ['uses' => 'App\Http\Controllers\Api\AssetController@bulkStore']);
});
我添加了
config('jetstream.auth_session')
部分,因为它用在web.php
中。好像没啥区别。
这是页面的一部分,其中包含我尝试单击的链接(
resources/views/navigation-menu.blade.php
)
<!-- Navigation Links -->
<div class="hidden space-x-8 sm:-my-px sm:ms-10 sm:flex">
<x-nav-link href="{{ route('dashboard') }}" :active="request()->routeIs('dashboard')">
{{ __('Dashboard') }}
</x-nav-link>
</div>
<div class="hidden space-x-8 sm:-my-px sm:ms-10 sm:flex">
<x-nav-link href="{{ route('assets') }}" :active="request()->routeIs('assets')">
{{ __('Assets') }}
</x-nav-link>
</div>
</div>
我不知道还有哪些其他文件与此问题相关。我对 Laravel 没有太多经验,这是我第一次使用 Jetstream。我读了一篇关于如何重定向到不同路线的文章,但我不想这样做。 如何让它在不重定向的情况下转到我的 API 端点?
我尝试单击
dashboard
路线导航菜单中的“资产”链接。我原以为它会显示一个空白页面,但它只是重定向回仪表板。我还尝试了 php artisan route:clear
并在 Chrome 中执行 Empty Cache and Hard Reload
,但我得到了相同的结果。我的开发者工具的网络选项卡如下所示:
您的
api.php
中的中间件配置不正确。您添加了 config('jetstream.auth_session'), 'verified'
作为数组上传递到 Route::group()
的附加项目,但您需要将它们添加为中间件数组上设置的项目:
Route::group(['namespace' => '\App\Http\Controllers\Api', 'middleware' => ['auth:sanctum', config('jetstream.auth_session'), 'verified']], function() {
//
}
由于您的 auth 中间件定义不正确,当您尝试访问
assets
路由时,它无法确定您已登录,因此会将您重定向到登录。但是,当您点击登录路线时,它可以确定您已经登录,因此会将您重定向到仪表板路线。
综上所述,我认为您可能试图在这里解决错误的问题。您的 api 路由就是这样的,即由 api 命中并通过 api 令牌(或某种其他类型的 api 身份验证方法)访问的路由。即使您确实更正了中间件定义,我也不确定这是否真的有效,因为 api 路由未设置为了解会话,因此身份验证会话中间件仍然无法授予对 api 路由的访问权限。
如果您需要将
assets
路由作为网站的一部分,则应在 web.php
路由文件中定义它。这将为您提供一个可通过 Web 访问的 assets
路线和一个可通过 api 访问的 assets
路线。理想情况下,这些路线将由它们自己的单独控制器处理。如果存在处理路由的共享逻辑,则应提取该共享逻辑并由每个单独的控制器调用。