diff --git a/README.md b/README.md index ba0f7f3..40e7d3f 100644 --- a/README.md +++ b/README.md @@ -103,6 +103,17 @@ $accessToken = $apiClient->getOAuthClient()->getAccessTokenByCode($_GET['code']) Пример авторизации можно посмотреть в файле examples/get_token.php +### Авторизация с правами конкретного пользователя аккаунта +Начиная с версии 1.4.0 появилась возможность авторизоваться с правами конкретного пользователя, если токен был выпущен администратором аккаунта. + +Для авторизации под пользователем аккаунта - необходимо задать ID пользователя у объекта типа ```\AmoCRM\Client\AmoCRMApiClient```. + +```php +$apiClient = new \AmoCRM\Client\AmoCRMApiClient($clientId, $clientSecret, $redirectUri); +$apiClient->setContextUserId(123); +``` + + ## Подход к работе с библиотекой В библиотеке используется сервисный подход. Для каждой сущности имеется сервис. diff --git a/examples/user_context_actions.php b/examples/user_context_actions.php new file mode 100644 index 0000000..b8cbb7e --- /dev/null +++ b/examples/user_context_actions.php @@ -0,0 +1,35 @@ +setAccessToken($accessToken) + ->setAccountBaseDomain($accessToken->getValues()['baseDomain']) + ->onAccessTokenRefresh( + function (AccessTokenInterface $accessToken, string $baseDomain) { + saveToken( + [ + 'accessToken' => $accessToken->getToken(), + 'refreshToken' => $accessToken->getRefreshToken(), + 'expires' => $accessToken->getExpires(), + 'baseDomain' => $baseDomain, + ] + ); + } + ); + +$contextUserId = 123; +$apiClient->setContextUserId($contextUserId); + +//Получим свойства аккаунта и сравним юезра +try { + $account = $apiClient->account()->getCurrent(); + + echo 'Текущий юзер, тот кого вы передали? - ' . ($account->getCurrentUserId() === $contextUserId ? 'да' : 'нет'); +} catch (AmoCRMApiException $e) { + printError($e); +} diff --git a/src/AmoCRM/Client/AmoCRMApiClient.php b/src/AmoCRM/Client/AmoCRMApiClient.php index d2718b8..bbc3b74 100644 --- a/src/AmoCRM/Client/AmoCRMApiClient.php +++ b/src/AmoCRM/Client/AmoCRMApiClient.php @@ -75,6 +75,11 @@ class AmoCRMApiClient */ private $accessTokenRefreshCallback; + /** + * @var null|int + */ + private $contextUserId; + /** * AmoCRMApiClient constructor. * @param string $clientId @@ -103,6 +108,24 @@ public function getAccessToken(): ?AccessToken return $this->accessToken; } + public function getContextUserId(): ?int + { + return $this->contextUserId; + } + + /** + * Для админских токеном можно задать пользователя аккаунта, в контексте которого будет сделан запрос + * @param int|null $contextUserId + * + * @return $this + */ + public function setContextUserId(?int $contextUserId): AmoCRMApiClient + { + $this->contextUserId = $contextUserId; + + return $this; + } + /** * Устанавливаем базовый домен аккаунта в amoCRM, который будет использован при запросах * @param string $domain @@ -162,7 +185,7 @@ function (AccessToken $accessToken, string $baseAccountDomain) use ($oAuthClient } ); - return new AmoCRMApiRequest($this->accessToken, $oAuthClient); + return new AmoCRMApiRequest($this->getAccessToken(), $oAuthClient, $this->getContextUserId()); } /** diff --git a/src/AmoCRM/Client/AmoCRMApiRequest.php b/src/AmoCRM/Client/AmoCRMApiRequest.php index edd4437..5e643f5 100644 --- a/src/AmoCRM/Client/AmoCRMApiRequest.php +++ b/src/AmoCRM/Client/AmoCRMApiRequest.php @@ -36,7 +36,7 @@ class AmoCRMApiRequest public const CONNECT_TIMEOUT = 5; public const REQUEST_TIMEOUT = 20; //TODO Do not forget to change this on each release - public const LIBRARY_VERSION = '1.1.0'; + public const LIBRARY_VERSION = '1.4.0'; public const USER_AGENT = 'amoCRM-API-Library/' . self::LIBRARY_VERSION; public const SUCCESS_STATUSES = [ @@ -101,16 +101,25 @@ class AmoCRMApiRequest /** @var string|null */ private $requestDomain = null; + /** @var int|null */ + private $contextUserId = null; + /** * AmoCRMApiRequest constructor. + * * @param AccessTokenInterface $accessToken * @param AmoCRMOAuth $oAuthClient + * @param int|null $contextUserId */ - public function __construct(AccessTokenInterface $accessToken, AmoCRMOAuth $oAuthClient) - { + public function __construct( + AccessTokenInterface $accessToken, + AmoCRMOAuth $oAuthClient, + ?int $contextUserId + ) { $this->accessToken = $accessToken; $this->oAuthClient = $oAuthClient; $this->httpClient = $oAuthClient->getHttpClient(); + $this->contextUserId = $contextUserId; } /** @@ -129,11 +138,15 @@ private function refreshAccessToken() * @param array $queryParams * @param array $headers * @param bool $needToRefresh + * @param bool $isFullPath * * @return array + * @throws AmoCRMApiConnectExceptionException * @throws AmoCRMApiException - * @throws AmoCRMoAuthApiException + * @throws AmoCRMApiHttpClientException * @throws AmoCRMApiNoContentException + * @throws AmoCRMApiTooManyRedirectsException + * @throws AmoCRMoAuthApiException */ public function post( string $method, @@ -626,6 +639,10 @@ private function getBaseHeaders() $headers['X-Library-Version'] = self::LIBRARY_VERSION; $headers['X-Client-UUID'] = $this->oAuthClient->getOAuthProvider()->getClientId(); + if (!is_null($this->contextUserId)) { + $headers['X-Context-User-ID'] = $this->contextUserId; + } + return $headers; } @@ -635,6 +652,7 @@ private function getBaseHeaders() public function getLastRequestInfo(): array { return [ + 'context_user_id' => $this->contextUserId, 'last_http_method' => $this->lastHttpMethod, 'last_method' => $this->lastMethod, 'last_body' => $this->lastBody,