Amon2-Auth-Site-Hatena

 view release on metacpan or  search on metacpan

lib/Amon2/Auth/Site/Hatena.pm  view on Meta::CPAN

                                 $self->authorize_url        ;
}

sub auth_uri {
    my ($self, $c, $callback_uri) = @_;

    my $request_token = $self->ua->get_request_token(
        callback_url => $callback_uri || $self->redirect_url,
        scope        => join(',', @{$self->scope}),
    ) or die $self->ua->errstr;

    $c->session->set(auth_hatena => {
        request_token        => $request_token->token,
        request_token_secret => $request_token->secret,
    });

    $self->ua->{authorize_path} = $self->detect_authorize_url_from($c);
    $self->ua->url_to_authorize(token => $request_token);
}

sub callback {
    my ($self, $c, $callback) = @_;
    my $error = $callback->{on_error};

    my $verifier = $c->req->param('oauth_verifier')
        or return $error->("Cannot get a `oauth_verifier' parameter");

    my $session      = $c->session->get('auth_hatena') || {};
    my $token        = $session->{request_token};
    my $token_secret = $session->{request_token_secret};

    return $error->('request_token, request_token_secret are both required')
        if (!$token || !$token_secret);

    my $request_token = OAuth::Lite::Token->new(
        token  => $token,
        secret => $token_secret,
    );
    my $access_token = $self->ua->get_access_token(
        token    => $request_token,
        verifier => $verifier,
    ) or return $error->($self->ua->errstr);

    my @args = ($access_token->token, $access_token->secret);

    if ($self->user_info) {
        my $res = $self->ua->get($self->user_info_url);
        return $error->($self->ua->errstr) if $res->is_error;

        my $data = decode_json($res->decoded_content);
        push @args, $data;
    }

    $callback->{on_finished}->(@args);
}

1;

__END__

=encoding utf8

=head1 NAME

Amon2::Auth::Site::Hatena - Hatena authentication integration for Amon2

=head1 SYNOPSIS

    # config
    +{
        Auth => {
            Hatena => {
                consumer_key    => 'your consumer key',
                consumer_secret => 'your consumer secret',
            }
        }
    }

    # app
    __PACKAGE__->load_plugin('Web::Auth', {
        module   => 'Hatena',
        on_error => sub {
            my ($c, $error_message) = @_;
            ...
        },
        on_finished => sub {
            my ($c, $token, $token_secret, $user) = @_;

            my $name  = $user->{url_name};     #=> eg. antipop (id)
            my $nick  = $user->{display_name}; #=> eg. kentaro (nick)
            my $image = $user->{profile_image_url};

            $c->session->set(hatena => {
                user         => $user,
                token        => $token,
                token_secret => $token_secret,
            });

            $c->redirect('/');
        },
    });

=head1 DESCRIPTION

This is a Hatena authentication module for Amon2. You can easily let
users authenticate via Hatena OAuth API using this module.

=head1 ATTRIBUTES

=over 4

=item consumer_key (required)

=item comsumer_secret (required)

=item scope (Default: C<[qw(read_public)]>)

API scope in ArrayRef.

=item user_info (Default: true)



( run in 1.855 second using v1.01-cache-2.11-cpan-5735350b133 )