Интеграция пользователей Drupal 8 со сторонней системой

На данный момент я занимаюсь разработкой нескольких сайтов на Drupal 8 для одной крупной организации, у которой уже есть свои внутренние ресурсы. Одним из таких ресурсов является что-то вроде  электронной системы учета сотрудников, разработанная силами своих программистов.

Соответственно, одной из задач было дать возможность пользователям логинится на сайтах, используя учетные данные этой системы, чтобы не плодить для них кучу разных логинов/паролей. Сделать это решено было по аналогии с логином через соц.сети.

Разработчики системы учета сотрудников предоставили что-то вроде API: ссылка, на которую надо отправить логин/пароль пользователя в их системе, на что она ответит XML-ом с информацией о пользователе, если такой найдется. А далее все просто: ищем на сайте пользователя, доп. поле «external_uid» которого равно userId внешней системы, если не нашли, то создаем, а затем его авторизуем.

Для этого реализовал отдельный модуль, который рисует форму логина и шлет ее по тому самому адресу. Весь модуль «светить» здесь не буду, ибо он является только первой ступенью в большой коммерческой разработке, да и в обмене данными в PHP нет ничего хитрого. Приведу код обработчика ответа:

 public function login()
    {
        $context  = stream_context_create(array('http' => array('header' => 'Accept: application/xml')));
        $url = 'http://www.***.com/get_user';
        $xml = file_get_contents($url, false, $context);
        $user_info = new \SimpleXMLElement($xml);
        $query = \Drupal::entityQuery('user')
            ->condition('field_extarnal_uid', $user_info->userId);
        $users = $query->execute();
        //Если не нашли пользователя с таким External UID, то создаем его
        if(empty($users))
        {
            $user = User::create();
            $user->setUsername($user_info->firstname." ".$user_info->lastname);
            $user->setEmail($user_info->email);
            $user->field_external_uid = $user_info->userId;
            $user->activate();
            $result = $user->save();
            /*Немного говнокода, чтобы узнать UID вновь добавленного пользователя.
            //Наверняка можно сделать проще, надо будет в будущем разобраться*/
            $query = \Drupal::entityQuery('user')
                ->condition('field_external_uid', $user_info->userId);
            $users = $query->execute();
        }
        $user = User::load(array_keys($users)[0]); //Загружаем пользователя с нужным UID
        user_login_finalize($user); //Авторизуем пользователя на сайте
        //Рисуем страницу приветсвия
        $output['#title'] = $user_info->firstname;
        $output['#markup'] = "Добро пожаловать, ".$user_info->firstName."!";
        return $output;
    }

Как видно из приведенного выше кода, пользователь создается без пароля, поэтому войти ему можно только через эту самую внешнюю систему. Конкретно для моего случая это именно то, что нужно, однако, можно реализовать поиск пользователя не по полю External UID, а, например, по e-mail’у. И в таком случае можно «привязать» его аккаунт в сторонней системе к профилю друпала.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *