将自定义中间件添加到Laravel Passport端点

fat*_*gic 7 php middleware routes laravel laravel-passport

我在5.4上有一个标准的Laravel Passport设置 - 它一切正常并且正在生成令牌.

我使用auth:api中间件以及自定义中间件来保护我的API路由,该中间件在处理任何请求之前检查请求中的特定标头是否存在且有效.此中间件适用于API路由组.

有没有办法将laravel'.../oauth/token'生成的Passport路由包装在这个中间件中?

目前我已经在我的AuthServiceProvider.php boot()方法中设置了路由:

public function boot()
{
    $this->registerPolicies();

    // Passport/OAuth
    Passport::routes(function ($router) {
      $router->forAccessTokens();
      $router->forTransientTokens();
    });

    Passport::tokensExpireIn(Carbon::now()->addDays(7));

    Passport::refreshTokensExpireIn(Carbon::now()->addDays(30));
}
Run Code Online (Sandbox Code Playgroud)

最终目标是,如果标头不存在,oauth端点将返回错误.

小智 9

您可以尝试以下操作:转到app/Providers/AuthServiceProvider并查找function boot()。在此功能中,您将看到用于注册护照路线的行。默认代码是Passport::routes()。此routes()方法接受options数组作为第二个参数。您可以使用它来设置Passport路由的中间件。

Passport::routes(null, ['middleware' => 'api']);
Run Code Online (Sandbox Code Playgroud)


Var*_*rin 6

例如,如果您只需要向一个 Passport 路由添加中间件/oauth/token,您可以这样做:

  1. 通过输入查找您需要的路线php artisan r:l
  2. 检查用于此路线的控制器和方法,在示例中它将是AccessTokenController@issueToken
  3. 创建扩展AccessTokenController的控制器,可以留空
namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Laravel\Passport\Http\Controllers\AccessTokenController;

class ApiTokenController extends AccessTokenController
{

}
Run Code Online (Sandbox Code Playgroud)
  1. 然后创建到该控制器和方法的路由(因为该控制器继承了所有父控制器方法):

Route::middleware('MyMiddleware')->post('/api-token', 'ApiTokenController@issueToken');


Mar*_*ner 5

app/Providers/AuthServiceProvider包括路由门面加在上面这种使用声明的地方:

use Illuminate\Support\Facades\Route;
Run Code Online (Sandbox Code Playgroud)

然后在boot()方法上,将 Passport::routes() 放在 Route::group() 中,如下所示:

Route::group(['middleware'=>'MyFunkyCustomMiddleware'], function(){
    Passport::routes(); // <-- Replace this with your own version
});
Run Code Online (Sandbox Code Playgroud)

希望有帮助!