OAuth league на БУС

используемые composer библиотеки
для использование библиотеки league надо  
  • реализовать свои классы 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);   
}
добавили правило в urlwewrite.php
[
    '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();