Revision 239
Date:
2012/09/03 18:53:21
Author:
ahitrov
Revision Log:
New Facebook oAuth
Files:
Legend:
Added
Removed
Modified
utf8/plugins/session/comps/www/oauth/facebook.html
1
<script type="text/javascript">
2
<!--
3
opener.AuthOnEnd();
4
close();
5
//-->
6
</script>
7
8
<pre><% Dumper($fb_connect) %></pre>
9
%#<a href="<% $auth_url->as_string %>"><% $auth_url->as_string %></a>
10
<pre><% Dumper($session) %></pre>
11
12
<%doc>
13
14
Manual redirect:
15
16
use session::AUTH::FaceBook;
17
my $site = $state->development ? 'www22.zvuki.ru' : 'www.zvuki.ru';
18
my $fb_connect = session::AUTH::FaceBook->new(
19
facebook_redirect_uri => 'http://'.$site.'/oauth/facebook.html',
20
);
21
22
</%doc>
23
<%args>
24
25
$code => undef
26
$state => undef
27
28
</%args>
29
<%init>
30
31
my $fb_connect = session::AUTH::FaceBook->new();
32
my $auth_url = $fb_connect->fb_authorize_url( state => $state );
33
if ( $code ) {
34
my $local_session = $fb_connect->authenticate( code => $code, state => $state );
35
if ( ref $local_session && exists $local_session->{id} ) {
36
my $profile = $keeper->{users}->get_profile( id => $local_session->{id} );
37
if ( ref $profile ) {
38
unless ( exists $local_session->{avatar} ) {
39
my $avatar = $profile->get_image('avatar');
40
$session->{avatar} = ref $avatar && exists $avatar->{filename} ? $avatar->{mini}{'54x54'}{filename} : undef;
41
$keeper->{session}->store_value (
42
name => $profile->name_full,
43
last_name => $profile->name_family,
44
first_name => $profile->name_part,
45
avatar => $session->{avatar},
46
);
47
} else {
48
$keeper->{session}->store_value (
49
name => $profile->name_full,
50
last_name => $profile->name_family,
51
first_name => $profile->name_part,
52
);
53
}
54
}
55
}
56
} elsif ( $auth_url ) {
57
$m->redirect($auth_url->as_string);
58
} else {
59
&abort404 unless $DEBUG;
60
}
61
62
</%init>
utf8/plugins/session/config.proto
50
50
### AUTH::FaceBook
51
51
######################################
52
52
FACEBOOK_APP_ID =
53
FACEBOOK_APP_KEY =
54
53
FACEBOOK_APP_SECRET =
55
FACEBOOK_AUTHOTIZE_URL = https://graph.facebook.com/oauth/authorize
54
FACEBOOK_AUTHOTIZE_URL = https://www.facebook.com/dialog/oauth
56
55
FACEBOOK_ACCESS_TOKEN_URL = https://graph.facebook.com/oauth/access_token
57
56
FACEBOOK_USER_INFO_URL = https://graph.facebook.com/me
58
57
FACEBOOK_REDIRECT_URL =
59
58
FACEBOOK_USER_POST_URL =
60
59
60
REWRITE += FACEBOOK_APP_ID FACEBOOK_APP_SECRET FACEBOOK_REDIRECT_URL
61
61
REWRITE += FACEBOOK_AUTHOTIZE_URL FACEBOOK_ACCESS_TOKEN_URL FACEBOOK_USER_INFO_URL
62
62
63
63
CONNECTION_TIMEOUT = 3
utf8/plugins/session/lib/session/AUTH/FaceBook.pm
16
16
=for rem
17
17
facebook:
18
18
auto_create_user: 1
19
app_id: 122117614500563
20
app_key: 3da06301715b0efc5c873535c56c2c33
21
app_secret: 656bd1369486b902e9bf831a9a08132b
22
authorize_url: https://graph.facebook.com/oauth/authorize
19
app_id: 15 decimal digits
20
app_secret: 32 hex digits
21
authorize_url: https://www.facebook.com/dialog/oauth
23
22
access_token_url: https://graph.facebook.com/oauth/access_token
24
23
user_info_url: https://graph.facebook.com/me
25
24
user_post_url: ~
25
state: is passed back to your app as a parameter of the redirect_uri when the user completed the authentication
26
26
store:
27
27
class: "+Comments::Authentication::Store"
28
28
type: facebook
…
…
42
42
sub new {
43
43
my ($class, %config) = @_;
44
44
my $self = bless {}, $class;
45
for (qw(facebook_app_id facebook_app_key facebook_app_secret facebook_authorize_url facebook_access_token_url facebook_user_info_url)) {
46
$self->{$_} = $config{$_} || $state->{session}->{$_} || return undef;
45
for (qw(facebook_app_id facebook_app_secret facebook_authorize_url facebook_access_token_url facebook_user_info_url)) {
46
$self->{$_} = $config{$_} || $state->{session}{$_} || return undef;
47
47
}
48
$self->{timeout} = $state->{session}->{connection_timeout} || 3;
48
$self->{timeout} = $state->{session}{connection_timeout} || 3;
49
49
for (qw(facebook_user_post_url facebook_redirect_uri)) {
50
$self->{$_} = $config{$_} || $state->{session}->{$_};
50
$self->{$_} = $config{$_} || $state->{session}{$_};
51
51
}
52
52
return $self;
53
53
}
…
…
56
56
my $self = shift;
57
57
my (%args) = @_;
58
58
my $go = URI->new( $self->{facebook_authorize_url} );
59
warn Dumper($go);
60
$go->query_param( client_id => $self->{facebook_app_key} );
59
$go->query_param( client_id => $self->{facebook_app_id} );
60
$go->query_param( state => $args{state} ) if $args{state};
61
61
$go->query_param( scope => "publish_stream" );
62
62
$args{redirect_uri} ||= $self->{facebook_redirect_uri};
63
63
for ( keys %args ) {
64
64
$go->query_param( $_ => $args{$_} );
65
65
}
66
$keeper->{session}->store_value( facebook_redirect_url => $self->{facebook_redirect_uri} );
66
warn Dumper($go) if $DEBUG;
67
67
return $go;
68
68
}
69
69
…
…
71
71
my ( $self, %authinfo ) = @_;
72
72
warn "FB.authenticate" if $DEBUG;
73
73
# TODO: we need callback url
74
#warn "user_session=".dumper( $c->user_session )." ";
75
74
my $local_session = $session || $keeper->{session}->get_session;
76
my $redirect_uri = $local_session->{facebook_redirect_url};
75
my $redirect_uri = $self->{facebook_redirect_uri};
77
76
78
77
my $access_token = $local_session->{facebook_access_token};
79
78
my $expires = $local_session->{facebook_expires};
…
…
95
94
$req->query_param( redirect_uri => $redirect_uri );
96
95
$req->query_param( client_secret=> $self->{facebook_app_secret} );
97
96
$req->query_param( code => $code);
98
warn "Get $req";
97
warn "Get $req" if $DEBUG;
99
98
my $res = $ua->get($req);
100
99
unless ($res->code == 200) {
101
100
warn "access_token request failed: ".$res->status_line;
102
101
return undef;
103
102
}
104
103
my %res = eval { URI->new("?".$res->content)->query_form };
105
warn Dumper(\%res);
104
warn Dumper(\%res) if $DEBUG;
106
105
unless ($access_token = $res{access_token}) {
107
106
warn "No access token in response: ".$res->content;
108
107
return undef;
…
…
115
114
} else {
116
115
#$c->user_session->{'expires'} = time + 3600*24;
117
116
}
118
warn "FB: requested access token";
117
warn "FB: requested access token" if $DEBUG;
119
118
} else {
120
warn "FB: have access token";
119
warn "FB: have access token" if $DEBUG;
121
120
}
122
121
123
122
my $req = URI->new( $self->{facebook_user_info_url} );
124
123
$req->query_param( access_token => $access_token );
125
124
126
warn "Fetching user $req";
125
warn "Fetching user $req" if $DEBUG;
127
126
my $res = $ua->get($req);
128
127
unless ($res->code == 200) {
129
128
warn "user request failed: ".$res->status_line;
…
…
134
133
warn "user '".$res->content."' decode failed: $@";
135
134
return undef;
136
135
}
137
warn "Userhash = ".Dumper($info);
136
warn "Userhash = ".Dumper($info) if $DEBUG;
138
137
#warn "facebook: user=$info->{name} / $info->{id} / $info->{gender}";
139
138
140
139
$keeper->{session}->delete_key( 'facebook_redirect_url' );
…
…
154
153
$user->login_method('facebook');
155
154
$user->country( $info->{locale} );
156
155
$user->email( undef );
156
157
my ($prop_ava) = grep { $_->{attr} eq 'avatar' && $_->{type} eq 'image' } $user->structure;
158
if ( ref $prop_ava ) {
159
my $avatar = $user->_store_image( 'https://graph.facebook.com/'.$info->{username}.'/picture?type=large', attr => 'avatar' );
160
$user->avatar( $user->_serialize($avatar) );
161
}
162
157
163
$user->store;
164
} else {
165
my ($prop_ava) = grep { $_->{attr} eq 'avatar' && $_->{type} eq 'image' } $user->structure;
166
if ( ref $prop_ava ) {
167
my $avatar = $user->get_image( 'avatar' );
168
unless ( ref $avatar && exists $avatar->{filename} ) {
169
my $avatar = $user->_store_image( 'https://graph.facebook.com/'.$info->{username}.'/picture?type=large', attr => 'avatar' );
170
$user->avatar( $user->_serialize($avatar) );
171
$user->store;
172
}
173
}
158
174
}
159
175
my %data = (
160
176
id => $user->id,
…
…
163
179
status => $user->status,
164
180
type => $user->type,
165
181
ltime => time,
182
avatar => 'https://graph.facebook.com/'.$info->{username}.'/picture',
166
183
);
167
184
$keeper->{session}->store_value ( %data );
168
185
while ( my ( $key, $value ) = each %data ) {
Небольшая справка по веткам
cnddist – контейнер, в котором хранятся все дистрибутивы всех библиотек и программных пакетов, которые использовались при построении различных версий Contenido. Если какой-то библиотеки в данном хранилище нет, инсталлятор сделает попытку "подтянуть" ее с веба (например, с CPAN). Если библиотека слишком старая, есть очень большая вероятность, что ее там уже нет. Поэтому мы храним весь хлам от всех сборок. Если какой-то дистрибутив вдруг отсутствует в cnddist - напишите нам, мы положим его туда.
koi8 – отмирающая ветка, чей код, выдача и все внутренние библиотеки заточены на кодировку KOI8-R. Вносятся только те дополнения, которые касаются внешнего вида и функционала админки, баги ядра, обязательные обновления портов и мелочи, которые легко скопипастить. В дальнейшем планируется полная остановка поддержки по данной ветке.
utf8 – актуальная ветка, заточенная под UTF-8.
Внутри каждой ветки: core – исходники ядра; install – скрипт установки инсталляции; plugins – плагины; samples – "готовые к употреблению" проекты, которые можно поставить, запустить и посмотреть, как они работают.