【问题标题】:Add custom middleware to Laravel Passport endpoints将自定义中间件添加到 Laravel Passport 端点
【发布时间】:2018-01-11 19:58:04
【问题描述】:

我在 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));
}

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

【问题讨论】:

    标签: php laravel routes middleware laravel-passport


    【解决方案1】:

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

    Passport::routes(null, ['middleware' => 'api']);
    

    【讨论】:

    • 这对我有用。要针对中间件中的特定路由:` public function handle($request, Closure $next, $guard = null) { if( $request->path() != 'oauth/authorize' || $request->method () != 'POST' ) { return $next($request); } }`
    【解决方案2】:

    app/Providers/AuthServiceProvider 中,通过在顶部某处添加此 use 语句来包含 Route 外观:

    use Illuminate\Support\Facades\Route;
    

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

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

    希望对您有所帮助!

    【讨论】:

      【解决方案3】:

      如果你只需要在一个 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
      {
      
      }
      
      1. 然后创建到该控制器和方法的路由(因为该控制器继承了所有父控制器方法):

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-06-16
        • 1970-01-01
        • 2021-03-03
        • 1970-01-01
        • 2019-03-18
        • 2019-04-26
        • 2018-09-03
        • 1970-01-01
        相关资源
        最近更新 更多