Forum Webscript.Ru
Программирование => PHP => Тема начата: CGVictor от 17 Апреля 2004, 14:17:59
-
Пишу авторизацию. Сессии.
Получение входных данных - $PHP_AUTH_USER и PW. То есть "HTTP 401 Unauthorized"
Со входом все в полном порядке.
Устанавливаю в переменной сессии флаг авторизованности.
А вот как реализовать выход?
Проблема вот в чем:
- если сбрасывать флаг авторизованности - то при дальнейшей работе юзера остается открытая сессия и тянется PHPSESSID. Что некрасиво и неправильно.
- а если уничтожать сессию, то при обращении к скрипту авторизации браузер снова передает $PHP_AUTH_USER и PW. То есть выйти получается невозможно - тут же происходит новая авторизация. Бродилка, похоже, ориентируется по "HTTP 401" и снова передает логин и пасс.
Как запретить ей (бродилке, браузеру) это делать?
[off]Использовать отдельную страничку с формой ввода - не пойдет. Заказчик "окошко с паролем" хочет..[/off]
-
Мануал (http://www.php.net/manual/en/features.http-auth.php):
Both Netscape Navigator and Internet Explorer will clear the local browser window\'s authentication cache for the realm upon receiving a server response of 401. This can effectively "log out" a user, forcing them to re-enter their username and password. Some people use this to "time out" logins, or provide a "log-out" button.
-
Пишу авторизацию. Сессии.
Получение входных данных - $PHP_AUTH_USER и PW
глупость.
обоснуй.если сбрасывать флаг авторизованности - то при дальнейшей работе юзера остается открытая сессия
Это еще с какой радости?!
Кто тебя заставляет сессию стартовать?
Как запретить ей (бродилке, браузеру) это делать?
никак, расслабься.
Использовать отдельную страничку с формой ввода - не пойдет. Заказчик "окошко с паролем" хочет..
выводи яваскриптом.
-
[OFF]RomikChef
Меня оклеветали! :D[/OFF]
-
FreeSpace:
Both Netscape Navigator and Internet Explorer will clear the local browser window\'s authentication cache for the realm upon receiving a server response of 401.
Бред. Говорю же, не работает.
RomikChef:
глупость.обоснуй.
В чем именно - в сессиях или PHP_AUTH_USER?
RomikChef:
Кто тебя заставляет сессию стартовать?
Мне показалось, так проще. Как нужно делать?
RomikChef:
выводи яваскриптом
:) Придется...
-
CGVictor:
В чем именно - в сессиях или PHP_AUTH_USER?
в соединении этих двух механизмов.
CGVictor:
Мне показалось, так проще. Как нужно делать?
как-как?
стартовать сессию, если нужна, и не стартовать - если не нужна
-
RomikChef:
в соединении этих двух механизмов.
А что в этом особо паршивого? В Http_Auth_Basic пароли летят практически прямым текстом. Чтобы не передавать их при каждом обращении, лучше, мне кажется, пользоваться сессиями...
RomikChef:
стартовать сессию, если нужна, и не стартовать - если не нужна
Нет, с этим как раз все ясно. Если авторизация проходит нормально, то сессия нужна (пользователь же дальше по админзоне гуляет). Но потом-то он в любом случае из нее выйдет. Поэтому сессия нужна, т.к. выйти из админзоны можно только если предварительно в нее войти :)
-
CGVictor:
Http_Auth_Basic пароли летят практически прямым текстом. Чтобы не передавать их при каждом обращении
ХА ХА ХА
Тупить-то не надо.
Ты сам-то понял, что сказал?
Ты можешь привести причину, по которой браузер НЕ будет посылать пароли с каждым запросом? Потому, что они тебе не нужны? Ты ему на ушко шепнешь, да?
И даже несмотря на это смехотворное заблуждение, в ответе все равно нет никакой логики. При чем здесь вообще пароли?
Бред - использовать НТТР только для вывода окошка
-
CGVictor:
Поэтому сессия нужна, т.к. выйти из админзоны можно только если предварительно в нее войти
Мальчик, ты тормоз?
что мне за дело до твоих зон?
То тебе не нравится, что у тебя там что-то тянется, тебе задают законный вопрос - а зачем ты сам тянешь, и в ответ начинаются рассказы про какие-то зоны. эрогенные.
-
RomikChef:
Тупить-то не надо.
Ценное замечание.
RomikChef:
Ты можешь привести причину, по которой браузер НЕ будет посылать пароли с каждым запросом?
Потому что я от него их не прошу. После того, как я получил PHP_AUTH_USER, мне логин/пароль, в принципе, не нужны. Ибо есть сессия, где написано, что юзер авторизован. И с какой радости браузеру мне их слать? Он их и не шлет - проверял.
А как ему обьяснить, что не надо слать пароли автоматически на повторное появление "HTTP 401"?
[off]RomikChef:
При чем здесь вообще пароли?
И кто тупит после этого?[/off]
-
CGVictor:
А как ему обьяснить, что не надо слать пароли автоматически на повторное появление "HTTP 401"?
ну так не допускай повторного появления 401.
Или это выше твоего понимания?
-
Мальчик просто не понимает, как работает НТТР авто.
И еще ерепенится.
когда узнает (а он же у нас круче вареных яиц), тогда и просветление ему будет.
А тема закрывается в силу полной своей бессмысленности.
-
CGVictor:
Он их и не шлет - проверял.
не забудь проверить еще раз, чудик
-
CGVictor:
а если уничтожать сессию, то при обращении к скрипту авторизации браузер снова передает $PHP_AUTH_USER и PW.
Хе хе.
Вот этот забавный момент за всеми ляпами остался мной незамечаенным.
То есть, чувачок прилепил свой код в виде заплатки к некоей готовой НТТР авторизации.
И пихает из сессии в серверные переменные логин и пароль, как будто они пришли при авторизации.
Больше ничем эту цитату объяснить нельзя.
Разве что, некими телепатическими способностями браузера, который самостоятельно узнаёт, когда нашему другу нужен пароль
Не, я, все-таки, сейчас с него уписаюсь :-)
-
RomikChef:
Не, я, все-таки, сейчас с него уписаюсь :-)
Ромик, я все-таки закрываю глаза на весь тот флейм, который ты тут устроил.RomikChef:
не забудь проверить еще раз, чудик
Да запросто. Результат - тот же.
RomikChef:
И пихает из сессии в серверные переменные логин и пароль, как будто они пришли при авторизации.
Ерунду говорить не надо.
Короче, ладно. Если ничего толкового сказать не можешь - RomikChef:тема закрывается
А мне, похоже, придется делать отдельную страничку с формой.
-
CGVictor:
Ерунду говорить не надо.
нет уж, давай разбернемся, родной :-)
Итак, как ты объясняешь вот эту свою фразу:CGVictor:
а если уничтожать сессию, то при обращении к скрипту авторизации браузер снова передает $PHP_AUTH_USER и PW.
Какая связь между сессией и нттр авторизацией?
С какой это радости браузер сразу кидается передавать $PHP_AUTH_USER после того, как ты уничтожаешь сессию?
Как ты объясняешь данное поведение браузера.
Окей, я сказал ерунду.
Жду твоего пояснения.
CGVictor:
А мне, похоже, придется делать отдельную страничку с формой.
Это не вопрос.
Но, как ты мог бы заметить, еня не устраивает, когда клиент уходит с готовым ответом, но с тем же отсутствием знаний в голове, с которым и пришел.
Так что давай разбираться.
На будущее пригодится.
-
RomikChef:
Так что давай разбираться.
На будущее пригодится.
Абсолютно согласен.
Итак:
RomikChef:
С какой это радости браузер сразу кидается передавать $PHP_AUTH_USER после того, как ты уничтожаешь сессию?
Когда я уничтожаю сессию (с флагом авторизации), то мой код вполне справедливо считает пользователя неавторизованным. Потому что так оно и есть.
Когда к моему скрипту обращается пользователь, для которого нет открытой сессии - скрипт выдает "401", неавторизован.
И вот здесь - ключевой момент. Допустим, пользователь зашел один раз. Ввел входные данные. Вышел. Сессия для него уничтожается, пользователь (для простоты работы) перекидывается на главную страницу сайта и т.д.
При повторном обращении к скрипту с авторизацией скрипт выдает браузеру "401", чтобы пользователь указал входные данные снова.
А браузер, ориентируясь что "здесь уже была авторизация", снова передает скрипту те данные, которые он(пользователь) вводил в первый раз. Причем у пользователя ничего не спрашивает.
Вот. А мне нужно, чтобы при повторном обращении браузер снова запросил логин-пасс (т.к. пользователь может быть другой!).
-
гуглуем.
Вторая ссылка на $PHP_AUTH_USER
http://ru.php.net/session_destroy
комментарий 3.
Оно?
-
ThE0ReTiC:
http://ru.php.net/session_destroy комментарий 3.
Оно?
Не оно. У меня немножко по другому, да и не в этом суть.
Проблема все равно остается.
[off]* Начинаю думать: а может, это проблема браузера? Слишком всё неправильно получается[/off]
-
CGVictor
Это проблема не браузера, а твоего непонимания механизма работы Basic-аутентификации.
Ты должен чётко понять, что механизм аутентификации и сессии - это два абсолютно разных понятия. Они между собой никак не связаны и работают независимо друго от друга.
Если ты поймешь это, то для тебя станет очевидным, что проблема у тебя не с сессиями, а именно с аутентификацией.
Мануал (а наверняка и спецификация HTTP, но я не проверял) говорит, что однажды получив от пользователя верную связку username / password, браузер запоминает её, а затем передает в каждом следующем запросе к этому же серверу (на самом деле, если не ошибаюсь, там есть заморочки с реалмами, но я не хочу ещё больше усложнять проблему). Тебе же нужно сделать так, чтобы при логауте и уничтожении сессии, так же сбрасывалось имя пользователя и пароль, которые используются для HTTP-авторизации и хранятся в памяти браузера.
Так вот, вся проблема в том, что на PHP это реализовать нельзя.
Я тебе уже приводил цитату из мануала, как можно попытаться это реализовать. Если этот способ не сработал, то никаких других вариантов не отсается. Браузер будет хранить имя пользователя и пароль у себя до тех пор, пока ты его не перезапустишь. Во многих браузерах, например в Мозилле, есть опция Log Out, которая очищает имя пользователя и пароль без перезапуска браузера. Но выбрать эту опцию может только пользователь, PHP тут не при делах.
Лично моё мнение, многие могут не согласится, но всё же:
Я вообще не вижу смысла использовать Basic-аутентификацию в PHP.
Если тебе нравится стандартное браузеровское окошко - используй .htaccess/.htpasswd. Если ты хочешь сам нарисовать страницу ввода пароля и обеспечить нормальную возможность выхода пользователей, используй авторизацию на куках/сессии.
-
FreeSpace
FreeSpace:
Ты должен чётко понять, что механизм аутентификации и сессии - это два абсолютно разных понятия. Они между собой никак не связаны и работают независимо друго от друга. Если ты поймешь это, то для тебя станет очевидным, что проблема у тебя не с сессиями, а именно с аутентификацией.
Это я уже понял. И понял еще до начала поста.
FreeSpace:
Если этот способ не сработал, то никаких других вариантов не отсается
Спасибо. Тоже понял.
FreeSpace:
Если тебе нравится стандартное браузеровское окошко - используй .htaccess/.htpasswd. Если ты хочешь сам нарисовать страницу ввода пароля и обеспечить нормальную возможность выхода пользователей, используй авторизацию на куках/сессии.
Идея не моя, просто так люди хотят. Придется их обломать.
Всем спасибо.