From 10a8572a6eb84934e93ea303f67d944dc614c7a1 Mon Sep 17 00:00:00 2001 From: Daniel Feneck Date: Wed, 8 Oct 2025 12:39:18 +1100 Subject: [PATCH] FirebaseGuard.php updated to use the Laravel Guard interface correctly. --- src/FirebaseGuard.php | 145 +++++++++++++++++++++++++++--------------- 1 file changed, 95 insertions(+), 50 deletions(-) diff --git a/src/FirebaseGuard.php b/src/FirebaseGuard.php index 8175854..1d64623 100644 --- a/src/FirebaseGuard.php +++ b/src/FirebaseGuard.php @@ -2,57 +2,102 @@ namespace Firevel\FirebaseAuthentication; +use Illuminate\Contracts\Auth\Guard; +use Illuminate\Contracts\Auth\Authenticatable; use Illuminate\Http\Request; use Kreait\Firebase\JWT\IdTokenVerifier; -class FirebaseGuard +class FirebaseGuard implements Guard { - /** - * @var Kreait\Firebase\JWT\IdTokenVerifier - */ - protected $verifier; - - /** - * Constructor. - * - * @return void - */ - public function __construct(IdTokenVerifier $verifier) - { - $this->verifier = $verifier; - } - - /** - * Get User by request claims. - * - * @return mixed|null - */ - public function user(Request $request) - { - $token = $request->bearerToken(); - - if (empty($token)) { - return; - } - - try { - $firebaseToken = $this->verifier->verifyIdToken($token); - - return app(config('auth.providers.users.model')) - ->resolveByClaims($firebaseToken->payload()) - ->setFirebaseAuthenticationToken($token); - } catch (\Exception $e) { - if ($e instanceof \Kreait\Firebase\JWT\Error\IdTokenVerificationFailed) { - if (str_contains($e->getMessage(), 'token is expired')) { - return; - } - } - - if (config('app.debug')) { - throw $e; - } - - return; - } - } -} + /** + * @var Kreait\Firebase\JWT\IdTokenVerifier + */ + protected $verifier; + protected $user; + protected $request; + + /** + * Constructor. + * + * @return void + */ + public function __construct(IdTokenVerifier $verifier, ?Request $request = null) + { + $this->verifier = $verifier; + $this->request = $request ?: request(); + } + + /** + * Get User by request claims. + * + * @return mixed|null + */ + public function user() + { + if ($this->user) { + return $this->user; + } + + $token = $this->request->bearerToken(); + if (empty($token)) { + return; + } + + try { + $firebaseToken = $this->verifier->verifyIdToken($token); + + $user = app(config('auth.providers.users.model')) + ->resolveByClaims($firebaseToken->payload()); + + if ($user) { + $user->setFirebaseAuthenticationToken($token); + } + + return $this->user = $user; + } catch (\Exception $e) { + if ($e instanceof \Kreait\Firebase\JWT\Error\IdTokenVerificationFailed) { + if (str_contains($e->getMessage(), 'token is expired')) { + return; + } + } + + if (config('app.debug')) { + throw $e; + } + + return; + } + } + + public function validate(array $credentials = []) + { + // not used - Laravels sessionless guards skip this + return (bool) $this->user(); + } + + public function id() + { + return $this->user()?->getAuthIdentifier(); + } + + public function check() + { + return !is_null($this->user()); + } + + public function guest() + { + return is_null($this->user()); + } + + public function setUser(Authenticatable $user) + { + $this->user = $user; + return $this; + } + + public function hasUser() + { + return !is_null($this->user); + } +} \ No newline at end of file