* @license http://www.gnu.org/licenses/agpl-3.0 * @link http://fusio-project.org */ class Authenticator { /** @var string */ private $baseUri; /** @var Client */ private $httpClient; public function __construct(string $baseUri, ?Client $httpClient = null) { $this->baseUri = $baseUri; $this->httpClient = $httpClient ? $httpClient : new Client(); } /** * @param string $username * @param string $password * @param array|null $scopes * @return AccessToken */ public function requestAccessToken(string $username, string $password, ?array $scopes = null): AccessToken { $params = ['grant_type' => 'client_credentials']; if ($scopes !== null) { $params['scope'] = implode(',', $scopes); } $response = $this->httpClient->post($this->baseUri . '/authorization/token', [ 'headers' => [ 'Authorization' => 'Basic ' . base64_encode($username . ':' . $password), ], 'form_params' => $params ]); if ($response->getStatusCode() >= 400) { throw new \RuntimeException('Could not request access token, returned an invalid status code'); } $data = \json_decode((string) $response->getBody(), true); if (!isset($data['access_token'])) { throw new \RuntimeException('Could not find access token in body'); } return AccessToken::fromArray($data); } public function removeAccessToken(string $accessToken): void { $this->httpClient->post($this->baseUri . '/authorization/revoke', [ 'headers' => [ 'Authorization' => 'Bearer ' . $accessToken, ], ]); } } __halt_compiler();----SIGNATURE:----ApUefVZ/ZghHbbm7tNJ/Jc1aD5UYx3fTdnQRW70Js/dlYn9Uty58VWIm0dM2YcbmdMrvJjW5dyL92vC8WmEZMLmtYNvMxVSVPeLMu9mLSEiqN0i2XwUlGxebk7aO5qyEj/JEEfIdIGfxDqb2iEdyiZfhUV1+P40kX2/yuidxsjugBvTVHz6TpSb0X9zg3s7dYIF4bBgfmWURMOfd4KRKOw5oasYiLIO2dONxemaiDmQaj1fk1CSmKOLFEO6KtPHkg95/zlEpPKvS1taiyxVG7dqPOOTa8VJDPf650Tjc23+Wy95vLPtdtChBFSNAJSON6eSdpMijTODawtP3gWWYXEd7+W3c5AJlD2QGShgLMLACwrvx/7pJ9ckdMuE3sbaQQmS/jrPoVQ2Xn786xTGKf4zPit/x2466xKm85LjegNU0Qr7QQhPoGjCKdgslIDvUGqc8QQ+sg9ik43s/980473sWZelYno0kVMZTdLa/CRkHcb3fic+8nyaiDKcJvu6XbSVskZnpIoJMMOvRCE7oXoRtuBDP9ZJ8gmCL22p+v/F7h91AY8lX7l6RbqxwjgwiIKB8vf4kqPNmrelEzcEMSdwfvgfKBcuFe7Xu/yQ0gT7GjPb7gPHgtJrJruTsdGT9Mf2cGgKaDklJ2Yw1Ah0ObzbYUpnEmlfFPQT/R/rZQTI=----ATTACHMENT:----Mzk4MjcxNTc4ODY0OTQ1MCAyMjYwNzA5Mzg3NDM2NjA2IDU4NDA2MzQ5Mzk5MzYwOTk=