Виктор "Витус" Вагнер ([info]vitus_wagner) wrote,

Web-строительское

Пока тут народ радостно обсуждает наполеоновские планы строительства распределенной блог-системы
(1 2 3) я тем временем OpenID мучаю. Все-таки перловый код [info]brad писать умеет, а вот документацию хренушки.

Но с консьюмером я всё же уже разобрался. Может кому поможет

1. Пользователь приходит к нам на сайт и получает форму, в которую он вводит свой идентификатор.
Я немного развлекся и завел отдельное поле для юзернейма, отдельно менюшку для популятрных сайтов.
Можете в комменты накидать еще вариантов - впишу. Первый подход к снаряду (первый HTTP-запрос) завершен.
2.Пользователь жмет кнопку Log In, мы получаем (формируем из имени юзера и названия сайта) URL,
и делаем на неё HTTP-запрос. Парсим его, находим URL OpenID-продьюсера, которая там внутри как link rel написана. Это то, что называется claimed identity. (всё это кроме формирования URL делается единственным вызовом метода claimed_identity объекта Net::OpenID::Consumer. На данный момент никто еще не обещал что это правда.
Медодом check_url объекта Net::OpenID::ClaimedIdentity формируем URL-ку запроса на проверку. Не забываем указать куда возвращаться, добавив к URL нашего скрипт какой-нибудь параметр, чтобы, проанализировав его, мы узнали что это третий подход к снаряду, а не первый.
И радостно редиректим юзера на неё. Второй подход к снаряду завершен.
3. OpenID-продьюсер юзера о чем-то с юзерским браузером общается. Потом посылает юзера обратно к нам.
Мы проверяем, не попросили ли нас послать юзера что-то еще делать на том сайте - не передали ли нам
user_setup_url. Если передали, посылаем юзера туда. Когда он придет обратно, он, наверное будет на том сайте корректно залогинен. Если user_setup_url undefined, значит юзера больше мучить не нужно.
Проверяем, не отказался ли юзер от авторизации. Если отказался (метод user_cancel возвращает true) то увы и ах.
Иначе получаем объект Net::OpenId::VerifiedIdentity. Здесь мое терпение лопнуло, и я не стал писать в своем тестовом скрипте примеры извлечения оттуда foaf, rss и тому подобных вещей. Если этого объекта нам не дают,
значит что-то сломалось и нужно методом err вывести сообщение об ошибке. Если объект дали, то юзер успешно залогинен.



Вот текст скрипта, который в отличие от кода, имеющегося во встроенной документации модуля Net::OpenID::Consumer кладется на свой сайт и работает. Правда модулей ему нужна куча:
Net::OpenID::Consumer, LWP, Crypt::DH. Ну и CGI.pm, конечно, куда ж без нее, но она давн в дистрибутиве Perl.

#!/usr/bin/perl -T
use strict;
use warnings;
use CGI;
use LWP::UserAgent;
use Net::OpenID::Consumer;

my $cgi = new CGI;

if ($cgi->param("user")) {
	 my $csr = init_consumer($cgi);
	 my $url;
	 if ($cgi->param('site')) {
	 	$url = sprintf($cgi->param('site'),$cgi->param('user'));
	 } else {
	 	$url = $cgi->param('user');
	 }	
	 print STDERR "URL entered: $url\n"; 
	 my $claimed_identity = $csr->claimed_identity($url);
		if (! defined $claimed_identity) {
			foreach my $par ($cgi->param) {
				print STDERR "$par = ".$cgi->param($par)."\n";
			}	
			die "No identity on given URL";
		}	
		my $check_url = $claimed_identity->check_url(
			return_to =>
			$cgi->url(-full=>1,-query=>0)."?openidvfy=1",
			trust_root=>$cgi->url(-base=>1));
		print $cgi->redirect(-location=> $check_url);	
} elsif ($cgi->param("openidvfy")) {
	my $csr = init_consumer($cgi);
	if (my $setup_url = $csr->user_setup_url) {
		print $cgi->redirect(-location=>$setup_url);
		exit(0);
	} elsif	($csr->user_cancel) {
		print $cgi->header('text/html');
		print $cgi->start_html("Login cancelled"),
			$cgi->h1("Login cancelled"),
			$cgi->p("You've cancelled login on other site"),
			$cgi->end_html;
	} elsif (my $vident = $csr->verified_identity) {
		print $cgi->header('text/html');
		print $cgi->start_html("Authentication successful"),
			$cgi->h1("Authentication successfull"),
			$cgi->p("You've successfully logged into our site as",
				$cgi->a({-href=>$vident->url},$vident->display),". Congratulations!"),
			$cgi->end_html;
	} else {		
		print $cgi->header('text/html');
		print $cgi->start_html("Authentication failed"),
			$cgi->h1("Authentication failed"),
			$cgi->p("Error validating identity:",
			$cgi->escapeHTML($csr->err));
			$cgi->end_html;
	}			
			
} else {				
	# Print out form to enter OpenID URL
	my %site_list=(
		'http://users.livejournal.com/%s'=>'LiveJournal',
		'http://lj.rossia.org/users/%s'=>'LJ.Rossia.org',
		'http://www.greatestjournal.com/users/%s'=>'GreatestJournal',
		'%s','Other (enter full URL into Login field');
	print $cgi->header("text/html"),
	$cgi->start_html("My test open_id page"),
	$cgi->h1("My test open_id page"),
	$cgi->start_form(-method=>'POST'),
	"Login:",$cgi->textfield(-name=>"user",-size=>40),"<br>",
	"Site:",
	$cgi->popup_menu(-name=>"site",-Values=>[sort keys(%site_list)],
		-labels=>\%site_list),
	"<br>",$cgi->submit(-name=>'login',-value=>'Log in'),
	$cgi->end_form,
	$cgi->end_html;
	exit(0);
}	

sub init_consumer {
	my $cgi=shift;
	 return Net::OpenID::Consumer->new(
	   ua	 => LWP::UserAgent->new(),
	   args  => $cgi,
	   consumer_secret => 'sdf@!#$AGSADG',
	   required_root => $cgi->url(-base=>1),
	 );
}	 



Tags: distributed-blog

  • Post a new comment

    Error

    Comments allowed for friends only

    Anonymous comments are disabled in this journal

    Your reply will be screened

    Your IP address will be recorded 

  • 16 comments

[info]muzyka_sfer

December 4 2007, 20:02:09 UTC 4 years ago

OpenID - протокол, который в первую очередь предназначен для того, чтобы госконторам США было удобнее учитывать всех по головам.
Тот, кто identifies himself with OpenID, становится одной строчкой для того, кто следит, несмотря на разные логины на разных сайтах.
Госпрограмма тотальной слежки, Total Information Awareness, принята и сегодня энергично воплощается в жизнь всеми большими корпорациями. Сюда подпадают "социальные" сайты, на которых люди сами о себе сообщают множество подробностей, механизмы вроде OpenID и других общих и взаимозаменяемых логинов - дабы collate, совмещать знания из разных мест, равно как и проекты по переносу как можно большего числа функций из домашнего компьютера - on-line ("закладки", "бэкапы", и т.д.) - под предлогом того, что это "удобно" и вы сможете связаться со своими данными "с любого компьютера".

А корпорация, конечно, все правила соблюдения privacy для вас не нарушит.
What load of liquid shit.

Я бы на вашем месте бросил возиться с ТАКИМ протоколом, и для системы распределенных блогов сделал бы удобным и незаметным для пользователя создание собственной пары крипто-ключей (легко) и опознание друзей по автоматическому сравнению этих ключей.
Дабы не возиться с переконфигурацией веб серверов на каждой машине при добавлениии и т.д. можно пользоваться маленькими utilities которые всю эту работу оформляют.
да к тому же они уже есть, на них достаточно просто сослаться в скриптах.

[info]dottedmag

December 4 2007, 20:19:57 UTC 4 years ago

Вас ввели в заблуждение еврейские этнические жыдомасоны. Госдеп США - ширма для их плана захвата мира.

[info]muzyka_sfer

December 4 2007, 20:30:55 UTC 4 years ago

..откуда вы знали?

Вот официальная печать программы:


Похоже вы попали в точку. Из википедии:

    The IAO uses the eye of Providence from the Great Seal of the United States gazing at the Earth as logo, and the Latin motto scientia est potentia, meaning "knowledge is power". The pyramid has 13 steps, the same of that on the US 1 dollar bill.

    As criticism of TIA grew in late 2002, the pyramid logo was removed from the official IAO webpage and replaced with a new logo. In response to questions about its removal, the IAO responded in February 2003 with a "Statement regarding the meaning and use of the IAO logo" published as a FAQ.[24] The original descriptions of the IAO, TIA, and the biographies of senior staffers were also removed from the DARPA web site although they remain widely available on the Internet.[25]

[info]vitus_wagner

December 4 2007, 21:15:34 UTC 4 years ago

А вы в курсе что по городам сейчас расставлена уйма видеокамер слежения?
Какие меры вы принимаете для сокрытия своего лица, когда едете в метро?

За privacy бояться в интернет не ходить.

А мне нужно чтобы те, кто сейчас настолько беспечно относится к privacy, что пользуется ЖЖ, после того, как я унесу свой блог на отдельную площадку, могли легко туда ходить и комментировать. Ровно для этого я и хочу чтобы там был OpenID Consumer.,

[info]muzyka_sfer

December 4 2007, 22:16:39 UTC 4 years ago

Так как вы откликнетесь на предложение в предыдущем посте?
http://vitus-wagner.livejournal.com/231667.html?thread=6826995#t6826995

Уже есть маленький, быстрый, scaling скрипт-агрегатор, пока на одного пользователя, который можно разрабатывать.
Найдется ли группа желающих работать?

[info]snysmymrik

December 4 2007, 21:20:57 UTC 4 years ago

А кто вас просит выкладывать секреты в интернет?

[info]salas

December 4 2007, 21:46:18 UTC 4 years ago

Возможно, если этот код позиционируется как "скопируешь и будет работать", не стоит принимать от незнакомых формат sprintf?
Сходу не вижу в этом месте дырок (в отличие от одноимённой функции в C, которая с удовольствием вывела бы что-нибудь интересное из стека), кроме возможности вывести адрес второго аргумента, но мало ли?

[info]vitus_wagner

December 5 2007, 07:26:33 UTC 4 years ago

Вы это заметили! Молодец! Это учебный пример. Скопируешь и будет работать. В том смысле что сходит на сайт и тебя авторизует. Для практической работы он всё равно не пригоден, поскольку дальше авторизацию надо запомнить и куда-то еще использовать. Я же написал Я немного развлекся и завел отдельное поле для юзернейма, отдельно менюшку для популятрных сайтов.. Развлечение состояло именно в том, что я подложил туда засаду и смотрю, кто её раскусит а кто нет.

Anonymous

December 5 2007, 07:33:16 UTC 4 years ago

тоже самое, с минимумом модулей: http://frox25.no-ip.org/~mtve/wiki/TinyOpenIDp.html

--
mtve

[info]vitus_wagner

December 5 2007, 07:46:26 UTC 4 years ago

Это не то же самое, это ровно наоборот. У меня openid-consumer, который авторизует юзера у OpenID-сервера с другого сайта. А это - OpenId producer. который позволяет другому сайту авторизовать юзера. Но всё равно интересно.

[info]mtve

December 15 2007, 14:48:26 UTC 4 years ago

сорри, не въехал :)

[info]__sergio__

December 12 2007, 03:04:31 UTC 4 years ago

да, разобраться в пяти редиректах не так-то и просто..

но вот что делать с секретом?

[info]palkovneg

December 30 2007, 20:08:56 UTC 4 years ago

ещё интереснее звучал бы вопрос о возможности совместного использования SRE вместе с Net::OpenID::Consumer. Насколько я смог понять -- email, nickname, full name пользователя получить от openid сервера вполне можно при использовании Net::OpenID::JanRain::Consumer, но у меня после многократных попыток так и не получилось его собрать (он хочет работать со старой версией Math::BigInt, которой уже нет в CPAN)

потому и интересно -- можно ли как-нибудь с помощью Net::OpenID::Consumer заюзать SRE и получить email пользователя?

[info]n0xi0uzz

October 1 2008, 21:44:15 UTC 3 years ago

Интересно, а кроме Брэда, кто-нибудь писал аналогичные модули?
А то работа с его модулем связана с кучей хаков, по-моему.

[info]zmejk

June 20 2010, 21:04:20 UTC 1 year ago

Не знаю, может уже и поздновато, но большое спасибо за предоставленный пример. Сегодня опробовал (система ALT Linux 4.0) Однако, закочегарилось не сразу. Все библиотеки, кроме Net::OpenID::Consumer, брал из родного репозитория дистрибутива. Проблемы возникли с Crypt::DH::GMP, а именно -- OpenID::Consumer не видел имеющегося GMP.pm вываливаясь с сообщением: "Can't locate Crypt/DH/GMP.pm in @INC (@INC contains: /etc/perl5 /usr/lib/perl5/i386-linux /usr/lib/perl5 /usr/local/lib/perl5/site_perl/5.8.8/i386-linux /usr/local/lib/perl5/site_perl/5.8.8 /usr/local/lib/perl5/site_perl /usr/lib/perl5/vendor_perl/i386-linux /usr/lib/perl5/vendor_perl /usr/lib/perl5/vendor_perl) at /usr/lib/perl5/vendor_perl/Net/OpenID/Association.pm line 17" Проблему решил тупо создав каталог /usr/lib/perl5/vendor_perl/i386-linux/Crypt/DH и скопировав туда имеющийся GMP.pm Но этого оказалось недостаточно, т.к. Net::OpenID::Consumer требовал для работы GMP.pm непременно версии 0.0.5, а у меня в дистре эта библиотека версии аж 2.04 Тогда уже не особо надеясь на успех я просто отредактировал 17 строку Association.pm, убрав от туда упоминания о версии подключаемой библиотеки. И тут же, после этих двух грязных хаков, скрипт успешно меня индетифицировал через жижешный акаунт. Успешно сработал яндексовский опенайди, а вот с мейл.ру фокус не прошел -- при попытке мейл.ру сказал: "Ошибка Протокола (Bad Realm)"
Create an Account
Forgot your login or password?
Facebook Twitter More login options
English • Español • Deutsch • Русский…