I'm getting 401 Unauthorized when trying to use Net::OAuth in Perl to access
Twitter - it's happening in trying to swap the request token for the access
token (in the second block below, from the $ua->post()).  I was just
wondering what the best method for debugging this would be.  Here's my code
(it's in Catalyst, so the $c's are from the Framework environment):

sub authenticate_twitter : Local {
    my ($self, $c) = @_;

    unless ($c->user_session->{'request_token'} &&
$c->user_session->{'request_token_secret'}) {
        my $request = Net::OAuth->request("request token")->new(
            consumer_key => $c->config->{'twitter_consumer_key'},
            consumer_secret => $c->config->{'twitter_consumer_secret'},
            request_url => $c->config->{'twitter_request_url'},
            request_method => 'GET',
            signature_method => 'HMAC-SHA1',
            timestamp => time,
            nonce => join('', rand_chars(size=>16, set=>'alphanumeric')),
        );
        $request->sign();

        $c->log->debug("URL: ".$request->to_url);

        my $ua = LWP::UserAgent->new;
        my $res = $ua->get($request->to_url); # post request to Twitter

        if ($res->is_success) {
            my $response = Net::OAuth->response('request
token')->from_post_body($res->content);
            $c->user_session->{'request_token'} = $response->token;
            $c->user_session->{'request_token_secret'} =
$response->token_secret;

            if (defined $c->user_session->{'request_token'}) {
                my $auth_url =
$c->config->{'twitter_authorize_token_url'}."?oauth_token=" .
$c->user_session->{'request_token'} .
"&redirect_url=".uri_escape($c->req->param("redi
rect_url"));;
                $c->res->redirect($auth_url);
                $c->detach;
                return;
            }
        }
        else {
            $c->log->fatal("Something went wrong.");
        }
    }
    else {
        $c->log->debug("request_token:
".$c->user_session->{'request_token'});
        $c->log->debug("request_token_secret:
".$c->user_session->{'request_token_secret'});
        my $request = Net::OAuth->request("access token")->new(
            consumer_key        => $c->config->{'twitter_consumer_key'},
            consumer_secret     => $c->config->{'twitter_consumer_secret'},
            token               => $c->user_session->{'request_token'},
            token_secret        =>
$c->user_session->{'request_token_secret'},
            request_url         => $c->config->{'twitter_access_token_url'},
            request_method      => 'POST',
            signature_method    => 'HMAC-SHA1',
            timestamp           => time,
            nonce               => join('', rand_chars(size=>16,
set=>'alphanumeric')),
        );
        $request->sign();

        $c->log->debug("URL: ".$request->to_url);

        my $ua = LWP::UserAgent->new;
        my $res = $ua->post($request->to_url); # post request to Twitter

        if ($res->is_success) {
            my $response = Net::OAuth->response('access
token')->from_post_body($res->content);
            $c->user_session->{'access_token'} = $response->token;
            $c->user_session->{'access_token_secret'} =
$response->token_secret;

            $c->res->redirect(uri_unescape($c->req->param('redirect_url')));
        }
        else {
            $c->log->fatal("Could not get an Access Token: " .
$res->status_line . " " . $res->content);
        }

    }

}

-...@jesse

Reply via email to