【问题标题】:Middleware - Call to undefined method Illuminate\Auth\RequestGuard::handle()中间件 - 调用未定义的方法 Illuminate\Auth\RequestGuard::handle()
【发布时间】:2017-07-14 16:03:02
【问题描述】:

我目前无法使用passport middleware 保护我的路线。我正在使用lumen-passport,这是一个使 Passport 与 Lumen 兼容的软件包。当我尝试走以下路线时:

$app->get('/test', 'Game@test')->middleware('auth:api');

我得到以下信息:

FatalThrowableError in AuthManager.php line 294:
Call to undefined method Illuminate\Auth\RequestGuard::handle()
in AuthManager.php line 294
at AuthManager->__call('handle', array(object(Request), object(Closure), 'api')) in Pipeline.php line 148
at Pipeline->Illuminate\Pipeline\{closure}(object(Request))
at call_user_func(object(Closure), object(Request)) in Pipeline.php line 32
at Pipeline->Laravel\Lumen\Routing\{closure}(object(Request)) in Pipeline.php line 102
at Pipeline->then(object(Closure)) in RoutesRequests.php line 780
at Application->sendThroughPipeline(array('auth:api'), object(Closure)) in RoutesRequests.php line 534
at Application->dispatch(null) in RoutesRequests.php line 475
at Application->run() in index.php line 28

如果有帮助,我的auth.php

'defaults' => [
    'guard' => 'api',
    'passwords' => 'users',
],
'guards' => [
    'api' => [
        'driver' => 'passport',
        'provider' => 'users',
    ],
],
'providers' => [
    'users' => [
        'driver' => 'eloquent',
        'model' => \App\User::class
    ]
],
'passwords' => [
    //
],

路由是正确的,因为删除中间件会按预期重定向到适当的控制器。任何帮助将不胜感激。

【问题讨论】:

    标签: lumen laravel-passport


    【解决方案1】:

    在您的 bootstrap/app.php 文件中,您需要确保取消注释 auth 中间件设置。

    https://github.com/laravel/lumen/blob/v5.4.0/bootstrap/app.php#L66-L68:

    // $app->routeMiddleware([
    //     'auth' => App\Http\Middleware\Authenticate::class,
    // ]);
    

    如果auth中间件没有注册,相信Lumen会尝试将auth解析出容器(解析到AuthManager),并会尝试将其视为中间件(调用handle就可以了,不存在)。

    【讨论】:

    • 感谢您的回复。我的$app->routeMiddleware 确实包含'auth' => App\Http\Middleware\Authenticate::class。在Authenticate.phphandle 方法内,每当我将auth 中间件添加到路由时,都会调用一些代码,但我的目标是让Passport auth:api 中间件也能正常工作,因为我需要它来验证传入的访问令牌.不幸的是,尝试附加 middleware->('auth:api') 只会导致我出现上述错误。
    【解决方案2】:

    我不知道你是否解决了你的问题,但我有同样的问题,我解决了它在控制器的构造函数中添加中间件“auth:api”,在我的例子中是 UserController:

    public function __construct(){
        $this->middleware('auth:api');
    }
    

    【讨论】:

      【解决方案3】:

      您所要做的就是在位于 bootstrap 文件夹中的 app.php 中。

      你应该在那里定义护照中间件。

      $app->routeMiddleware([
          'auth' => App\Http\Middleware\Authenticate::class,
          'client_credentials' => \Laravel\Passport\Http\Middleware\CheckClientCredentials::class
      ]);
      

      完成后,您必须将受保护的 url 设置为 client_credentials 中间件。

      完成后,尝试使用令牌向您的受保护路由发出请求,例如返回 Auth::id()。

      您将收到此令牌的用户 ID。

      问候

      【讨论】:

        【解决方案4】:

        对我来说,问题原来是我的路线格式错误。因此,为了调试,我注释掉了所有现有路由并添加了代码(确保在 .env 文件中设置了 APP_KEY=xxx):

        $app->group(['middleware' => 'auth:api'], function($app) {
             $app->get('/user/info', function() {
                 $user = app('auth')->guard()->user();
                 return response()->json($user);
             });
        });
        

        并且路由 /user/info 没有错误。

        然后将我的路线替换为以下格式的现有路线:

        $app->group(['middleware' => 'auth:api'], function($app)
        {
            $app->get('/api/v1/users', [
                'as' => 'listall', 'uses' => 'MyController@listModels'
            ]);
            $app->get('/api/v1/users/{id}', [
                'as' => 'list', 'uses' => 'MyController@listModel'
            ]);
            $app->post('/api/v1/users', [
                'as' => 'create', 'uses' => 'MyController@createModel'
            ]);
            $app->delete('/api/v1/users/{id}', [
                'as' => 'delete', 'uses' => 'MyController@deleteModel'
            ]);
            $app->put('/api/v1/users/{id}', [
                'as' => 'update', 'uses' => 'MyController@updateModel'
            ]);
        });
        

        并且不再抛出错误。

        【讨论】:

          【解决方案5】:

          您必须在 Authenticate.php 中添加此代码

          public function __construct(Guard $auth)
          {
              $this->auth = $auth;
          }
          

          【讨论】:

            猜你喜欢
            • 2018-08-08
            • 2020-04-07
            • 1970-01-01
            • 1970-01-01
            • 2020-01-08
            • 2020-01-24
            • 2020-07-06
            • 2016-06-25
            • 2017-11-06
            相关资源
            最近更新 更多