log = $log; $this->validator = $validator; $this->tokenValidator = $tokenValidator; $this->config = $config; $this->entityManager = $entityManager; $this->authTokenManger = $authTokenManger; } /** * @throws SignatureNotVerified * @throws Invalid */ public function logout(string $rawToken): void { $token = Token::create($rawToken); $this->log->debug("OIDC logout: JWT header: " . $token->getHeaderRaw()); $this->log->debug("OIDC logout: JWT payload: " . $token->getPayloadRaw()); $this->validator->validate($token); $this->tokenValidator->validateSignature($token); $this->tokenValidator->validateFields($token); $usernameClaim = $this->config->get('oidcUsernameClaim'); if (!$usernameClaim) { throw new Invalid("No username claim in config."); } $username = $token->getPayload()->get($usernameClaim); if (!$username) { throw new Invalid("No username claim `{$usernameClaim}` in token."); } $user = $this->entityManager ->getRDBRepositoryByClass(User::class) ->where([ 'userName' => $username, ]) ->findOne(); if (!$user) { return; } if ($user->isPortal()) { return; } $authTokenList = $this->entityManager ->getRDBRepositoryByClass(AuthTokenEntity::class) ->where([ 'userId' => $user->getId(), 'isActive' => true, ]) ->find(); foreach ($authTokenList as $authToken) { assert($authToken instanceof AuthToken); $this->authTokenManger->inactivate($authToken); } } }