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();