In the interest of giving back to the community, I am posting the
scripts that I wrote that successfully use the JanRain libraries for openid logins.<br><br>I am writing a Mason web application, so this is in an init block on the page that handles the post from the login form.<br><br>Because I am running Apache 2, I had to do some funky stuff with my redirect page, so I posted that at the bottom, too.
<br>
<br>Amiri<br><br>__________<br><br><br><%args><br>$openid_url => undef<br></%args><br><br><%init><br>use strict;<br>use warnings;<br><br>use DBI;<br>use CGI;<br>use CGI::Session;<br>use Secret;<br>use Secret qw($name);
<br>use Secret qw($pass);<br>use URI;<br>use URI::Query;<br>use URI::Escape;<br>use URI::QueryParam;<br>use Net::OpenID::JanRain::Consumer;<br>use Net::OpenID::JanRain::Stores::MySQLStore;<br><br>my $dbh;<br>my $cgi;<br>my $session;
<br>my $cookie;<br>my $store;<br>my $consumer;<br>my $request;<br>my $redirect;<br>my $q;<br>my $query;<br>my %query;<br>my $complete;<br><br><br>unless ( $ARGS{'openid.mode'} ) {<br> $dbh = DBI->connect( "dbi:mysql:openid", $name, $pass ) || die $DBI::errstr;
<br> $cgi = CGI->new;<br> $session = CGI::Session->new( "driver:MySQL", undef, { Handle => $dbh } );<br> $cookie = $cgi->cookie(CGISESSID => $session->id );<br># print $cgi->header(-cookie=>$cookie);
<br> $store = Net::OpenID::JanRain::Stores::MySQLStore->new($dbh);<br> $consumer = Net::OpenID::JanRain::Consumer->new( $session, $store );<br><br><br> if ($openid_url) {<br> $request = $consumer->begin($openid_url);
<br><br> if ( $request->status eq 'failure' ) {<br> my $redirect5 = "/users/login_failed_all.html";<br> $m->comp( "/generic/action/openidredir.ml", url => $redirect5 );
<br> }<br><br> elsif ( $request->status eq 'success' || 'in_progress' ) {<br> my $trust_root = "http://***.***.***.***/users";<br> my $return_to = "http://***.***.***.***/users/openid.html";
<br> $request->addExtensionArg( "sreg", "optional","nickname,email,fullname,dob,gender,postcode,country,language,timezone");<br> $redirect = $request->redirectURL( $trust_root, $return_to );
<br> $m->comp( "/generic/action/openidredir.ml", url => $redirect, cookie => $cookie );<br> }<br> }<br>}<br><br>if ( $ARGS{'openid.mode'} ) {<br># $q = URI::Escape::uri_unescape($ENV{QUERY_STRING});
<br># $query = URI::Query->new($q);<br># %query = $query->hash;<br><br> $dbh = DBI->connect( "dbi:mysql:openid", $name, $pass ) || die $DBI::errstr;<br> $cgi = CGI->new;<br> my $sid = $cgi->cookie("CGISESSID");
<br> $session = CGI::Session->new( "driver:MySQL", $sid, { Handle => $dbh } );<br> $store = Net::OpenID::JanRain::Stores::MySQLStore->new($dbh);<br><br> $consumer = Net::OpenID::JanRain::Consumer->new( $session, $store );
<br> $complete = $consumer->complete( \%ARGS );<br> <br> if ( $complete->status eq 'success' ) {<br> my $redirect1 = "/users/login_done.html";<br> $m->comp( "/generic/action/openidredir.ml", url => $redirect1, cookie => $cookie );
<br> }<br> <br> elsif ( $complete->status eq 'failure' ) {<br> my $redirect2 = "/users/completemessage.html";<br> $m->comp( "/users/completemessage.html", complete => $complete->message, cookie => $cookie );
<br> }<br> <br> elsif ( $complete->status eq 'cancel' ) {<br> my $redirect3 = "/users/login_canceled.html";<br> $m->comp( "/generic/action/openidredir.ml", url => $redirect3, cookie => $cookie );
<br> }<br> <br> else {<br> my $redirect4 = "/users/login_failed_some.html";<br> $m->comp( "/generic/action/openidredir.ml", url => $redirect4, cookie => $cookie );
<br> }<br> <br>}<br></%init><br>
____________________<br><br><%args><br>$url<br>$cookie<br></%args><br><br><%init><br>use CGI::Cookie;<br>use Apache2::RequestRec;<br>use APR::Table ();<br>use Apache2::Const -compile => qw(REDIRECT);
<br> <br>$r->method('GET');<br>$r->headers_in->unset('Content-length');<br><br>$r->content_type('text/html');<br>$r->err_headers_out->add('Set-Cookie' => $cookie) ;<br>
$r->headers_out->set('Location' => $url);<br>$r->status(Apache2::Const::REDIRECT);<br>#$m->abort(302);<br></%init><br>