Интеграция Kayako HelpDesk с Drupal

Главные вкладки

Аватар пользователя GROL GROL 7 января 2009 в 20:45

Всем привет.

Писал ранее в одном из своих постов, что нужно было организовать на сайте саппорт.

Как обычно водится, к срокам своего ничего до ума довести не удалось, посему в срочном порядке пришлось прикручивать готовое решение. Остановились на eSupport Kayako Help Desk _http://kayako.com (далее сокращенно (KHD).
Причин выбора было много, в том числе новогодняя 15% скидка Smile

И так, по порядку. В KHD разработан механизм LoginShare, цель которого является интеграция базы данных пользователей с другими источниками. Не смотря на то, что в пакет стандартной установки входят куча разных модулей для различных систем типа X-Cart, osCommerce, PHPBB, Joomla CMS, XOOPS, и т.д. к сожалению, Drupal-а среди них нет, посему пришлось писать свой модуль.

Решить нужно две задачи:
1. Не заставлять пользователя заводить аккаунт дважды т.е. синхронизировать базы данных пользователей.
2. Не заставлять пользователя логиниться дважды, когда он зайдет на основной сайт и затем перейдет в раздел саппорта.

Должен отметить, что второй пункт не реализован ни в одном из с существующих модулей.
Идеально решить эти две задачи не удалось. Поскольку движок KHD основан на своей структуре данных, то фактически для нормальной работы данные пользователей нужно скопировать из базы Друпала в базу KHD. Делать обратное копирование посчитал нецелесообразно, и вот почему. Пользователи в KHD создаются как онлайновым путем при заполнении формы, так и при парсинге писем. Учитывая какое количество спама валится на ящики, я посчитал, что нецелесообразно будет весь этот хлам тащить в Друпал.

И так, пошаговая инструкция:
1. Копируем файл drupal.login.php из аттача в папку {KHD}/includes/LoginShare
2. В файле {KHD}/includes/LoginShare/loginshare.config.php добавляем строки

define("LOGINAPI_DRUPAL", 236); // 236 не принципиально
$_LOGINAPI[LOGINAPI_DRUPAL] = array("title" => $_SWIFT["language"]["loginapi_drupal"], "include" => "drupal.login.php");

3. В файле {KHD}/locale/en-us/templates.php там где секция // ======= LOGINSHARE ======= добавляем строку

'loginapi_drupal' => 'Drupal',

4. Заходим под админом, раздел Templates > LoginShare > Drupal. Задаем логин/пароль/имя для Друпаловской базы.
5. В раздел Templates > Manage Template Groups, для default кнопка Settings. В пункте LoginShare в списке выбираем Drupal.

ВложениеРазмер
Иконка пакета drupal.login_.zip1.98 КБ

Комментарии

Аватар пользователя GROL GROL 8 января 2009 в 19:41

Называется, рано радовались...

В Каяке пароль хранятся в "чистом" виде, для того, чтобы юзерам его отправлять всякий раз, когда создается новый тикет. Если брать юзерские данные с Друпала, то там ведь хэш, и соответственно механизм верификации Каяки не срабатывает.

Че делать?...

Аватар пользователя GROL GROL 10 января 2009 в 14:18

Придумалось вот только дописать свой модуль для Друпала с хуком hook_user и при добавлении или обновлении юзера смотреть пароль пока его не "упаковали" в хэш.
Это для новых юзерей. А для уже существующих наверно решить проблему не удастся, посему ее надо решать каким то другим путем. Может в Друпал добавить поле в профиль, а-ля пассворд для доступа в HelpDesk? Тупо конечно...

Аватар пользователя GROL GROL 13 января 2009 в 14:38

Файл в аттаче обновил.

Поскольку сам было немного запутался с логикой поведения KHD, то опишу еще раз как работает LoginShare.
Судя по экспериментам, если включаем любой "не родной" модуль для аутентификации, то KHD не выполняет родной алгоритм проверки. Это означает, что если юзера нету в базе Drupal-а, то он не залогинится, даже если он есть в базе KHD. Это неприемлемо, особенно когда юзеры заводятся в базе KHD в результате парсинга почты и не заводятся в базе Друпала.

И так, как ведет себя написанной мною модуль:
1. Если юзер залогинился на родном сайте т.е. средствами Друпала, то модуль вытаскивает из куков сессию и по ней восстанавливает юзера из базы Друпала. Проверяет, если нету юзера в базе KHD, то заводит его там и автоматом логинится в KHD.
2. Если юзер НЕ логинился в Друпале (не зависимо, есть он или нету в базе), а сразу попадает на страницу саппорта, то он может использовать пару ящик/пароль или логин/пароль из Друпала. Если аутентификация произошла успешно, то юзер добавляется в базу KHD (если его там не было).
3. Если аутентификация НЕ удалась, производится попытка залогинится по "стандартному алгоритму" KHD, используя пару ящик/пароль.
4. Всякий раз, когда добавляется пользователь в базу KHD, ему назначается НОВЫЙ сгенерированный 8-ми значный пароль. Узнать его можно только получив по почте уведомление о новом тикете.

Для того, чтобы короткий пароль высылался юзеру при создании нового тикета необходимо в админской части выбрать Options > Manage Templates > Tickets > email_autoresponder, найти текст

<{if $settings[u_sendpw] == 1 && $user[userpasswordtxt] != "" && $user[loginapi_moduleid] == 1 && $nopassworddispatch != true}>

        <{$language[aremail]}><{$ticket[email]}>
        <{$language[arpassword]}><{$user[userpasswordtxt]}>
<{/if}>

и удалить $user[loginapi_moduleid] == 1 &&.
Если этого не сделать, то пользователи, которые отправили запрос по электронной почте, не смогут попасть на страницу с ответами на свой же вопрос, т.к. данных для входа в тикитную систему им взять неоткуда.

Заметили одну траблу. Если юзер залогинен в Друпале под одним аккаунтом, а пытается посмотреть напрямую тикет, который создан другим аккаунтом, до KHD валится.

Аватар пользователя andypost@drupal.org andypost@drupal.org 19 января 2009 в 20:04

А почему не воспользоваться перекрытием drupal аутентификации и не проверять пароль по базе KHD? Тогда и синхронизировать ничего не придется...

Аватар пользователя GROL GROL 20 января 2009 в 15:43

На эту тему я не подумал Smile
Наверно из-за того, что мозги изначально были настроены что прикручивать "каяку к друпаду" а не наоборот.
К тому же, в Друпале уже были пользователи со своими нодами, то ХЕЗ как это все линковать.

Аватар пользователя andypost@drupal.org andypost@drupal.org 21 января 2009 в 3:57

Ну если есть база друпала - то конечно придется синхронизировать, но всяко придется зводить пользователей в К. Так что можно посмотреть в сторону расширения формы логина друпала или даже взглянуть на реализацию ldap аутентификации