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

Add custom middleware to Laravel Passport endpoints

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

我使用 auth:api 中间件和自定义中间件保护我的 API 路由,该中间件在处理任何请求之前检查请求中的特定 headers 是否存在且有效。此中间件适用于 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));
}

最终目标是如果 headers 不存在,oauth 端点将 return 出错。

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

use Illuminate\Support\Facades\Route;

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

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

希望对您有所帮助!

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

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

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

class ApiTokenController extends AccessTokenController
{

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

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

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

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