Мы запустили блог на «Хабре» совсем недавно, и в комментариях к первой же статье было много вопросов о том, когда и как мы планируем устранять проблему с логином на сервисах AliExpress. И сегодня я расскажу, что вообще пошло не так, как мы чинили баг(и), с чем уже удалось справиться, а что будет улучшено в будущем.
Введение: мультидоменная авторизация и при чём тут Intelligent Tracking Prevention
Как известно, сессионные секреты чаще всего хранятся в куках, а куки доступны в конкретном домене. При этом изначально все браузеры принимали куки, проставленные на сторонних сайтах, то есть не на том ресурсе, где пользователь находится прямо сейчас. С технической точки зрения это удобно: взял ajax-скрипт, дернул что-то с другого домена — и кука прочиталась/поставилась.
К сожалению, этот механизм стал основой активного слежения за пользователями веба, что не нравилось последним настолько, что был порожден целый класс плагинов к браузерам, которые предотвращали сбор данных сторонними трекерами.
Современные браузеры очень похожи по своим основным функциям, и на волне борьбы за privacy началось встраивание умных функций предотвращения слежения. Всё началось с попытки классификации сайтов на доверенные/недоверенные на основе истории посещений еще в 2017 году.
А закончилось полной блокировкой установки third-party cookies в дефолтных настройках в 2019-м. Причины введения таких правил описаны, например, тут.
Как всё это повлияло на разработчиков популярных сервисов
Массовая блокировка трекеров в первую очередь повлияла на рекламные возможности компаний по всему миру: им стало сложнее отслеживать активность пользователей для аналитики в целях таргетированной рекламы.
Но был и неприятный побочный эффект, который испытали на себе разработчики продуктов, которым функциональность third-party cookies была нужна совсем для другого. В их числе оказались и мы.
Как всё работало у нас
AliExpress.ru отличается от обычных интернет-магазинов тем, что это локализованная версия глобального AliExpress.com. В итоге русскоязычный сайт наследует/делит авторизацию от сайта в зоне .com, как и проект Tmall.
При этом флоу аутентификации устроен так: пользователь, пришедший на любой из сайтов, сначала проходит аутентификацию, а уже потом во всех доменах ему расставляются куки. Чтобы пользователю всего этого не было заметно, процесс проходит в фоне с помощью AJAX-запроса.
Данный способ вполне адекватен, и долгое время с ним не было проблем, но они начались по мере того, как популярные браузеры начали блокировать технологию трекинга с помощь пикселей. В итоге куки, проставляемые с помощью AJAX-запросов в домены, отличные от того, где находится пользователь, браузеры перестали сохранять. То есть сервер генерирует и возвращает куки, не зная, что браузер их удалил.
В итоге у пользователя работает сессия на том ресурсе, где он инициировал аутентификацию, а в двух других ее просто нет. Большая часть сервисов для русскоязычных пользователей находится в зоне .ru, и они в такой ситуации работают нормально. Но часто возникает необходимость обратиться к Tmall.ru или AliExpress.com — например, при обращении к нелокализованному сервису. И тут уже возникает ситуация, при которой залогиненный на AliExpress.ru пользователь оказывается разлогиненным в зоне .com.
Login loop
Описанная выше проблема на первый взгляд не выглядит очень уж страшно: ну попросит система пользователя авторизоваться еще раз, неудобства же на этом заканчиваются. Так бы оно и было, если бы у нас не была реализована локализация на уровне приложения. Грубо говоря, это означает, что, когда русскоязычный пользователь приходит сначала на AliExpress.com, сервис понимает: это клиент для AliExpress.ru, и редиректит его туда. Имено такой подход был реализован на главной — https://aliexpress.ru/com — и на основной странице логина — https://login.aliexpress.ru/com.
Если у пользователя был браузер, который блокирует куки, то получался замкнутый круг. Клиент приходил на aliexpress.com, его редиректило на aliexpress.ru, там он авторизовывался, попадал в личный кабинет в домене aliexpress.ru, а потом, например, пытался оставить отзыв через «оценку сделок», вызывая https://feedback.aliexpress.com.
Из-за отсутствия кук этот ресурс его не узнавал и отправлял заново логиниться на login.aliexpress.com, который по правилу локализации перенаправлял его в login.aliexpress.ru с параметрами запроса авторизации. Там сервер его уже знает: «русскоязычная» кука же сохранилась, — но из-за «подозрительной» попытки повторного логина просит подтвердить человеческое происхождение и решить капчу, а также производит стандартную простановку кук, как и при первоначальном логине. Затем по return url пользователя возращают на feedback.aliexpress.com, где снова проверяется сессия и из-за отсутствия cookie в домене aliexpress.com будет снова инциирован логин и всё повторяется снова.
Трудно придумать более раздражающего пользователя поведения сайта. И хотя проблема возникала не при покупке товаров, а при использовании сопутствующих фич вроде создания отзыва или проверки трека посылки, хорошего во всем этом было мало.
Как мы решали проблему
Первый шаг: мы отключили редирект login.aliexpress.com<->login.aliexpress.ru для локализации на уровне приложения. Таким образом мы дали возможность повторно авторизоваться и воспользоваться всеми сервисами. Данный шаг сам по себе не является решением основной проблемы авторизации, но исправляет ошибку полной недоступности сервисов из-за login loop. Тем самым мы смогли снять острую фазу проблемы для примерно 5% всех пользователей aliexpress.ru, попадавших в login loop.
На втором этапе мы решили саму проблему с дропающимися куками. Для исправления ситуации нам пришлось внепланово заняться изучением механизмов авторизации, которые изначально не входили в план локализации.
Контроль сессии изначально относится к уровню платформы глобальной Alibaba, и локализация этого сервиса не предполагалась поначалу (что и как мы сделали и будем делать в этом плане, описано в нашей предыдущей статье). В итоге authentication flow был доработан. Пришлось отказаться от silent-режима с помощью ajax-запросов в пользу редиректов, что потребовало определенного времени.
Почему чинили так долго
Самой большой проблемой было то, что механизмы контроля сессии не входили в план локализации и пришлось изучать проблему без возможности «поковырять» сам исходный код.
Для исправления необходимо было поправить не только authentication flow, но и все фронтовые приложения, которые вызывают аутентификацию. Так как исправлять пришлось не локализованные сервисы, то здесь потребовалось взаимодействие с коллегами из глобальной Alibaba, инженерная команда которой расположена в Китае.
При этом для платформы Alibaba эта ошибка в целом некритична, потому что в ней не используются мультидоменные приложения. Если проблема аффектит около 0,25% клиентов в целом, то ее трудно считать критичной. Это значит, внимание к ней не на высоком уровне и апдейты выкатываются не так быстро, как хотелось бы всем причастным к локализованной версии продукта.
Заключение: что мы будем делать дальше
Несмотря на то что основные проблемы уже решены, в бэклоге нашей инженерной команды еще достаточно задач. В нашем to-do:
Исправить все одностраничные приложения, которые не позволяют обновиться при авторизации. К сожалению, тут потребуется более глубокая переработка механизмов контроля сессии и передачи секретов.
Доделать все патчи для logout (да-да, на выходе есть такие же проблемы, но не в таком масштабе).
И вместо заключения немного статистики:
3d-party cookies отключены примерно у 25% клиентов AliExpress;
на текущий момент не более 4% логинов осуществляется через непропатченные точки входа, которые не ставят куки в других доменах;
90% сценариев таких логинов не предусматривают дальнейшего перехода из *.aliexpress.ru в *.aliexpress.com
На сегодня всё, спасибо за внимание! Буду рад ответить на вопросы в комментариях.
P. S. Валя, Егор, Георгий, Юра и jsoN – огромное вам спасибо за помощь в решении проблем!
merlin-vrn
Скажите, а можно так сделать, чтобы меня никогда-никогда не перекидывало на aliexpress.ru и никогда-никогда не переключало интерфейс на русский язык и никогда-никогда не активровало этот идиотский автоперевод? Я хочу использовать исключительно aliexpress.com и исключительно на английском языке, он и английский-то там иногда не очень, а уж вместе с автопереводом это… Очень задолбало.
anatolix
Мы наверное чуть позже сделаем отключение перевода на aliexpress.ru, или двойное название. Но как то сделать на aliexpress.com — не знаем, его в китае пишут, вам надо в Alibaba обращаться. Про фикс настроек на .ru я надеюсь будет следующий пост.
merlin-vrn
Куда там обращаться-то? Я весь faq излазил, во все места, куда можно что-то написать, про это писал. Даже вроде в постскриптуме жалобы на продавца, который продал что-то палёное, и "aliexpress steps in". Встроенный "помощник" Eva там знает только про то, что делать, если заказ не пришёл или что-то с ним не так. Ну так это и я сам знаю, что делать. Про использование сайта абсолютно ничего и нигде не написано. А половина ссылок с контактами и тому подобным перекидывает на сайты вообще на китайском, я там теряюсь.
aamonster
Бесполезно. Я выносил мозг их саппортерам ещё когда чат работал – эффекта ноль. А теперь я не уверен, что до чата с живым саппортером реально дойти.
Temtaime
Реально, проверял недавно и работает
https://amp.reddit.com/r/Aliexpress/comments/gtlr7r/1_trick_to_bypass_eva/
anatolix
Слушай если по-честному я согласен, до поддержки там можно еще добраться, до разработки нет. На самом деле если бы в китае можно было бы сделать продукт для России совместного предприятия бы не было.
В смысле к тому, кто хочет каких-то улучшений на .com — скорей всего из не будет.
С другой стороны на .ru мы постараемся сделать все, что вам нужно от .com, вам же не имя домена важна, а функциональность?
andy_panda
У китайцев вот всё плохо, но мы не китайцы - сделаем всё хорошо. А китайцы знают, что вы их тут грязью поливаете!? Скиньте им ссылочку тоже. Почему вообще нужно было менять домен на .ru? Почему нельзя было как в других странах просто сдедать ru.aliexpress.com? Свой особый русский (некитайский) путь!? Проблем бы вообще в принципе с логином тогда не возникло.
anatolix
Я написал выше уже. Потому что домен должен принадлежать другой компании. С приложением то де самое. Если нравится .com пользуйтесь, нам все равно у нас деньги разделены по стране заказа а не сайту, просто не просите от нас изменения на .com делать - мы этим не занимаемся и не хотим.
aamonster
Проблема в том, что aliexpress.ru мешает пользоваться aliexpress.com.
Говоря формальным языком – aliexpress.ru использует уязвимость на aliexpress.com, чтобы выставить редирект на себя.
Если от этого избавиться – можно будет спокойно пилить aliexpress.ru, никому не мешая. Допилите до функционального состояния – можно будет начать пользоваться им.
aamonster
Имя вообще несущественно, да.
Но может, пора признать, что вы тоже не в состоянии за разумное время решить проблему, и просто реализовать workaround? Напомню из переписки:
anatolix
А мы и не отрицаем. У нас каждая страничка сейчас как отдельный сайт, мы правда понятия не имеем где там куки портятся
aamonster
А вы не можете просто на своей стороне отключить выставление соответствующей куки?
Проблема-то в том, что посещение сайта aliexpress.ru «заражает» браузер (ставит куку или что там).
Отчасти решается выставлением в /etc/host строчек вида
0.0.0.0 aliexpress.ru
– но это так себе решение.
anatolix
Нет мы не управляем выставлением кук на .com домене. И с точки зрения продукта тоже не считаем это правильным. У нас десятки миллионов пользователей из которых английский знают 1-4%
aamonster
aliexpress.com не выставляет куки сам по себе. Пока я нахожусь на нём – он на английском. Чтобы сломать сайт – требуется именно зайти на aliexpress.ru (или другой национальный домен алиэкспресса).
Upd: похоже, ситуация несколько изменилась: кука выставляется не сразу, нужно походить по страничкам aliexpress.ru. Закономерность пока не понял.
Может, вы хотя бы знаете, как именно aliexpress.com команда сменить язык даётся? Набросаю на коленке extension, который это будет запрещать и заодно в лог запишет, откуда вылезло.
anatolix
> Набросаю на коленке extension, который это будет запрещать и заодно в лог запишет, откуда вылезло.
тут внизу уже линковали extension где-то.
amarao
Присоединяюсь. Особенно это нелепо на Кипре, где от .ru пользы никакой.
anatolix
Вот почему вас на кипре редиректит на .ru вообще без понятия если честно, это не наша даже страна, если вам не лень сделайте нам запись сессии в Chrome, я попрошу китайцев посмотреть.
marks
Меня вот в Испании редиректит на .ru Вообще каша получается из русского, английского и испанского порой. Профиль — на испанском, товары — на русском, на английский только принудительно и ненадолго.
andef Автор
перешлите плз ваш рег email в ЛС? посмотрю обязательно
amarao
Проблема возникает, если кто-то скинул ссылку на ru домен хоть раз. После этого Али (основной) пытается показывать всё по-русски. Это переключаемо, но очень раздражает.
Т.е. зайдите на ru при наличии логина на основном али, и повторный заход на com вызовет всё на русском.
merlin-vrn
Вот именно так, да. У меня ещё всякие акции всегда ведут на .ru, и иногда (так и не понял, в каких случаях) ссылка на личный кабинет и прочее тоже направляет на .ru, даже если я сейчас зашёл на .com и меня не перекинуло. И, соответственно, они тоже "заражают" браузер.
sw0rl0k
Подтверждаю. Но это касается не только зоны ru. Это скорее «фича» глобального алиэкспесса. Если Вам скинут ссылку на какой-нибудь fr.aliexpress.com, то сайт всегда будет редиректить на французскую локализацию, пока вручную не поменяешь язык.
roller
Где то кажется даже видел плагин для хрома чтобы все .ru ссылки алика переписывались на com
Areskoi
Согласен. Тоже использую .com верию исключительно на английском. Любой переход по ссылке товара в домене .ru переключает мои настройки на русский и редиректит другие переходы с .com на .ru. Я даже скриптик в TamperMonkey набросал для сайта, где пользователи часто делятся ссылками на .ru версию, чтобы он ссылки на .com менял.
akorovin
так делают все локализованные страницы aliexpress
попробуйте например после французской или португальской вернуться на aliexpress.com
fr.aliexpress.com
pt.aliexpress.com
juray
хммм. Интересно, почему в этих случаях переключается домен третьего уровня, а для русского — первого. Не ru.aliexpress.com, а aliexpress.ru.
Pavel_The_Best
Вероятно, хранение персональных данных в РФ
juray
тоже вариант…
anatolix
На самом деле для хранения персональных данных в россии не нужен домен, нужен дата центр, они есть - несколько. Домен можно 1000 способов настроить как надо, чтобы в Россию приводил.
Ответ там проще - домен xxx.aliexpress.com принадлежит той же компании, что и aliexpress.com те aliexpress global. А домен aliexpress.ru - нам. Для всяких юридических штук важно кому принадлежат домены, интеллектуальная собственность и тп.
AllexIn
Есть легкое ощущение, что лучше бы вас вообще не было. Нормально всё работало пока долбанная локализацованная версия в зоре ru не появилась.
anatolix
Ок, спасибо за интересное мнение. Постараемся его не оправдать. Но справедливости ради локализация появилась сильно до нас
AllexIn
Верно подмечено. Исправил. Проблемы начались именно когда появился сайт в ru зоне. Мне как покупателю пока совершенно не понятно зачем вы нужны.
drdiz
+1!!!
darkdaskin
По этой причине я уже давно перешёл на мобильное приложение, там язык можно выбрать раз и навсегда. Единственное языковое неудобство — все отзывы к товарам переводятся на английский, но там хотя бы можно тыкнуть Show Original на каждом. Изредка русский язык просачивается во всяких промо, но это уже не мешает. К слову, возможность выбрать язык, отличный от системного, появилась в приложении не так давно, как раз после того как я попросил об этом в отзывах.
Дополнительные плюсы мобильного приложения — никогда не слетают авторизация и партнёрский кэшбек.
С компьютера захожу теперь только чтобы сравнить несколько товаров, которые я предварительно накидал в корзину, либо по ссылкам с других сайтов.
Проблема с языками в браузере частично решается с помощью расширения Redirector с парой правил.
extempl
Только мобильное приложение невозможно фильтровать в плане слежки. После сёрфинга в приложении потом начинается шквал писем, что я забыл, где там "скидка" и что обязательно прямо сейчас нужно купить.
teallite
Для Firefox есть решение в виде аддона Global Aliexpress.