Новости | FAQ | Авторы | Документация | В действии | Библиотека |
Инструменты | Полезные ссылки | Хостинги | Скачать | Примеры | Форум |
Sanja v.2 24.02.2007 16:57 / 24.02.2007 17:10
Помимо меня ещё некоторым людям на этом форуме нужно было средство дляЗдравствуйте,2. У себя на сайте в папке cgi-bin создайте папку openid (права на папку - 755).
К сожалению, на сервере отсутствуют некоторые модули Perl, которые мне нужны.
Пожалуйста, установите их с CPAN.
CGI-Session
Class-ErrorHandler
Compress-Raw-Zlib
Compress-Zlib
Crypt-DH
Digest-HMAC
Digest-SHA1
IO-Compress-Base
IO-Compress-Zlib
LWPx-ParanoidAgent
MIME-Base64
Storable
URI-Fetch
XML-XPath
XML-Parser
Последний мне особо важен - в состав модуля входит бинарный Expat.so,
которого в собранном виде на CPAN нет.
Мои сайты на вашем хостинге - ******, аккаунт ******.
Заранее спасибо.
# Общий для скрипта на Perl и этой страницы ключ # (замените своим!!!): $SECRET[Mama myla ramu, papa chistil pulemet] ^if( $form:token eq ^math:md5[$SECRET|$form:identity_url|$env:HTTP_USER_AGENT|$env:REMOTE_ADDR|$env:HTTP_VIA|$form:timestamp] ){ $from_openid[^date::unix-timestamp($form:timestamp)] $now[^date::now[]] ^if( ^eval(($now - $from_openid) *24*60*60 ) < 600 ){ <p>Спасибо, вы подтвердили, что владеете адресом <code>$form:identity_url</code></p> }{ <p>Пожалуйста, попробуйте пройти процесс авторизации снова.</p> } }{ <p>Кыш, хакер!</p> }6. Положите в /cgi-bin/openid/ файл consumer.cgi следующего содержания:
#! /usr/bin/perl -I ./lib use CGI; use CGI::Session; use File::Spec; use Net::OpenID::JanRain::Consumer; use Net::OpenID::JanRain::Stores::FileStore; use DBI; use Digest::MD5 qw(md5_hex); use URI::Escape; # Замените значение константы $SECRET своим!! my $SECRET = 'Mama myla ramu, papa chistil pulemet'; # Укажите пути к созданным двум папкам. # Путь нужно указывать от корня диска! my $STORE_DIR = '/home/?????/temp/tmp_store'; my $SESSION_DIR = '/home/?????/temp/tmp_session'; my $cgi = new CGI; my $session = new CGI::Session(undef, $cgi, {Directory => $SESSION_DIR}); $cookie = $cgi->cookie(CGISESSID => $session->id ); my $store = Net::OpenID::JanRain::Stores::FileStore->new($STORE_DIR); my $consumer = Net::OpenID::JanRain::Consumer->new($session, $store); my $user_url = $cgi->param('openid_url'); if($user_url) { # Begin OpenID transaction my $request = $consumer->begin($user_url); if($request->status eq 'failure') { # this is an unrecoverable discovery failure display_failure($request); } else { # Redirect to OpenID server my $trust_root = $cgi->url(-base => 1); my $return_to = $cgi->url; my $redirect_url = $request->redirectURL($trust_root, $return_to); print $cgi->header(-cookie=>$cookie,-location=>$redirect_url); } } elsif ($cgi->param('openid.mode')) { # We're back from the server my %query = $cgi->Vars; my $response = $consumer->complete(\%query); if ($response->status eq 'success') { display_success($response); } elsif ($response->status eq 'failure') { display_failure($response); } elsif ($response->status eq 'cancel') { display_cancel($response); } else { display_headers(); print $cgi->h1('Авторизация через OpenID'); warn "Что-то не получилось: сервер вернул непонятный ответ, <code>".$response->status."</code>, я не знаю, что с ним делать!\n"; print $cgi->end_html; } } else { display_headers(); print $cgi->h1('Авторизация через OpenID'); display_openid_form(); } exit(0); sub display_headers { print $cgi->header( -cookie=>$cookie, -charset=>'windows-1251', -expires=>'+10m'); print $cgi->start_html( -title=>'Авторизация через OpenID', # -style=>{'src'=>'/styles/style1.css'}, -lang=>'ru', -charset=>'windows-1251' ); } sub display_failure { my $response = shift; display_headers(); print $cgi->h1('Авторизоваться через OpenID не получилось'), $cgi->p($response->{message}); print $cgi->p($response->{identity_url}) if $response->{identity_url}; display_openid_form(); print $cgi->end_html; } sub display_cancel { my $response = shift; display_headers(); print $cgi->h1('Авторизация через OpenID отменена'), print $cgi->p($response->{identity_url}) if $response->{identity_url}; display_openid_form(); print $cgi->end_html; } sub display_openid_form { print $cgi->start_form, "Введите свой адрес OpenID (например, <i>your_name_here.livejournal.com</i>):\n", $cgi->textfield('openid_url'), $cgi->submit('Поехали!'), $cgi->end_form; } sub display_success { my $response = shift; my $timestamp = time(); my $hash = md5_hex($SECRET . "|" . $response->{identity_url}."|".$ENV{HTTP_USER_AGENT}."|".$ENV{REMOTE_ADDR}."|".$ENV{HTTP_VIA}."|".$timestamp); print $cgi->redirect('http://вашсайт/from_lj.html?timestamp=' . $timestamp . '&identity_url=' . uri_escape($response->{identity_url}) . '&token=' . uri_escape($hash) . '&dummy=1'); }Замените "вашсайт" в тексте скрипта на адрес своего сайта.