Обложка: Сквозная LDAP аутентификация, которая не получилась

Сквозная LDAP аутентификация, которая не получилась

Эту историю наш пользователь рассказал в рамках участия в конкурсе, посвящённому #фичавгусту, который мы проводим вместе с OTUS.

Лет 7 назад меня взяли ведущим программистом Java в один из крупнейших телеком-операторов. Мне предстояло разрабатывать приложение для менеджеров/сотрудников компании, где они ведут свои дела: заводят заявки, записывают клиентов, управляют услугами и пакетами, что-то согласовывают и т.п. В общем такой самодельный CRM федерального масштаба.

Опыта тогда у меня было немного (1,5 года QA Automation). Но программистов опытнее в команде первое время не было. И вот на первом же планировании ко мне приходят с пачкой задач, чтобы я выставил им оценки.

Одной из таких задач была сквозная аутентификация LDAP с сервером Active Directory, чтобы пользователи не вводили пароль при входе в приложение, единожды привязав свою учётку Windows. Немного подумав, я указал, что потребуется всего лишь 5 дней. Тогда я не осознавал всей сложности оценки задач и тленности бытия, но заботливый project manager увеличил срок до 10-15 дней. Да, тогда ещё не было модных story points, мы водопадили как могли.

Разработка тихого монстра

Задача прилетела в работу через месяц. К этому времени я уже немного размялся на формошлёпстве и почитал про LDAP. Первый прототип получился за 1-2 недели.

Он состоял из небольшого количества JS-кода и двух простейших AJAX-запросов на фронте, а также одного простенького servlet’a на бэке. Использовал я SPNEGO/Kerberos, найдя какую-то захудалую JAR’ку в интернете.

При входе пользователя в систему его перекидывало на login-форму, там то фоном и шёл один из AJAX-запросов, который проверял, кто пришёл и привязана ли его учётка Active Directory к учётной записи в приложении.

Если не привязана, то это можно было сделать в разделе «Профиль», где и был второй AJAX-запрос на валидацию и привязку учётной записи. После этого при последующем входе на форме логина не надо было вводить пароль, пользователь в принципе уже не замечал эту форму, т.к. аутентификация быстро отрабатывала и происходил редирект на главный экран приложения.

Прототип заработал локально и на dev-стенде. Он даже уже заработал у всех трёх программистов в кабинете и у аналитика из соседнего кабинета. Поэтому мы решили, что дело идёт к релизу. Но вдруг выяснилось, что у PM’a ничего не работает, а он территориально находился в Перми в то время как мы находились в Екатеринбурге. Мы по классике схлестнулись в битве «Но на моём компе же работает!», тем более таких компьютеров было аж 4.

Так, протестировав нашу поделку на ещё нескольких людях из разных регионов, мы уже поняли, что у нас может быть не один домен AD, а несколько, под каждый регион свой, и домены могут быть двух-, трёх-, четырёхуровневыми. С этими познаниями и ощущениями боли мы ушли ещё на 2-4 недели доработок. В итоге мы худо-бедно прошли ПСИ, на котором были некоторые проблемы несовместимости с IE, и пошли с нашей классной фичей и некоторыми доработками в ПРОМ.

Серые тучи несовместимости

Теперь начинается то, ради чего я вообще и решил рассказать эту историю. В первый же день после релиза жизнь моя омрачилась и пропиталась серостью и болью. Всё вокруг потемнело, обедать я стал с чувством некоторой обеспокоенности.

У большинства пользователей фича не просто не работала, но и крашила все приложения. В основном это было связано с очень старыми версиями IE и Windows на компьютерах сотрудников. Ведь тестировал-то всё это дело ИТ-отдел, а у нас у всех свежая винда, обновления, браузеры.

Всё омрачалось тем, что основным разработчиком приложения был крупный подрядчик, который при любом удобном случае указывал, что мы совсем безалаберные орки, которые всё тут сломали, а они высшие эльфы.

Так вот, поговорим про баги и их фиксы или безысходность.

  • Кого-то из пользователей просто бесконечно редиректило по кругу на странице login’a. Был написан фикс, который отслеживал такие частые редиректы и правил хедеры в запросе и дальнейшую логику поведения.
  • Кто-то не мог заводить заявки и работать с документами. Всё это происходило, т.к. IE начинал пихать ненужные хедеры аутентификации в запросы к статике и бэку (это было видно по логам nginx) и сам же от этого помирал. Были и другие проблемы совместимости.
  • Но были и те, у кого всё хорошо работало, но не работала сама сквозная аутентификация, а они её очень хотели, удобно же — залогинился в Windows и больше ничего вводить не надо, киллер фича!

Каждый день мы собирались на совещания с видеосвязью, и пользователи стримили нам свою боль. Через месяц таких мучений был написан подробный гайд о том, как настроить свой IE или Chrome для успешной работы, какие галочки снять, какие поставить, какие настройки поменять в ОС. Занимал он примерно две страницы в Word-документе.

В итоге со временем какие-то баги ушли, с какими-то люди научились жить и ловко работать в нескольких окнах браузера, копируя ссылки, вырезая какие-то параметры из строки и т.д. Но порой мы всё так же собирались, смотрели на чей-то квадратный экран и то как там ничего не работает. Со временем был написан тогл, который отключал все попытки фронта к LDAP-аутентификации. Он был включен по умолчанию, но пользователь мог его выключить. Однако IE и в таких случаях как-то удавалось ломаться.

За всё время работы в компании я периодически мониторил метрики использования данной фичи. Вроде как успешно ей пользовалось не более 5-10% пользователей. Надеюсь, теперь у большинства пользователей эта аутентификация работает. Или хотя бы не мешает им жить. Ещё надеюсь, что я немного сгустил краски и на самом деле всё было не так плохо.

В итоге эти запланированные 10 дней вылились в 1-2 месяца насыщенной разработки и настройки и ещё в полгода-год болезненной поддержки.

***

Эту историю наш пользователь написал в рамках участия в конкурсе, посвящённому #фичавгусту, который мы проводим вместе с OTUS. Его участники рассказывают на страницах нашего сайта про самую интересную/смешную/странную/тупую фичу, которую вам доводилось реализовывать. Победителей мы выберем по рейтингу, который будет сформирован на основании оценок пользователей и редакции сайта.

Если вам понравилась эта история, проголосуйте за неё.

Под постом есть блок с реакциями. Если история вам понравилась, ставьте палец вверх. Только эти реакции будут учитываться при составлении рейтинга. Другие эмоции подсчитываться не будут.

А вот история другого участника — он написал кастомный шрифт ради одного символа. Но сначала неделю страдал.