Php 在所有api路由中使用web身份验证的Laravel重定向到主页

Php 在所有api路由中使用web身份验证的Laravel重定向到主页,php,laravel,api,authentication,authorization,Php,Laravel,Api,Authentication,Authorization,我想对所有api路由使用web身份验证。我创建了中间件,这就是它的样子 Route::group(['middleware' => ['auth:web'], 'prefix' => 'v1',], function ($router) { Route::apiResource('subscriptions', 'Api\SubscriptionController'); Route::post('subscriptions/{id}/resend', 'Api\Subs

我想对所有api路由使用web身份验证。我创建了中间件,这就是它的样子

Route::group(['middleware' => ['auth:web'], 'prefix' => 'v1',], function ($router) {
   Route::apiResource('subscriptions', 'Api\SubscriptionController');
   Route::post('subscriptions/{id}/resend', 'Api\SubscriptionController@resend')->name('resend');
   Route::post('subscriptions/{id}/grace', 'Api\SubscriptionController@addGrace')->name('grace');
   Route::apiResource('accounts', 'Api\SocialMediaAccountController');
   Route::post('accounts/{id}/reset', 'Api\SocialMediaAccountController@reset');
Route::apiResource('customers', 'Api\CustomerController');
});
当我已经登录并尝试向api路由发出请求时,它会将我重定向到主页。我怎样才能解决这个问题

下面是config/auth.php

 'defaults' => [
    'guard' => 'web',
    'passwords' => 'users',
],
'guards' => [
    'web' => [
        'driver' => 'session',
        'provider' => 'users',
    ],

    'api' => [
        'driver' => 'passport',
        'provider' => 'users',
    ],
],
'providers' => [
    'users' => [
        'driver' => 'eloquent',
        'model' => App\User::class,
    ],

    // 'users' => [
    //     'driver' => 'database',
    //     'table' => 'users',
    // ],
],

如果我已经登录,我不希望api路由被重定向。我只想进行web授权,并继续执行相同的请求。

在Laravel中,web路由和api路由之间有很多区别。最大的区别是默认包含的中间件

您可以在app/Http/Kernel.php中看到中间件组之间的差异:

protected $middlewareGroups = [
    'web' => [
        \App\Http\Middleware\EncryptCookies::class,
        \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
        \Illuminate\Session\Middleware\StartSession::class,
        \Illuminate\Session\Middleware\AuthenticateSession::class,
        \Illuminate\View\Middleware\ShareErrorsFromSession::class,
        \App\Http\Middleware\VerifyCsrfToken::class,
        \Illuminate\Routing\Middleware\SubstituteBindings::class,
    ],

    'api' => [
        'throttle:60,1',
        'bindings',
    ],
API应该是无状态的,因此不会设置cookie和会话。由于api路由不会启动会话,因此您将无法使用经过身份验证的会话


您可以将路由设置为使用“web”组,或者查看关于通过Javascript使用自己的API:。

只需两次更新即可限制API路由,以要求web auth会话发出API请求

  • 将中间件从
    api
    更新为
    web
  • #文件:app/Providers/RouteServiceProvider.php
    受保护的函数mapApiRoutes()
    {
    路由::前缀('api')
    ->中间件('web')#名称空间($this->namespace。“\\API”)
    ->组(base_path('routes/api.php');
    }
    
  • 将中间件从
    auth:api
    更新为
    auth:web
    (或简单地
    auth
  • #routes/api.php
    路由::中间件('auth:web')->get('/user',函数(Request$Request){
    返回$request->user();
    });
    
    我不希望api路由被重定向。我只想进行web授权,然后继续执行相同的请求。
    如果您没有经过身份验证,那么您希望如何执行此操作?这是预期的行为。在访问受保护的路由之前,应先登录。如果您期望其他东西,也许您不应该使用
    auth:web
    中间件。@Devon在web浏览器中打开api/v1/subscription时,我忘了提到我已经登录了。它是get请求,因此它应该列出我的所有订阅,但它将我重定向。@YohanesGultom忘记提到我已经登录。有没有理由不为受保护的api路由使用
    auth:api
    中间件?