Skip to content

Commit

Permalink
update for new oauth2-client
Browse files Browse the repository at this point in the history
  • Loading branch information
bessudnov committed Sep 2, 2019
1 parent 318dcb0 commit 229a9ec
Show file tree
Hide file tree
Showing 9 changed files with 372 additions and 190 deletions.
2 changes: 2 additions & 0 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@ php:
- 5.6
- 7.0
- 7.1
- 7.2
- 7.3

matrix:
include:
Expand Down
2 changes: 1 addition & 1 deletion LICENSE
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
The MIT License (MIT)

Copyright (c) 2017 amoCRM.
Copyright (c) 2017-2019 amoCRM.

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
Expand Down
65 changes: 48 additions & 17 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,36 +17,67 @@ composer require amocrm/oauth2-amocrm
### Обработка кода авторизации (Authorization Code)

```php
$provider = new AmoCRM\OAuth2\Client\Provider\AmoCRM([
'clientId' => 'YOUR_CLIENT_ID',
'clientSecret' => 'YOUR_CLIENT_SECRET',
'redirectUri' => 'http://your-redirect-uri',
'clientSubdomain' => 'example',
'clientTopLevelDomain' => 'ru', //use com for us accounts
$provider = new AmoCRM([
'clientId' => 'xxx',
'clientSecret' => 'xxx',
'redirectUri' => 'https://test.test',
]);

if (isset($_GET['code']) && $_GET['code']) {
$token = $this->provider->getAccessToken('authorizaton_code', [
'code' => $_GET['code']
]);

// Returns an instance of League\OAuth2\Client\User
$user = $this->provider->getUserDetails($token);
$uid = $provider->getUserUid($token);
$email = $provider->getUserEmail($token);
$screenName = $provider->getUserScreenName($token);
//Вызов функции setBaseDomain требуется для установки контектс аккаунта.
if (isset($_GET['referer'])) {
$provider->setBaseDomain($_GET['referer']);
}

//todo сохраняем access, refresh токены и привязку к аккаунту и возможно пользователю

/** @var \AmoCRM\OAuth2\Client\Provider\AmoCRMResourceOwner $ownerDetails */
$ownerDetails = $provider->getResourceOwner($token);

printf('Hello, %s!', $ownerDetails->getName());
}
```

### Обновление access токена

```php
$provider = new AmoCRM\OAuth2\Client\Provider\AmoCRM([
'clientId' => 'YOUR_CLIENT_ID',
'clientSecret' => 'YOUR_CLIENT_SECRET',
'redirectUri' => 'http://your-redirect-uri',
$provider = new AmoCRM([
'clientId' => 'xxx',
'clientSecret' => 'xxx',
'redirectUri' => 'https://test.test',
]);

$grant = new \League\OAuth2\Client\Grant\RefreshToken();
$token = $provider->getAccessToken($grant, ['refresh_token' => $refreshToken]);
//todo получение токена из хранилища

$provider->setBaseDomain($token['baseDomain']);
/**
* Проверяем активен ли токен и делаем запрос или обновляем токен
*/
if (time() >= $token['expires']) {
/**
* Получаем токен по рефрешу
*/
try {
$accessToken = $provider->getAccessToken(new League\OAuth2\Client\Grant\RefreshToken(), [
'refresh_token' => $token['refreshToken'],
]);

//todo сохраняем новые access, refresh токены и привязку к аккаунту и возможно пользователю

} catch (Exception $e) {
die((string)$e);
}
}

//todo повторяем исходный запрос
```

### Пример
В рамках данного репозитория имеется файл **example.php**, который рееализует простейшую логику авторизации, сохранения токена, а также совеершения запросов.
Для использования нужно указать корректные значения при создании провайдера. Дальше для теста можно переейти на страницу example.php, после чего будет редирект в приложение amoCRM для авторизации.
После получения доступов вы увидете имя пользователя на экране.
Если добавить GET параметр - request=1, то будет совершен запрос за информацией об аккаунте с сохраненным ранее токеном.
3 changes: 2 additions & 1 deletion composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,8 @@
],
"require": {
"php": ">=5.6.0",
"league/oauth2-client": "^2.0"
"ext-json": "*",
"league/oauth2-client": "2.4.*"
},
"require-dev": {
"phpunit/phpunit": "~4.5"
Expand Down
152 changes: 152 additions & 0 deletions example.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,152 @@
<?php
define('TOKEN_FILE', __DIR__ . DIRECTORY_SEPARATOR . 'token_info.json');

use AmoCRM\OAuth2\Client\Provider\AmoCRM;

include_once __DIR__ . '/vendor/autoload.php';
include_once __DIR__ . '/src/AmoCRM.php';

session_start();
/**
* Создаем провайдера
*/
$provider = new AmoCRM([
'clientId' => 'xxx',
'clientSecret' => 'xxx',
'redirectUri' => 'https://ya.ru',
]);

if (isset($_GET['referer'])) {
$provider->setBaseDomain($_GET['referer']);
}

if (!isset($_GET['request'])) {
if (!isset($_GET['code'])) {
/**
* Получаем ссылку для авторизации и дальше редиректим
*/
$authorizationUrl = $provider->getAuthorizationUrl();
$_SESSION['oauth2state'] = $provider->getState();
header('Location: ' . $authorizationUrl);
} elseif (empty($_GET['state']) || ($_GET['state'] !== $_SESSION['oauth2state'])) {
unset($_SESSION['oauth2state']);
exit('Invalid state');
}

/**
* Ловим обратный код
*/
try {
/** @var \League\OAuth2\Client\Token\AccessToken $access_token */
$accessToken = $provider->getAccessToken(new League\OAuth2\Client\Grant\AuthorizationCode(), [
'code' => $_GET['code'],
]);

if (!$accessToken->hasExpired()) {
saveToken([
'accessToken' => $accessToken->getToken(),
'refreshToken' => $accessToken->getRefreshToken(),
'expires' => $accessToken->getExpires(),
'baseDomain' => $provider->getBaseDomain(),
]);
}
} catch (Exception $e) {
die((string)$e);
}

/** @var \AmoCRM\OAuth2\Client\Provider\AmoCRMResourceOwner $ownerDetails */
$ownerDetails = $provider->getResourceOwner($accessToken);

printf('Hello, %s!', $ownerDetails->getName());
} else {
$accessToken = getToken();

$provider->setBaseDomain($accessToken->getValues()['baseDomain']);

/**
* Проверяем активен ли токен и делаем запрос или обновляем токен
*/
if ($accessToken->hasExpired()) {
/**
* Получаем токен по рефрешу
*/
try {
$accessToken = $provider->getAccessToken(new League\OAuth2\Client\Grant\RefreshToken(), [
'refresh_token' => $accessToken->getRefreshToken(),
]);

saveToken([
'accessToken' => $accessToken->getToken(),
'refreshToken' => $accessToken->getRefreshToken(),
'expires' => $accessToken->getExpires(),
'baseDomain' => $provider->getBaseDomain(),
]);

} catch (Exception $e) {
die((string)$e);
}
}

$token = $accessToken->getToken();

try {
/**
* Делаем запрос к АПИ
*/
$data = $provider->getHttpClient()
->request('GET', $provider->urlAccount() . 'api/v2/account', [
'headers' => $provider->getHeaders($accessToken)
]);

$parsedBody = json_decode($data->getBody()->getContents(), true);
printf('ID аккаунта - %s, название - %s', $parsedBody['id'], $parsedBody['name']);
} catch (GuzzleHttp\Exception\GuzzleException $e) {
var_dump((string)$e);
}
}


function saveToken($accessToken) {
if (
isset($accessToken)
&& isset($accessToken['accessToken'])
&& isset($accessToken['refreshToken'])
&& isset($accessToken['expires'])
&& isset($accessToken['baseDomain'])
) {
$data = [
'accessToken' => $accessToken['accessToken'],
'expires' => $accessToken['expires'],
'refreshToken' => $accessToken['refreshToken'],
'baseDomain' => $accessToken['baseDomain'],
];

file_put_contents(TOKEN_FILE, json_encode($data));
} else {
exit('Invalid access token ' . var_export($accessToken, true));
}
}

/**
* @return \League\OAuth2\Client\Token\AccessToken
*/
function getToken() {
$accessToken = json_decode(file_get_contents(TOKEN_FILE), true);

if (
isset($accessToken)
&& isset($accessToken['accessToken'])
&& isset($accessToken['refreshToken'])
&& isset($accessToken['expires'])
&& isset($accessToken['baseDomain'])
) {
return new \League\OAuth2\Client\Token\AccessToken([
'access_token' => $accessToken['accessToken'],
'refresh_token' => $accessToken['refreshToken'],
'expires' => $accessToken['expires'],
'baseDomain' => $accessToken['baseDomain'],
]);
} else {
exit('Invalid access token ' . var_export($accessToken, true));
}
}
Loading

0 comments on commit 229a9ec

Please sign in to comment.