Index: FaceBook.pm =================================================================== --- FaceBook.pm (revision 242) +++ FaceBook.pm (revision 243) @@ -16,13 +16,13 @@ =for rem facebook: auto_create_user: 1 - app_id: 122117614500563 - app_key: 3da06301715b0efc5c873535c56c2c33 - app_secret: 656bd1369486b902e9bf831a9a08132b - authorize_url: https://graph.facebook.com/oauth/authorize + app_id: 15 decimal digits + app_secret: 32 hex digits + authorize_url: https://www.facebook.com/dialog/oauth access_token_url: https://graph.facebook.com/oauth/access_token user_info_url: https://graph.facebook.com/me user_post_url: ~ + state: is passed back to your app as a parameter of the redirect_uri when the user completed the authentication store: class: "+Comments::Authentication::Store" type: facebook @@ -33,7 +33,7 @@ =for rem SCHEMA -$m->redirect ( $fb_connect->fb_authorize_url( redirect_uri => ... ) ); +$m->redirect ( $fb_connect->authorize_url( facebook_redirect_uri => ... )->as_string ); =cut @@ -42,28 +42,33 @@ sub new { my ($class, %config) = @_; my $self = bless {}, $class; - for (qw(facebook_app_id facebook_app_key facebook_app_secret facebook_authorize_url facebook_access_token_url facebook_user_info_url)) { - $self->{$_} = $config{$_} || $state->{session}->{$_} || return undef; + + $self->{facebook_authorize_url} = 'https://www.facebook.com/dialog/oauth'; + $self->{facebook_access_token_url} = 'https://graph.facebook.com/oauth/access_token'; + $self->{facebook_user_info_url} = 'https://graph.facebook.com/me'; + + for (qw(facebook_app_id facebook_app_secret)) { + $self->{$_} = $config{$_} || $state->{session}{$_} || return undef; } - $self->{timeout} = $state->{session}->{connection_timeout} || 3; + $self->{timeout} = $state->{session}{connection_timeout} || 3; for (qw(facebook_user_post_url facebook_redirect_uri)) { - $self->{$_} = $config{$_} || $state->{session}->{$_}; + $self->{$_} = $config{$_} || $state->{session}{$_}; } return $self; } -sub fb_authorize_url { +sub authorize_url { my $self = shift; my (%args) = @_; my $go = URI->new( $self->{facebook_authorize_url} ); - warn Dumper($go); - $go->query_param( client_id => $self->{facebook_app_key} ); + $go->query_param( client_id => $self->{facebook_app_id} ); + $go->query_param( state => $args{state} ) if $args{state}; $go->query_param( scope => "publish_stream" ); $args{redirect_uri} ||= $self->{facebook_redirect_uri}; for ( keys %args ) { $go->query_param( $_ => $args{$_} ); } - $keeper->{session}->store_value( facebook_redirect_url => $self->{facebook_redirect_uri} ); + warn Dumper($go) if $DEBUG; return $go; } @@ -71,9 +76,8 @@ my ( $self, %authinfo ) = @_; warn "FB.authenticate" if $DEBUG; # TODO: we need callback url - #warn "user_session=".dumper( $c->user_session )." "; my $local_session = $session || $keeper->{session}->get_session; - my $redirect_uri = $local_session->{facebook_redirect_url}; + my $redirect_uri = $self->{facebook_redirect_uri}; my $access_token = $local_session->{facebook_access_token}; my $expires = $local_session->{facebook_expires}; @@ -95,7 +99,7 @@ $req->query_param( redirect_uri => $redirect_uri ); $req->query_param( client_secret=> $self->{facebook_app_secret} ); $req->query_param( code => $code); - warn "Get $req"; + warn "Get $req" if $DEBUG; my $res = $ua->get($req); unless ($res->code == 200) { warn "access_token request failed: ".$res->status_line; @@ -102,7 +106,7 @@ return undef; } my %res = eval { URI->new("?".$res->content)->query_form }; - warn Dumper(\%res); + warn Dumper(\%res) if $DEBUG; unless ($access_token = $res{access_token}) { warn "No access token in response: ".$res->content; return undef; @@ -115,15 +119,15 @@ } else { #$c->user_session->{'expires'} = time + 3600*24; } - warn "FB: requested access token"; + warn "FB: requested access token" if $DEBUG; } else { - warn "FB: have access token"; + warn "FB: have access token" if $DEBUG; } my $req = URI->new( $self->{facebook_user_info_url} ); $req->query_param( access_token => $access_token ); - warn "Fetching user $req"; + warn "Fetching user $req" if $DEBUG; my $res = $ua->get($req); unless ($res->code == 200) { warn "user request failed: ".$res->status_line; @@ -134,10 +138,15 @@ warn "user '".$res->content."' decode failed: $@"; return undef; } - warn "Userhash = ".Dumper($info); + warn "Userhash = ".Dumper($info) if $DEBUG; #warn "facebook: user=$info->{name} / $info->{id} / $info->{gender}"; + $keeper->{session}->delete_key( 'facebook_redirect_url' ); + delete $local_session->{facebook_redirect_url}; + my @plugins = split (/[\ |\t]+/, $state->{plugins}); + my $name = Encode::encode('utf-8', $info->{name}); + Encode::from_to( $name, 'utf-8', 'koi8-r' ); if ( grep { $_ eq 'users' } @plugins ) { my $user = $keeper->{users}->get_profile( login => 'facebook:'.$info->{id} ); unless ( ref $user ) { @@ -144,8 +153,6 @@ my $user_class = $state->{users}->profile_document_class; $user = $user_class->new( $keeper ); $user->login( 'facebook:'.$info->{id} ); - my $name = Encode::encode('utf-8', $info->{name}); - Encode::from_to( $name, 'utf-8', 'koi8-r' ); $user->name( $name ); $user->status( 1 ); $user->type( 0 ); @@ -186,6 +193,21 @@ while ( my ( $key, $value ) = each %data ) { $local_session->{$key} = $value; } + } else { + my %data = ( + id => $info->{id}, + name => $name, + login => 'facebook:'.$info->{id}, + status => 1, + type => 0, + auth_by => 'facebook', + ltime => time, + avatar => 'https://graph.facebook.com/'.$info->{username}.'/picture?type=large', + ); + $keeper->{session}->store_value ( %data ); + while ( my ( $key, $value ) = each %data ) { + $local_session->{$key} = $value; + } } return $local_session; }