используемые composer библиотеки
структура файлов модуля
компонента
после установки будут созданы ключи шифрования
таблицы
установили битриксовский модуль rest
настройки клиентов sso будут храниться будет храниться в таблице b_rest_app (но можно и свою таблицу)
добавили правило в urlwewrite.php
еще пример по работе c b_rest_app
получить
AppTable::getByClientId - в зависимости от типа параметра, если число, то ищет по ID, иначе по (CODE или CLIENT_ID)
или
- league/oauth2-server https://oauth2.thephpleague.com/
- nyholm/psr7
- nyholm/psr7-server
- реализовать свои классы repositories (методы работы) и entities (сущности) которые используют интерфейсы библиотеки
- реализовать хранение токенов, авторизационных кодов на своем сайте (я реализовала хранением в БД)
структура файлов модуля
| /local/modules/nikaverro/dev/oauth/ ├── authorizationoauthserver.php # Авторизация (authorize endpoint) ├── tokenoauthserver.php # Токены (token endpoint, logout) ├── profileoauthserver.php # Профиль (userinfo endpoint) ├── baseoauthserver.php # Базовый класс для всех серверов │ ├── config/ │ └── oauthconfig.php # класс для чтения конфигурации из b_rest_app │ ├── entities/ │ ├── cliententity.php # Client entity │ ├── accesstokenentity.php # Access token entity │ ├── refreshtokenentity.php # Refresh token entity │ ├── authcodeentity.php # Auth code entity │ ├── scopeentity.php # Scope entity │ └── userentity.php # User entity │ ├── repositories/ │ ├── clientrepository.php # Client repository │ ├── accesstokenrepository.php # Access token repository │ ├── refreshtokenrepository.php # Refresh token repository │ ├── authcoderepository.php # Auth code repository │ ├── scoperepository.php # Scope repository │ └── userrepository.php # User repository │ ├── storage/ │ ├── tokenstorage.php # Работа с таблицей токенов │ ├── authcodestorage.php # Работа с таблицей auth кодов │ └── consentstorage.php # Работа с таблицей согласий │ ├── storage/orm/ │ ├── tokentable.php # ORM для токенов │ ├── authcodetable.php # ORM для auth кодов │ └── consenttable.php # ORM для согласий │ ├── helpers/ │ ├── oauthresponse.php # HTTP ответы │ └── oauthsession.php # Работа с сессией │ └── install/ └── oauthinstall.php # Установка таблиц и ключей |
| /local/components/nikaverro/oauth.league/ ├── class.php # OAuthLeague (главный контроллер) ├── .parameters.php └── templates/ └── .default/ └── consent.php # Шаблон формы согласия |
после установки будут созданы ключи шифрования
| /local/php_interface/keys/ # Ключи RSA ├── private.key # Приватный ключ ├── public.key # Публичный ключ └── encryption.key # Ключ шифрования |
| n_oauth_tokens # Токены доступа и обновления n_oauth_auth_codes # Временные коды авторизации n_oauth_consent # Согласия пользователей |
установили битриксовский модуль rest
настройки клиентов sso будут храниться будет храниться в таблице b_rest_app (но можно и свою таблицу)
use \Bitrix\Rest\AppTable;
$appFields = [
'URL' => 'my_sso_callback_url',
'URL_DEMO' => 'sso_public_url',
'CLIENT_ID' => 'my_client_id',
'CLIENT_SECRET'=>'my_client_secret',
'CODE' => 'bettermode',
'STATUS' => AppTable::STATUS_LOCAL, // AppTable::STATUS_LOCAL, AppTable::STATUS_FREE, AppTable::STATUS_PAID, AppTable::STATUS_DEMO, AppTable::STATUS_TRIAL, AppTable::STATUS_SUBSCRIPTION,
'SCOPE' => "openid email profile", //не битриксовские, а для oauth
'APP_NAME' => 'SSO client title for users', //видно на странице согласий
];
$result = AppTable::add($appFields);
if(!$result->isSuccess()){
$errors = $result->getErrorMessages();
echo 'errors: ' . implode(', ', $errors);
} |
[ 'CONDITION' => '#^/oauth/([a-z0-9\\_\\-]+)/.*#', 'RULE' => 'page=$1', 'ID' => '', 'PATH' => '/oauth/index.php', 'SORT' => 100, ], |
еще пример по работе c b_rest_app
$appFields = [ 'URL' => 'https://app.mysite.com/', 'URL_INSTALL' => 'https://app.mysite.com/install_callback/', 'SCOPE' => [ 'bizproc', 'calendar', 'contact_center', 'crm', 'department', 'disk', 'documentgenerator', 'entity', 'faceid', 'forum', 'im', 'imbot', 'imopenlines', 'isu.exchange', 'landing', 'landing_cloud', 'lists', 'log', 'mailservice', 'messageservice', 'mobile', 'pay_system', 'placement', 'pull', 'pull_channel', 'rating', 'sale', 'smile', 'sonet_group', 'task', 'tasks_extended', 'timeman', 'user', 'userconsent' ], 'APP_NAME' => 'My app name', 'ONLY_API' => 'Y', 'MOBILE' => 'N' ]; |
AppTable::getByClientId - в зависимости от типа параметра, если число, то ищет по ID, иначе по (CODE или CLIENT_ID)
$app = AppTable::getByClientId(1); //1 - ид приложения
$app = AppTable::getByClientId('myAppCode');
$app = AppTable::getByClientId('myClientId');
print_r($app); //$app - массив |
$app = AppTable::getList([ 'select' => ['ID','CLIENT_ID'], 'filter' => ['=CLIENT_ID' => $clientId], 'limit' => 1 ])->fetch(); |