diff --git a/lib/WebGUI/Auth/Twitter.pm b/lib/WebGUI/Auth/Twitter.pm index 3a78242f6..e23b8f8ac 100644 --- a/lib/WebGUI/Auth/Twitter.pm +++ b/lib/WebGUI/Auth/Twitter.pm @@ -1,5 +1,6 @@ package WebGUI::Auth::Twitter; +use strict; use base 'WebGUI::Auth'; use Net::Twitter; @@ -8,10 +9,20 @@ sub new { return bless $self, __PACKAGE__; # Auth requires rebless } +sub createTwitterUser { + my ( $self, $twitterUserId, $twitterScreenName ) = @_; + my $user = WebGUI::User->create( $self->session ); + $user->username( $twitterScreenName ); + $self->saveParams( $user->userId, $self->authMethod, { + "twitterUserId" => $twitterUserId, + } ); + return $user; +} + sub www_login { my ( $self ) = @_; my $session = $self->session; - my ( $url ) = $session->quick( qw( url ) ); + my ( $url, $scratch ) = $session->quick( qw( url scratch ) ); my $nt = Net::Twitter->new( traits => [qw/API::REST OAuth/], @@ -19,22 +30,93 @@ sub www_login { consumer_secret => 'E4M5DJ66RAXiHgNCnJES96yTqglttsUes6OBcw9A', ); - unless ( $nt->authorized ) { - $session->scratch->set( 'AuthTwitterToken', $nt->request_token ); - $session->scratch->set( 'AuthTwitterTokenSecret', $nt->request_token_secret ); + my $url = $nt->get_authorization_url( + callback => $url->getSiteURL . $url->page('op=auth&authType=Twitter&method=callback'), + ); - my $url = $nt->get_authorization_url( - callback => $url->page('?op=auth;authType=Twitter;method=callback'), - ); + $scratch->set( 'AuthTwitterToken', $nt->request_token ); + $scratch->set( 'AuthTwitterTokenSecret', $nt->request_token_secret ); - $session->http->redirect($url); - return "redirect"; - } + $session->http->setRedirect($url); + return "redirect"; } sub www_callback { + my ( $self ) = @_; + my $session = $self->session; + my ( $form, $scratch, $db ) = $session->quick(qw( form scratch db )); + my $verifier = $form->get('oauth_verifier'); + + my $nt = Net::Twitter->new( + traits => [qw/API::REST OAuth/], + consumer_key => '3hvJpBr73pa4FycNrqw', + consumer_secret => 'E4M5DJ66RAXiHgNCnJES96yTqglttsUes6OBcw9A', + ); + $nt->request_token( $scratch->get('AuthTwitterToken') ); + $nt->request_token_secret( $scratch->get('AuthTwitterTokenSecret') ); + + my ($access_token, $access_token_secret, $twitterUserId, $twitterScreenName ) + = $nt->request_access_token(verifier => $verifier); + + ### Log the user in + # Find their twitter user ID + my $userId = $db->quickScalar( + "SELECT userId FROM authentication WHERE authMethod = ? AND fieldName = ? AND fieldData = ?", + [ "Twitter", "twitterUserId", $twitterUserId ], + ); + + # Returning user + if ( $userId ) { + my $user = WebGUI::User->new( $session, $userId ); + $self->user( $user ); + return $self->login; + } + # Otherwise see if their screen name exists and create a user + elsif ( !WebGUI::User->newByUsername( $session, $twitterScreenName ) ) { + my $user = $self->createTwitterUser( $twitterUserId, $twitterScreenName ); + $self->user( $user ); + return $self->login; + } + + # Otherwise ask them for a new username to use + $scratch->set( "AuthTwitterUserId", $twitterUserId ); + my $output = '
Your twitter screen name "%s" is already taken. Please choose a new username.
', $twitterScreenName ) + . '' + ; + return $output; } +sub www_setUsername { + my ( $self ) = @_; + my $session = $self->session; + my ( $form, $scratch, $db ) = $session->quick(qw( form scratch db )); + + my $username = $form->get('newUsername'); + if ( !WebGUI::User->newByUsername( $session, $username ) ) { + my $twitterUserId = $scratch->get( "AuthTwitterUserId" ); + my $user = $self->createTwitterUser( $twitterUserId, $username ); + $self->user( $user ); + return $self->login; + } + + # Username is again taken! Noooooo! + my $output = 'The username "%s" is already taken. Please choose a new username.
', $username ) + . '' + ; + return $output; +} 1;