| Новости | 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');
}Замените "вашсайт" в тексте скрипта на адрес своего сайта.