Catalyst-Authentication-Credential-OpenID

 view release on metacpan or  search on metacpan

lib/Catalyst/Authentication/Credential/OpenID.pm  view on Meta::CPAN

                %{ $realm->{config} }
               };
    bless $self, $class;

    # 2.0 spec says "SHOULD" be named "openid_identifier."
    $self->{openid_field} ||= "openid_identifier";

    my $secret = $self->{consumer_secret} ||= join("+",
                                                   __PACKAGE__,
                                                   $VERSION,
                                                   sort keys %{ $c->config }
                                                  );

    $secret = substr($secret,0,255) if length $secret > 255;
    $self->secret($secret);
    # If user has no preference we prefer L::PA b/c it can prevent DoS attacks.
    my $ua_class = $self->{ua_class} ||= eval "use LWPx::ParanoidAgent" ?
        "LWPx::ParanoidAgent" : "LWP::UserAgent";

    my $agent_class = $self->ua_class;
    eval "require $agent_class"
        or Catalyst::Exception->throw("Could not 'require' user agent class " .
                                      $self->ua_class);

    $c->log->debug("Setting consumer secret: " . $secret) if $self->debug;

    return $self;
}

sub authenticate {
    my ( $self, $c, $realm, $authinfo ) = @_;

    $c->log->debug("authenticate() called from " . $c->request->uri) if $self->debug;

    my $field = $self->openid_field;

    my $claimed_uri = $authinfo->{ $field };

    # Its security related so we want to be explicit about GET/POST param retrieval.
    $claimed_uri ||= $c->req->method eq 'GET' ? 
        $c->req->query_params->{ $field } : $c->req->body_params->{ $field };


    my $csr = Net::OpenID::Consumer->new(
        ua => $self->ua_class->new(%{$self->ua_args || {}}),
        args => $c->req->params,
        consumer_secret => $self->secret,
    );

    if ( $self->extension_args )
    {
        $c->log->warn("The configuration key 'extension_args' is ignored; use 'extensions'");
    }

    my %extensions = ref($self->extensions) eq "HASH" ?
        %{ $self->extensions } : ref($self->extensions) eq "ARRAY" ?
        @{ $self->extensions } : ();

    if ( $claimed_uri )
    {
        my $current = $c->uri_for("/" . $c->req->path); # clear query/fragment...

        my $identity = $csr->claimed_identity($claimed_uri);
        unless ( $identity )
        {
            if ( $self->errors_are_fatal )
            {
                Catalyst::Exception->throw($csr->err);
            }
            else
            {
                $c->log->error($csr->err . " -- $claimed_uri");
                return;
            }
        }

        for my $key ( keys %extensions )
        {
            $identity->set_extension_args($key, $extensions{$key});
        }

        my $check_url = $identity->check_url(
            return_to  => $current . '?openid-check=1',
            trust_root => $self->trust_root || $current,
            delayed_return => 1,
        );
        $c->res->redirect($check_url);
        $c->detach();
    }
    elsif ( $c->req->params->{'openid-check'} )
    {
        if ( my $setup_url = $csr->user_setup_url )
        {
            $c->res->redirect($setup_url);
            return;
        }
        elsif ( $csr->user_cancel )
        {
            return;
        }
        elsif ( my $identity = $csr->verified_identity )
        {
            # This is where we ought to build an OpenID user and verify against the spec.
            my $user = +{ map { $_ => scalar $identity->$_ }
                qw( url display rss atom foaf declared_rss declared_atom declared_foaf foafmaker ) };
            # Dude, I did not design the array as hash spec. Don't curse me [apv].
            for my $key ( keys %extensions )
            {
                my $vals = $identity->signed_extension_fields($key);
                $user->{extensions}->{$key} = $vals;
                if ( $self->flatten_extensions_into_user )
                {
                    $user->{$_} = $vals->{$_} for keys %{$vals};
                }
            }

            my $user_obj = $realm->find_user($user, $c);

            if ( ref $user_obj )
            {
                return $user_obj;



( run in 1.931 second using v1.01-cache-2.11-cpan-b16cb0d3907 )