我们有2种auth中间件应用于特定路由,即“ external_token”和“ auth:api”。当提供外部承载令牌时,我们将对其进行检查,如果所有值都正确,我们认为该用户有权访问所请求的url。
我们如何处理除通行证以外的所有其他中间件?
public function handle(Request $request, Closure $next)
{
$token = $request->header('Bearer');
try {
list($JWTHeader, $JWTPayload) = JWT::verify($token, JWT::TYPE_ID_EXTERNAL);
$this->user = User::where('external_id', $JWTPayload['external_id'])->first();
// Can we just set $this->user and process all other middlewares except auth?
} catch (Exception $e) {
Log::debug($e);
}
$response = $next($request);
return $response;
}
答案 0 :(得分:2)
好吧,您可以做的一件事情是将用户设置为api
防护,因此,当身份验证中间件运行时,它将找到您提供的用户。您必须确保首先运行external_token
中间件。
auth()->guard('api')->setUser($this->user);
另一种选择是将external_token
中间件转换为Laravel身份验证保护,以便您可以使用内置的身份验证功能。然后,您可以使用auth:api,external_token
保护您的路由,并且如果任何一个指定的防护措施都成功,则身份验证将通过。
最简单的示例是closure request guard。
在您的AuthServiceProvider::boot()
方法中:
// don't forget your "use" statements for all these classes
public function boot()
{
// ...
Auth::viaRequest('external_token_driver', function ($request) {
$token = $request->header('Bearer');
try {
list($JWTHeader, $JWTPayload) = JWT::verify($token, JWT::TYPE_ID_EXTERNAL);
return User::where('external_id', $JWTPayload['external_id'])->first();
} catch (Exception $e) {
Log::debug($e);
}
return null;
});
}
在您的auth.php
配置中:
'guards' => [
// web, api, etc...
'external_token' => [
'driver' => 'external_token_driver',
],
],
NB:全部未经测试。