我在谷歌的支持论坛上询问了这个问题,但是得到了零回应.也许这里的某些人可以帮助引导我朝着正确的方向前进.
我正在尝试将Perl应用程序与Google Apps集成,我在使用OpenID身份验证方面遇到了一些麻烦.我一直在使用谷歌的PHP tutorial作为一种参考,因为我找不到Perl的例子.
我的初始文件index.cgi(由manifest.xml引用,以及OpenID事务的起点)如下:
use Net::OpenID::Consumer; use CGI; # ... my $q = CGI->new(); my $domain = $q->param('domain'); if (!$domain) { print $q->header(),'Provide domain please.'; exit 0; } # my website my $root = 'http://www.example.com/'; my $csr = Net::OpenID::Consumer->new( # The user agent which sends the openid off to the server ua => LWP::UserAgent->new,# Who we are required_root => $root,# Consumer Key Secret from Google Apps Marketplace consumer_secret => 'Zzzzzz9zzAAAAA....' ); my $claimed_id = $csr->claimed_identity( 'https://www.google.com/accounts/o8/site-xrds?hd=' . $domain); if ($claimed_id) { my $check_url = $claimed_id->check_url( # Upon validation,the user will be returned here,and real # work may begin return_to => $root . '/return.cgi',trust_root => $root ); print $q->redirect($check_url); } else { print $q->header(),"Error"; }
这部分似乎有效.也就是说,我被重定向到带有一堆openid.*参数的return.cgi.但是,此时我收到以下错误:
no_identity_server提供的URL未声明其OpenID标识服务器
我正在使用最新版本的Net :: OpenID :: Consumer模块.
以下是return.cgi的重要部分:
my $q = CGI->new(); my $csr = Net::OpenID::Consumer->new( ua => LWP::UserAgent->new,# The root of our URL required_root => 'http://www.example.com/',# Our password. consumer_secret => 'Zzzzzz9zzAAAAA....',# Where to get the information from. args => $q ); print $q->header(); $csr->handle_server_response( not_openid => sub { print "That's not an OpenID message. Did you just type in the URL?"; },setup_required => sub { my $setup_url = shift; print 'You need to do something <a href="#">here</a>.'; },cancelled => sub { print 'You cancelled your login.'; },verified => sub { my $vident = shift; my $url = $vident->url; print "You are verified as '$url'. ** FIN **"; },error => sub { die "Can't figure it out: ",@_; } );
正如你可以想象的那样,我想要验证已经验证的子程序,但我得到了一个错误.有什么明显我想念的吗?任何帮助,将不胜感激.
解决方法
事实证明,解决方案是切换模块.我改变了文件记录
Net::Google::FederatedLogin,现在正在运作.代码如下(替换example.com以下的实际开发人员域名).
在Google Apps Marketplace供应商配置文件中,将URL添加到Application Manifest中的index.cgi:
... <Url>http://www.example.com/index.cgi?from=google&domain=${DOMAIN_NAME}</Url> ...
的index.cgi
use CGI; use Net::Google::FederatedLogin; my $q = CGI->new(); my $domain = $q->param('domain'); if (!$domain) { print $q->header(),'Provide domain please.'; exit 0; } my $fl = Net::Google::FederatedLogin->new( claimed_id => 'https://www.google.com/accounts/o8/site-xrds?hd=' . $domain,return_to => 'http://www.example.com/return.cgi',extensions => [ { ns => 'ax',uri => 'http://openid.net/srv/ax/1.0',attributes => { mode => 'fetch_request',required => 'email',type => { email => 'http://axschema.org/contact/email' } } } ] ); print $q->redirect($fl->get_auth_url());
return.cgi
use CGI; use Net::Google::FederatedLogin; my $q = CGI->new(); print $q->header(); my $fl = Net::Google::FederatedLogin->new( cgi => $q,return_to => 'http://www.example.com/return.cgi' ); eval { $fl->verify_auth(); }; if ($@) { print 'Error: ' . $@; } else { # we've authenticated and gotten attributes -- my $ext = $fl->get_extension('http://openid.net/srv/ax/1.0'); print $ext->get_parameter('value.email'); }