如果另一个中间件出现故障,Laravel会调用中间件

时间:2017-04-10 17:41:57

标签: laravel oauth laravel-5.4 laravel-passport

所以我一直在使用Passport来处理任何完美运行的OAuth请求。但是在某些情况下,我不需要用户实例来请求和API端点。静态列表等我为此创建了一个中间件,它工作正常。最后有些情况下我喜欢列表,我想让开发人员可以自由地使用令牌或OAuth发布到这些端点。并努力做到这一点......

任何人都有任何见解?我想我总是可以调用令牌中间件,然后从令牌中间件调用正常的护照OAuth?我不确定如何做到这一点。

链接在这种情况下不起作用,因为如果一个失败,它会启动它们,我希望它检查一个令牌,如果它不存在那么检查OAuth令牌并在此之后遵循正常行为。

Route::group(['middleware' => 'token:auth:api',

没有在文档中看到有关如何执行此操作的任何内容。但也许我错过了一些东西。

干杯

CITTI

2 个答案:

答案 0 :(得分:0)

您可以通过制作另一个中间件来实现这一目标。在该中间件中,首先调用令牌中间件,如果失败则调用护照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;
    }

}

答案 1 :(得分:0)

在中间件句柄下面,用于检查正常令牌,否则将请求发送到另一个中间件以进行身份​​验证。 在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);
    }