Skip to content

Instantly share code, notes, and snippets.

@clkao
Created January 4, 2011 10:54
Show Gist options
  • Save clkao/764649 to your computer and use it in GitHub Desktop.
Save clkao/764649 to your computer and use it in GitHub Desktop.
sub csr {
my $args = shift;
require Net::OpenID::Consumer;
require LWPx::ParanoidAgent;
return Net::OpenID::Consumer->new(
ua => LWPx::ParanoidAgent->new,
cache => App::Cache->new,
args => $args,
consumer_secret => $consumer_secret,
# required_root => "http:///",
);
}
my $worker1 = AnyEvent::Worker::Pool->new
(2,
sub { my $uri = shift;
my $root = shift;
my $csr = csr(shift);
my $ci = $csr->claimed_identity("http://locotrade.org/");
return (undef, $csr->errcode) unless $ci;
return ($ci->check_url(
return_to => $uri,
trust_root => $root,
));
});
my $worker2 = AnyEvent::Worker::Pool->new
(2,
sub { my $csr = csr(shift);
my @res;
$csr->handle_server_response(
verified => sub { @res = ('verified', $_[0]->signed_fields); },
map { my $name = $_; $_ => sub { @res = ($name, @_) } }
qw(not_openid setup_required cancelled error));
return @res;
});
sub app {
my ($class, %args) = @_;
builder {
mount '/login' => sub {
my $env = shift;
my $req = Plack::Request->new($env);
my $res = Plack::Response->new(200);
$res->body("test");
my $uri = $req->uri;
$uri =~ s/login$/verify/;
return sub {
my $respond = shift;
my $cv = AE::cv(sub {$respond->($res->finalize) });
$worker1->do( $uri, $env->{HTTP_HOST}, $req->parameters->mixed , sub {
my $self = shift;
return warn "Request died: $@" if $@;
my ($check_url, $error) = @_;
warn $error unless $check_url;
$res->redirect($check_url);
$cv->send;
});
$cv->recv if !$env->{'psgi.nonblocking'};
};
};
mount '/verify' => sub {
my $env = shift;
my $req = Plack::Request->new($env);
my $res = Plack::Response->new(200);
my %handlers = (
not_openid => sub {
$res->body("not an openid message");
},
setup_required => sub {
my $setup_url = shift;
$res->redirect($setup_url);
# Redirect the user to $setup_url
},
cancelled => sub {
# Do something appropriate when the user hits "cancel" at the O
},
verified => sub {
my $vident = shift;
my ($id) = $vident->{'identity'};#
unless ($id) {
$res->body( "untrusted openid" );
return;
}
$args{on_verify}->($id, $req, $res);
$res->body("hi verified: $id") unless $res->body;
# Do something with the VerifiedIdentity object $vident
},
error => sub {
my $err = shift;
warn $err;
$res->body($err);
},
);
return sub {
my $respond = shift;
my $cv = AE::cv(sub {$respond->($res->finalize) });
$worker2->do( $req->parameters->mixed , sub {
my $self = shift;
return warn "Request died: $@" if $@;
my $mode = shift;
$handlers{$mode}->(@_);
use Data::Dumper;
$res->body(Dumper($req->parameters->mixed)) unless $res->body;
$cv->send;
});
$cv->recv if !$env->{'psgi.nonblocking'};
};
};
};
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment