headers->has('Authorization'); } public function authenticate(Request $request): Passport { $header = (string) $request->headers->get('Authorization', ''); if (!str_starts_with($header, 'Bearer ')) { throw new AuthenticationException('Bearer token missing.'); } $token = substr($header, 7); if ($this->expectedToken === '' || !hash_equals($this->expectedToken, $token)) { throw new AuthenticationException('Bearer token invalid.'); } // Single-session model — there is one bridge "user", not per-end-user auth. return new SelfValidatingPassport(new UserBadge('bridge')); } public function onAuthenticationSuccess(Request $request, TokenInterface $token, string $firewallName): ?Response { return null; } public function onAuthenticationFailure(Request $request, AuthenticationException $exception): ?Response { return new JsonResponse( [ 'type' => 'about:blank', 'title' => 'Unauthorized', 'status' => Response::HTTP_UNAUTHORIZED, 'detail' => $exception->getMessage(), ], Response::HTTP_UNAUTHORIZED, ['Content-Type' => 'application/problem+json'], ); } }