2

我目前无法使用护照中间件保护我的路线。我正在使用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' => [
    //
],

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

4

5 回答 5

1

对我来说,问题原来是我的路线格式错误。因此,为了调试,我注释掉了所有现有路由并添加了代码(确保在 .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'
    ]);
});

并且不再抛出错误。

于 2017-06-12T08:41:15.740 回答
0

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

public function __construct(){
    $this->middleware('auth:api');
}
于 2017-04-25T18:27:23.353 回答
0

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

public function __construct(Guard $auth)
{
    $this->auth = $auth;
}
于 2019-03-28T07:46:44.950 回答
0

在您的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它,它不存在)。

于 2017-02-24T06:04:47.257 回答
-1

您所要做的就是在位于 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。

问候

于 2017-05-04T09:11:33.047 回答