. * * The interactive user interfaces in modified source and object code versions * of this program must display Appropriate Legal Notices, as required under * Section 5 of the GNU Affero General Public License version 3. * * In accordance with Section 7(b) of the GNU Affero General Public License version 3, * these Appropriate Legal Notices must retain the display of the "EspoCRM" word. ************************************************************************/ namespace Espo\Tools\OAuthServer\League; use Espo\Core\Exceptions\Error; use Espo\Tools\OAuthServer\League\Repositories\AccessTokenRepository; use Espo\Tools\OAuthServer\League\Repositories\AuthCodeRepository; use Espo\Tools\OAuthServer\League\Repositories\ClientRepository; use Espo\Tools\OAuthServer\League\Repositories\RefreshTokenRepository; use Espo\Tools\OAuthServer\League\Repositories\ScopeRepository; use Espo\Tools\OAuthServer\Utils\CryptKeyProvider; use Exception; use League\OAuth2\Server\AuthorizationServer; use League\OAuth2\Server\CryptKey; use League\OAuth2\Server\Grant\AuthCodeGrant; use League\OAuth2\Server\Grant\RefreshTokenGrant; class AuthorizationServerFactory { public function __construct( private ClientRepository $clientRepository, private AccessTokenRepository $accessTokenRepository, private ScopeRepository $scopeRepository, private AuthCodeRepository $authCodeRepository, private RefreshTokenRepository $refreshTokenRepository, private CryptKeyProvider $cryptKeyProvider, private ConfigDataProvider $configDataProvider, ) {} /** * @throws Error */ public function create(): AuthorizationServer { $server = new AuthorizationServer( clientRepository: $this->clientRepository, accessTokenRepository: $this->accessTokenRepository, scopeRepository: $this->scopeRepository, privateKey: $this->createPrivateKeyStub(), encryptionKey: $this->cryptKeyProvider->getCryptKey(), ); $server->revokeRefreshTokens(true); $this->enableAuthorizationCodeGrant($server); $this->enableRefreshTokenGrant($server); return $server; } /** * @throws Error */ private function enableAuthorizationCodeGrant(AuthorizationServer $server): void { try { $grant = new AuthCodeGrant( authCodeRepository: $this->authCodeRepository, refreshTokenRepository: $this->refreshTokenRepository, authCodeTTL: $this->configDataProvider->getAuthorizationCodeTtl(), ); } catch (Exception $e) { throw new Error("Error occurred.", previous: $e); } $server->enableGrantType( grantType: $grant, accessTokenTTL: $this->configDataProvider->getAccessTokenTtl(), ); } /** * @throws Error */ private function enableRefreshTokenGrant(AuthorizationServer $server): void { try { $grant = new RefreshTokenGrant($this->refreshTokenRepository); } catch (Exception $e) { throw new Error("Error occurred.", previous: $e); } $grant->setRefreshTokenTTL($this->configDataProvider->getRefreshTokenTtl()); $server->enableGrantType( grantType: $grant, accessTokenTTL: $this->configDataProvider->getAccessTokenTtl(), ); } /** * Access token encryption is not used. Opaque tokens are used. */ private function createPrivateKeyStub(): CryptKey { return new class() extends CryptKey { /** * @noinspection PhpMissingParentConstructorInspection */ public function __construct() {} }; } }