Laravel 如果另一个中间件失败,则调用一个中间件
Laravel Call a middleware if another middleware fails
所以我一直在使用 Passport 来处理任何完美运行的 OAuth 请求。但是,在某些情况下,我不需要用户实例来请求和 API 端点。静态列表等。我为此创建了一个中间件,它工作正常。最后还有一些场景,当拉出列表之类的东西时,我想让开发人员可以自由地使用令牌或 OAuth 来 post 到这些端点。并为如何做到这一点而苦苦挣扎......
有人有什么见解吗?我在想我总是可以调用令牌中间件,然后从令牌中间件调用普通护照 OAuth?虽然不太确定我会怎么做。
链接在这种情况下不起作用,因为如果失败它会引导它们,我希望它检查令牌如果它不存在然后检查 OAuth 令牌并在此之后遵循正常行为。
Route::group(['middleware' => 'token:auth:api',
在文档中没有看到任何关于如何执行此操作的信息。但也许我错过了什么。
干杯
花旗
你可以通过制作另一个中间件来实现。在该中间件中,首先调用令牌中间件,如果失败则调用通行证 OAuth 中间件。我已经使用 Tymon JWT 对令牌进行身份验证,如果失败,将使用 Laravel Passport OAuth 进行身份验证。下面是中间件的handle()函数
public function handle($request, Closure $next)
{
try {
return app(\Tymon\JWTAuth\Http\Middleware\Authenticate::class)->handle($request, function ($request) use ($next) { //JWT middleware
return $next($request);
});
} catch (\Exception $exception) {
if ($exception instanceof UnauthorizedHttpException) {
return app(\Laravel\Passport\Http\Middleware\CheckClientCredentials::class)->handle($request, function ($request) use ($next) {
return $next($request);
});
}
throw $exception;
}
}
在中间件句柄下方检查正常令牌,否则将请求发送到另一个中间件进行身份验证。
在 api 端点允许授权令牌,它可以是预定义令牌或 oauth 令牌。
public function handle($request, Closure $next)
{
if ($request->is('api/*')) {
if($request->hasHeader('authorization')){
$bearertoken = $request->bearerToken();
$token = $request->header('authorization');
if(!empty($bearertoken)){
return app(Authenticate::class)->handle($request, function ($request) use ($next) {
return $next($request);
},'api');
}
if(!empty($token)){
$client = Client::where('secret',$token)->first();
if(!empty($client)){
return $next($request);
}
}
}
throw new APIException("Unauthorized Access.");
}
return $next($request);
}
在您的 Middlvar 的 Handle 方法中,添加以下代码:
$classes = (array) MiddlewareNameResolver::resolve(
$guard, app('router')->getMiddleware(), app('router')->getMiddlewareGroups()
);
app(\Illuminate\Pipeline\Pipeline::class)
->send($request)
->through($classes)
->thenReturn();
所以我一直在使用 Passport 来处理任何完美运行的 OAuth 请求。但是,在某些情况下,我不需要用户实例来请求和 API 端点。静态列表等。我为此创建了一个中间件,它工作正常。最后还有一些场景,当拉出列表之类的东西时,我想让开发人员可以自由地使用令牌或 OAuth 来 post 到这些端点。并为如何做到这一点而苦苦挣扎......
有人有什么见解吗?我在想我总是可以调用令牌中间件,然后从令牌中间件调用普通护照 OAuth?虽然不太确定我会怎么做。
链接在这种情况下不起作用,因为如果失败它会引导它们,我希望它检查令牌如果它不存在然后检查 OAuth 令牌并在此之后遵循正常行为。
Route::group(['middleware' => 'token:auth:api',
在文档中没有看到任何关于如何执行此操作的信息。但也许我错过了什么。
干杯
花旗
你可以通过制作另一个中间件来实现。在该中间件中,首先调用令牌中间件,如果失败则调用通行证 OAuth 中间件。我已经使用 Tymon JWT 对令牌进行身份验证,如果失败,将使用 Laravel Passport OAuth 进行身份验证。下面是中间件的handle()函数
public function handle($request, Closure $next)
{
try {
return app(\Tymon\JWTAuth\Http\Middleware\Authenticate::class)->handle($request, function ($request) use ($next) { //JWT middleware
return $next($request);
});
} catch (\Exception $exception) {
if ($exception instanceof UnauthorizedHttpException) {
return app(\Laravel\Passport\Http\Middleware\CheckClientCredentials::class)->handle($request, function ($request) use ($next) {
return $next($request);
});
}
throw $exception;
}
}
在中间件句柄下方检查正常令牌,否则将请求发送到另一个中间件进行身份验证。 在 api 端点允许授权令牌,它可以是预定义令牌或 oauth 令牌。
public function handle($request, Closure $next)
{
if ($request->is('api/*')) {
if($request->hasHeader('authorization')){
$bearertoken = $request->bearerToken();
$token = $request->header('authorization');
if(!empty($bearertoken)){
return app(Authenticate::class)->handle($request, function ($request) use ($next) {
return $next($request);
},'api');
}
if(!empty($token)){
$client = Client::where('secret',$token)->first();
if(!empty($client)){
return $next($request);
}
}
}
throw new APIException("Unauthorized Access.");
}
return $next($request);
}
在您的 Middlvar 的 Handle 方法中,添加以下代码:
$classes = (array) MiddlewareNameResolver::resolve(
$guard, app('router')->getMiddleware(), app('router')->getMiddlewareGroups()
);
app(\Illuminate\Pipeline\Pipeline::class)
->send($request)
->through($classes)
->thenReturn();