Forum Webscript.Ru
		Программирование => Perl => Тема начата: Kwazar от 13 Января 2005, 12:01:52
		
			
			- 
				Я уже давно использую авторизацию вот такого принципа:
 
 При успешной проверке логин а пароля пользователю пишутся куки с логином пользователи и его сессией
 
 print "Set-Cookie: id=$id; expires=.date()+3600*24*100; path=/;\\n";
 print "Set-Cookie: sess=$sess;  expires=.date()+3600*24*100; path=/;\\n";
 
 И в дальнейшем, при каждом обращении к пользовательской части сайта я вытягиваю эти куки с сверяю их с теми, что записаны в БД
 
 $cookhttp= $ENV{\'HTTP_COOKIE\'} || $ENV{\'COOKIE\'};
 @cookies = split (/\\; /,$cookhttp);
 foreach $cookies (@cookies)
 {
 ($n, $value) = split(/=/, $cookies);
 $n =~ tr/+/ /;
 $n =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
 $value =~ tr/+/ /;
 $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
 $C{$n} = $value;
 }
 #$C{id} - id пользователя
 #$C{sess} - сессия пользователя
 
 Однако, приблизительно 20% пользователей с включенными кукисами ругаются, что не могут после успешной авторизации работать с сайтом, так как их опять выбрасывает на форму авторизации со словами о том, что вы не авторизованы.
 
 Посмотрите пожалуйста приведенные коды. Все пролез, вроде все правильно. Но ведь работает через раз! Почему? Нутром чувствую, что что-то не так с записью или чтением кукисов
- 
				Kwazar 
 таскай сессию через параметры... и всё будет ок...
- 
				commander:
 таскай сессию через параметры... и всё будет ок...
 
 правда такой вариант местами утомителен.
 CGI::Auth (http://search.cpan.org/author/CCWALLACE/CGI-Auth-3.00/Auth.pm)
- 
				commander 
 
 Они не очень желательны.
- 
				правда такой вариант местами утомителен.
 
 
 зато надёжный! и у всех работает... не зависимо от куки...
- 
				Kwazar:
 Нутром чувствую, что что-то не так с записью или чтением кукисов
 
 ну используй тогда стандартные проверенные решения
 CGI::Session или работай с ними через тот же CGI.pm
- 
				ИМХО, серверный вариант надежней. Нежели "клиентское разноообразие" куков (или кукисов, а как правильно?)
			
- 
				Mog. 
 А что подразумевается под фразой: "серверный вариант"?
 Базовая авторизация?
 
 Тогда сразу 2 вопроса:
 1)Как ее повесить на БД и не хранить пользователей в .htpasswd?
 2)Как выводить скрипты, которые только проверяют, авторизован клиент или нет? (например, общие описаловки с различными меню для авторизованных и не авторизованных пользователей)?
- 
				Kwazar 
 Сессии.
 Хотя не поручусь за модули, че они там используют.
- 
				Mog.:
 ИМХО, серверный вариант надежней
 
 ты про
 my $login=$ENV{\'REMOTE_USER\'};
 
 или что-то еще?
- 
				Green Kakadu 
 Я про вообще.
- 
				В процессе размышлений родилось решение передавать сессию пользователя через get, используя Mod_rewrite для большей читабельности поисковиками. Жаль, конечно, что сессию не спрячешь в этом варианте решения и не сделаешь постоянной (без новой авторизации при повторном посещении сайта)
			
- 
				Kwazar:
 get, используя Mod_rewrite для большей читабельности поисковиками.
 
 а при чем тут поисковики, если раздел _для авторизованных пользователей_
- 
				Green Kakadu 
 Есть еще и общие скрипты, которые только проверяют, авторизован клиент или нет (и в зависимости от этого выводят или не выводят личное меню). Но при этом эти же скрипты доступны и для остальных.
- 
				Kwazar 
 о чем вообще тут полемику разводить? сессию можно либо таскать параметрами, либо хранить в куках, если куки не устраивают, остаеться только таскать сессию параметрами... и баста.
- 
				Kwazar:
 В процессе размышлений родилось решение передавать сессию пользователя через get, используя Mod_rewrite для большей читабельности поисковиками.
 
 вобще-то желательно писать так, чтобы поисковик вообще не получал идентификатор сессии. Иначе все юзеры, которые зайдут к тебе через поисковик будут работать под одной сессией (если скриптом не предусмотреть это)
- 
				Не читал всю тему, но может проблема в том, что плюшки поставленные для domen.com не работают для http://www.domen.com?
			
- 
				Kwazar:
 print "Set-Cookie: id=$id; expires=.date()+3600*24*100; path=/;\\n";print "Set-Cookie: sess=$sess; expires=.date()+3600*24*100; path=/;\\n";
 
 
 1. параметер expires указан неверно
 2. при установке expires также полезно в заголовке высылать параметер Date, чтобы броузеру было от чего отчитывать
 
 Рекомендация: при явном нежелании вникать в http протокол, рекомендую всё же воспользоваться готовым софтом для работы с заголовками а не пытаться сделать это самому
- 
				Kwazar 
 А я еще прописываю домен.
 Так как у меня на некоторых сайтах ссылки относительные, поэтому сайт прекрасно работает как под доменом mysite.ru так и под доменом http://www.mysite.ru. поэтому во время авторизации я прописываю куки для обоих доменов одновременно.
 
 Потом expires я всегда указываю максимальный, ты же сессию прописываешь, зачем тепе время её жизни у пользователя... определяй её время жизни на сервере. А то что у пользователя она пожизненная - неимеет значения.