通过Perl和Net :: OpenID :: Consumer对Google Apps进行OpenID身份验证失败

前端之家收集整理的这篇文章主要介绍了通过Perl和Net :: OpenID :: Consumer对Google Apps进行OpenID身份验证失败前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我在谷歌的支持论坛上询问了这个问题,但是得到了零回应.也许这里的某些人可以帮助引导我朝着正确的方向前进.

我正在尝试将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&amp;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'); 
}

(有关完整示例以及对用户数据的OAuth访问权限,请参阅我博客上的此post.)

猜你在找的Perl相关文章