Что значит разлогинить аккаунт
Релогин и HTTP Basic Auth
Вэб разработчикам давно известна проблема разлогина и перелогина на сайтах, защищённых HTTP Basic Authorization. И хотя существуют другие методы аутентификации, не страдающие от этой проблемы, до сих пор Basic Authorization зачастую является наиболее оптимальным выбором. В сети хватает материалов, описывающих различные общие и частные решения. Но все они, найденные мной, к сожалению, описывают только какие-то частичные решения, работающие в одном браузере и не работающие в другом. Под катом привожу обобщённый конечный результат своего исследования этой проблемы
Сразу оговорюсь, что я не фронтенд-разработчик, и во всё многообразие «брендов» и версий браузеров не углублялся. Только мейнстримовые с версиями, актуальными на момент написания статьи. Для большинства вэб-задач этого достаточно. Для тех же разработчиков, кому нужна поддержка всего «зоопарка» браузеров, статья может стать хорошей отправной точкой
Суть проблемы в том, что стандартом HTTP Basic Authorization не предусмотрена возможность разлогина. Вообще. При заходе на страницу, защищённую Basic Authorization, браузер сам выводит вам своё собственное окно с запросом на логин/пароль и при успешном логине сохраняет их где-то у себя в глубинных недрах. Затем все последующие запросы к другим защищённым страницам данного сайта автоматически использует эти значения в заголовке Authorization:
Authorization: Basic bm9uZTpub25l
где bm9uZTpub25l — это base64-кодированная связка логин/пароль none:none (у вас логин и пароль, возможно, будут другие)
Для того, чтобы перелогиниться, нужно всего лишь сбросить значения старых логина/пароля в тех самых глубинных недрах браузера и на их место записать новые. Вот тут нас и поджидает сюрприз. Поскольку никакой стандарт не регламентирует это действо, каждый браузер творит это по своему собственному разумению.
Хуже того, поскольку окно запроса логина/пароля является собственным окном браузера, реагирующее уже на одни только HTTP заголовки страницы, это окно всплывает до какой бы то ни было обработки тела страницы. То есть выполнить какой-нибудь javascript при получении ответа сервера со статусом 401 не получится. Перед пользователем снова и снова будет вылезать это окно с повторным запросом на логин/пароль.
На самом деле этот момент критичен, так как почти для всех браузеров единственным способом разлогиниться является отправка на сервер запроса с заведомо неправильными логином/паролем, получение ответа сервера со статусом 401 и последующий сброс браузером своего логин/парольного кэша. Но если при этом браузер не даёт вам обработать ответ 401 и продолжить процесс логина уже для нового пользователя, перехватывая управление ещё на этапе чтения HTTP заголовков и выкидывания вам в лицо ту самую форму авторизации, в которую что ни вводи, работать не будет, то это уже проблема. Причём не имеет значения, обычный ли это запрос по ссылке или XMLHttpRequest или fetch. Браузер всё равно перехватывает управление на этапе разбора заголовков.
Исходные данные:
Internet Explorer
В нашем продукте не требуется поддержка этого браузера, поэтому решение мною лично не тестировалось. Тем не менее, как утверждает гугл, решение для него есть, и оно, пожалуй, самое простое и элегантное из всех. Более того, я нигде не встречал информации, что это решение для браузеров от Microsoft утратило актуальность:
В IE существует метод ClearAuthenticationCache, который сбрасывает «те самые глубинные недра». Просто и элегантно. И никаких плясок со вспомогательной страницей 401. Работает ли данный метод в Edge, не знаю. Скорее всего да.
Конструкция document.execCommand возвращает true, если метод существует и «сработал». После чего window.location.assign(url) перенаправляет пользователя для ввода новых логина и пароля
Firefox (72.0.1)
В контексте нашей задачи это самый проблемный браузер. Для него полноценного решения не существует до сих пор. В баг-трекере команды его разработчиков вот уже лет 15-20 висит запрос на указанную проблему. Но «воз и ныне там». Максимум чего можно добиться — это кривой разлогин.
Вводные данные:
Firefox не сбрасывает парольный кэш после получения ответа 401 ни через XMLHttpRequest, ни через fetch запрос. Только через обычный запрос с указанием логина/пароля в самом URL. То есть что-то вроде
После чего пользователь получает форму ввода логина/пароля, в которую что ни вводи, она будет выскакивать вновь и вновь. Дело в том, что введённые значения не будут переопределять значения логина/пароля, заданные в URL-е. То есть вместо введённых значений на сервер всякий раз будет уходить связка none:none. И чтобы перелогиниться под другим именем, пользователь должен нажать отмену, перейти на стартовую страницу (http ://mysite.com/) и уже там ввести новые логин/пароль.
Криво? Но увы, другого решения нет
Google Chrome (79.0.3945.88)
Для Хрома замечательно работает метод fetch. А вот XMLHttpRequest не работает ((( Кэш не сбрасывается, и разлогина не происходит. Причём пробовал логин/пароль задавать и как параметрами к методу open, так и установкой заголовка.
Делаем fetch запрос на страницу 401 с заведомо неверными логином/паролем, получаем ответ 401 от сервера, браузер сбрасывает свой кэш.
ВАЖНО! Сервер НЕ должен возвращать заголовок WWW-Authenticate. Иначе браузер перехватит управление, и перенаправления со страницы 401 не произойдёт никогда. По общепринятому соглашению сервер не должен возвращать этот заголовок, если в запросе указано X-Requested-With: XMLHttpRequest. Поэтому в запрос добавлен заголовок X-Requested-With.
Safari (12)
Для Сафари ситуация в точности до наоборот: работает XMLHttpRequest, но не работает fetch
Действия те же, что и в Хроме, только через XMLHttpRequest
Должно работать для версий Сафари 6+. В более ранних версиях были свои баги. В частности, например, в версиях от 5.1 при каждом перенаправлении браузер принудительно перезапрашивал авторизацию, из-за чего авторизация с перенаправлением на конечную страницу не работала в принципе. А в версиях до 5.0 не работал разлогин.
Что значит разлогинить аккаунт
Заходит однажды тестировщик в бар.
Танцуя, проникает в бар;
999999999 кружек пива,
qwertyuip кружек пива.
Рекомендуемое сообщество
Пикабу в мессенджерах
Активные сообщества
Тенденции
Это снова я. И я не разлогинился.
Наверно многие задавались вопросом, получила ли смена клятвенно обещанные печеньки?
Но меня мучает совесть, ведь ночь темна и лишена сладкого к чаю.
А дабы подкрепить мои намерения, можете меня промотивировать!
Всем привет! Меня зовут Кирилл и я не разлогинился на Пикабу!
В связи с этим передаю пламенный привет дневной смене. Она у нас самая элитная, поэтому к следующей пересменке принесу им печенек и сделаю фотоочет, дабы не быть голословным :3
Внимательность и аккуратность 🙂
Разлогиниваться надо не забывать :))))
Все скидки и промокоды в одном месте
Вы там как, готовы к осенним распродажам? Чтобы не пропустить самые интересные и выгодные предложения, подпишитесь на полезный телеграм-канал Пикабу со скидками. Да, Пикабу не только для отдыха и мемов, но и для экономных покупок!
В «Пикабу Скидки» вы найдете актуальные предложения:
• доставки еды (KFC, Delivery Club, «Папа Джонс»);
• книги («Читай-город», «Литрес», Storytel);
• услуги и сервисы («Делимобиль», Boxberry, «Достависта»);
• маркетплейсы и гипермаркеты (Ozon, «Ашан», «Яндекс.Маркет»);
• одежда и обувь (Adidas, ASOS, Tom Tailor)
• бытовая техника и электроника («М.Видео», «Связной», re:Store);
• товары для дома (IKEA, «Леруа Мерлен», Askona);
• косметика и парфюмерия («Л’Этуаль», «Иль де Ботэ», Krasotka Pro);
• товары для детей («Детский мир», TOY, Mothercare);
• образование («Нетология», GeekBrains, SkillFactory);
Проверка на множественные авторизации под одним логином. Как?
Здравствуйте!
Есть самописный сайт с платным просмотром видео.
Как запретить несколько авторизаций с разных компов под одним логином?
Перелопатил интернеты, один из вариантов реализации следующий: при авторизации записываем тайм-штамп в БД и в переменную, на закрытой странице регулярно проверяем соответствие этих штампов и при различии разлогиниваем первого пользователя. Т.е. если под этим логином зайдет еще пользователь, то в БД тайм-штамп перепишется и первого пользователя выкинет.
Насколько я понимаю это создаст нагрузку на БД, но как я понял не критичную. Одновременно пользователей будет до 100.
Теперь вопросы.
Как сделать проверку тайм-штампов раз в минуту например? Покажите кусок кода, а то не могу понять куда копать дальше. Часть кода именно которая запускает запрос в БД регулярно и сравнение. Сам запрос и сравнение сделать могу.
Как разлогинить пользователя? Не просто разлогинить, а принудительно перекинуть на другую страницу или обновить текущую, т.к. даже если сделать логаут видео будет все равно проигрываться. Т.е. если тайм-штампы различаются, убиваем сессию и принудительно перегружаем страницу, а после перезагрузки и без сессии контент уже будет недоступен.
И вопрос по определению пользователя онлайн. Когда он двигает мышкой, переходит по ссылкам и т.д., тут все понятно, в js эти обработчики есть. А если он смотрит видео? Т.е. мышь не активна, клавиатура не активна. Активна только вкладка и открыт браузер (или браузер свернут вниз или открыта другая вкладка, но браузер не закрыт). Как определить, что пользователь все еще на сайте?
Проверка на множественные авторизации под одним логином. Как?
Здравствуйте!
Есть самописный сайт с платным просмотром видео.
Как запретить несколько авторизаций с разных компов под одним логином?
Перелопатил интернеты, один из вариантов реализации следующий: при авторизации записываем тайм-штамп в БД и в переменную, на закрытой странице регулярно проверяем соответствие этих штампов и при различии разлогиниваем первого пользователя. Т.е. если под этим логином зайдет еще пользователь, то в БД тайм-штамп перепишется и первого пользователя выкинет.
Насколько я понимаю это создаст нагрузку на БД, но как я понял не критичную. Одновременно пользователей будет до 100.
Теперь вопросы.
Как сделать проверку тайм-штампов раз в минуту например? Покажите кусок кода, а то не могу понять куда копать дальше. Часть кода именно которая запускает запрос в БД регулярно и сравнение. Сам запрос и сравнение сделать могу.
Как разлогинить пользователя? Не просто разлогинить, а принудительно перекинуть на другую страницу или обновить текущую, т.к. даже если сделать логаут видео будет все равно проигрываться. Т.е. если тайм-штампы различаются, убиваем сессию и принудительно перегружаем страницу, а после перезагрузки и без сессии контент уже будет недоступен.
И вопрос по определению пользователя онлайн. Когда он двигает мышкой, переходит по ссылкам и т.д., тут все понятно, в js эти обработчики есть. А если он смотрит видео? Т.е. мышь не активна, клавиатура не активна. Активна только вкладка и открыт браузер (или браузер свернут вниз или открыта другая вкладка, но браузер не закрыт). Как определить, что пользователь все еще на сайте?