将自定义中间件添加到 Laravel Passport 端点
Posted
技术标签:
【中文标题】将自定义中间件添加到 Laravel Passport 端点【英文标题】:Add custom middleware to Laravel Passport endpoints 【发布时间】: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 端点将返回错误。
【问题讨论】:
【参考方案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
,你可以这样做:
-
输入
php artisan r:l
查找您需要的路线
检查该路由使用的控制器和方法,在示例中它将是AccessTokenController@issueToken
创建扩展AccessTokenController的控制器,可以留空
namespace App\Http\Controllers; use Illuminate\Http\Request; use Laravel\Passport\Http\Controllers\AccessTokenController; class ApiTokenController extends AccessTokenController
-
然后创建到该控制器和方法的路由(因为该控制器继承了所有父控制器方法):
Route::middleware('MyMiddleware')->post('/api-token', 'ApiTokenController@issueToken');
【讨论】:
以上是关于将自定义中间件添加到 Laravel Passport 端点的主要内容,如果未能解决你的问题,请参考以下文章
如何将自定义标头从 mvc 项目发送到 Web api 项目?
使用 Laravel 8(和 Jetstream)将自定义数据传递到 login.blade.php