parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

OpenID - готовый пример

Sanja v.2 24.02.2007 16:57 / 24.02.2007 17:10

Помимо меня ещё некоторым людям на этом форуме нужно было средство для
авторизации по ОпенАйДи. Держите.

Я почитал спецификацию и понял, что не хочу тратить время на реализацию BigInt вычислений на Парсере,
поэтому взял готовую библиотеку на Perl и написал для неё обёртку.

Итак, вам понадобится:

1. Написать в службу поддержки своего хостинга, чтобы они поставили дополнительные модули Perl,
если они ещё не установлены (цитирую своё письмо):
Здравствуйте,

К сожалению, на сервере отсутствуют некоторые модули 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 нет.

Мои сайты на вашем хостинге - ******, аккаунт ******.

Заранее спасибо.
2. У себя на сайте в папке cgi-bin создайте папку openid (права на папку - 755).
В ней создайте папку lib (маленькими буквами).

3. Скачайте эту официальную библиотеку с openidenabled.com.

Возьмите содержимое папки /lib/ из архива (для распаковки используйте WinRAR)
и закачайте его в /cgi-bin/openid/lib/ (в ASCII-режиме!)

4. Создайте вне веб-пространства две папки: temp/tmp_session и temp/tmp_store.
Так, если страницы вашего сайта располагаются в папке /home/example/domains/example.com/public_html/,
пусть ваши папки будут располагаться в /home/example/domains/example.com/temp/tmp_store и
/home/example/domains/example.com/temp/tmp_session.

Поставьте на каждую из этих папок разрешения "777".

5. Положите в корневой каталог сайта файл from_lj.html следующего содержания:
# Общий для скрипта на 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');
}
Замените "вашсайт" в тексте скрипта на адрес своего сайта.

Укажите верные пути к двум созданным вами папкам для временных файлов.

Замените значение переменной $SECRET в тексте скрипта и в тексте парсерной страницы своим!!!

Закачайте скрипт в в ASCII-режиме, не забудьте поставить на скрипт права 755!

7. Откройте /cgi-bin/openid/consumer.cgi, введите адрес своего ЖЖ. Вас перебросит на livejournal.com, который спросит у вас, действительно ли вы хотите авторизоваться. Нажмите "yes, just this time" и вы попадёте обратно к себе на сайт, на страницу /from_lj.html.