fgraph 0.6.2 → 0.7.0
Sign up to get free protection for your applications and to get access to all the features.
- data/History +4 -0
- data/README.rdoc +1 -1
- data/VERSION.yml +2 -2
- data/lib/fgraph.rb +4 -3
- data/lib/fgraph/rails/fgraph_helper.rb +89 -79
- data/lib/fgraph/rails/fgraph_tag_helper.rb +7 -6
- data/test/fgraph_test.rb +1 -1
- metadata +7 -5
data/History
CHANGED
data/README.rdoc
CHANGED
@@ -177,7 +177,7 @@ Sample codes:
|
|
177
177
|
</script>
|
178
178
|
|
179
179
|
<!-- Facebook Login Button -->
|
180
|
-
<fb:login-button autologoutlink="true"
|
180
|
+
<fb:login-button autologoutlink="true" scope="email,publish_stream"></fb:login-button>
|
181
181
|
|
182
182
|
<% if fgraph_logged_in? %>
|
183
183
|
<br>Hello <%= fgraph_user['name'] %>,
|
data/VERSION.yml
CHANGED
data/lib/fgraph.rb
CHANGED
@@ -191,7 +191,7 @@ module FGraph
|
|
191
191
|
# # redirect_uri=http://www.example.com/oauth_redirect&
|
192
192
|
# # code=...
|
193
193
|
# FGraph.oauth_access_token('[client id]', '[client secret]',
|
194
|
-
# :redirect_uri => '
|
194
|
+
# :redirect_uri => 'http://www.example.com/oauth_redirect',
|
195
195
|
# :code => '[authorization code]')
|
196
196
|
#
|
197
197
|
# Application access token requires <tt>:type => 'client_cred'</td> option. Used to access application
|
@@ -206,7 +206,8 @@ module FGraph
|
|
206
206
|
def oauth_access_token(client_id, client_secret, options={})
|
207
207
|
url = self.format_url('/oauth/access_token', {
|
208
208
|
:client_id => client_id,
|
209
|
-
:client_secret => client_secret
|
209
|
+
:client_secret => client_secret,
|
210
|
+
:redirect_uri => ''
|
210
211
|
}.merge(options || {}))
|
211
212
|
|
212
213
|
response = self.perform_get(url)
|
@@ -353,7 +354,7 @@ module FGraph
|
|
353
354
|
options = stringified_options
|
354
355
|
|
355
356
|
options.each do |option|
|
356
|
-
next
|
357
|
+
next unless option[0]
|
357
358
|
url << "&" if option_count > 0
|
358
359
|
url << "#{option[0]}=#{CGI.escape(option[1].to_s)}"
|
359
360
|
option_count += 1
|
@@ -1,88 +1,98 @@
|
|
1
1
|
module FGraph
|
2
2
|
module Rails
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
3
|
+
module FGraphHelper
|
4
|
+
|
5
|
+
# Access FGraph.config initialized with values set in <tt>[RAILS_ROOT]/config/fgraph.yml</tt>.
|
6
|
+
def fgraph_config
|
7
|
+
FGraph.config || {}
|
8
|
+
end
|
9
|
+
|
10
|
+
# Return Facebook session, default to retrieve session from cookies.
|
11
|
+
def fgraph_session(app_id = fgraph_config['app_id'],
|
12
|
+
app_secret = fgraph_config['app_secret'])
|
13
|
+
|
14
|
+
return @fgraph_session if @fgraph_session
|
15
|
+
@fgraph_session = fgraph_session_cookies(app_id, app_secret)
|
16
|
+
end
|
17
|
+
|
18
|
+
# Return Facebook session cookies.
|
19
|
+
def fgraph_session_cookies(app_id = fgraph_config['app_id'],
|
20
|
+
app_secret = fgraph_config['app_secret'])
|
9
21
|
|
10
|
-
|
11
|
-
|
12
|
-
app_secret = fgraph_config['app_secret'])
|
13
|
-
|
14
|
-
return @fgraph_session if @fgraph_session
|
15
|
-
@fgraph_session = fgraph_session_cookies(app_id, app_secret)
|
16
|
-
end
|
17
|
-
|
18
|
-
# Return Facebook session cookies.
|
19
|
-
def fgraph_session_cookies(app_id = fgraph_config['app_id'],
|
20
|
-
app_secret = fgraph_config['app_secret'])
|
21
|
-
|
22
|
-
return @fgraph_session_cookies if @fgraph_session_cookies
|
23
|
-
return if @fgraph_session_cookies == false
|
24
|
-
|
25
|
-
# retrieve session from cookies
|
26
|
-
fbs_cookies = request.cookies["fbs_#{app_id}"]
|
27
|
-
if app_id.blank? or app_secret.blank? or fbs_cookies.blank?
|
28
|
-
return @fgraph_session_cookies = false
|
29
|
-
end
|
22
|
+
return @fgraph_session_cookies if @fgraph_session_cookies
|
23
|
+
return if @fgraph_session_cookies == false
|
30
24
|
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
session_cookies[key] = value[0]
|
36
|
-
end
|
37
|
-
|
38
|
-
# Validate session cookies
|
39
|
-
cookie_message = ''
|
40
|
-
session_cookies_list = session_cookies.sort
|
41
|
-
session_cookies_list.each do |cookie|
|
42
|
-
cookie_message += "#{cookie[0]}=#{cookie[1]}" if cookie[0] != 'sig'
|
43
|
-
end
|
25
|
+
fbsr_cookie = request.cookies["fbsr_#{app_id}"]
|
26
|
+
if app_id.blank? or app_secret.blank? or fbsr_cookie.blank?
|
27
|
+
return @fgraph_session_cookies = false
|
28
|
+
end
|
44
29
|
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
30
|
+
# Get authorization code and access token
|
31
|
+
signed_request = fgraph_parse_signed_request(fbsr_cookie, app_secret)
|
32
|
+
resp = FGraph.oauth_access_token(app_id, app_secret, :code => signed_request['code'])
|
33
|
+
|
34
|
+
@fgraph_session_cookies = {
|
35
|
+
'access_token' => resp['access_token']
|
36
|
+
}
|
37
|
+
end
|
38
|
+
|
39
|
+
def fgraph_base64_url_decode(str)
|
40
|
+
str += '=' * (4 - str.length.modulo(4))
|
41
|
+
Base64.decode64(str.tr('-_', '+/'))
|
42
|
+
end
|
43
|
+
|
44
|
+
# Parses a signed request string provided by Facebook to canvas apps or in a secure cookie.
|
45
|
+
#
|
46
|
+
# @param Input the signed request from Facebook
|
47
|
+
# @raise RuntimeError if the signature is incomplete, invalid, or using an unsupported algorithm
|
48
|
+
# @return A hash of the validated request information
|
49
|
+
def fgraph_parse_signed_request(input, app_secret)
|
50
|
+
encoded_sig, encoded_envelope = input.split('.', 2)
|
51
|
+
raise FGraph::OAuthError, 'SignedRequest: Invalid (incomplete) signature data' unless encoded_sig && encoded_envelope
|
49
52
|
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
53
|
+
signature = fgraph_base64_url_decode(encoded_sig).unpack("H*").first
|
54
|
+
envelope = ActiveSupport::JSON.decode(fgraph_base64_url_decode(encoded_envelope))
|
55
|
+
raise FGraph::OAuthError, "SignedRequest: Unsupported algorithm #{envelope['algorithm']}" if envelope['algorithm'] != 'HMAC-SHA256'
|
56
|
+
|
57
|
+
hmac = OpenSSL::HMAC.hexdigest(OpenSSL::Digest::SHA256.new, app_secret, encoded_envelope)
|
58
|
+
raise FGraph::OAuthError, 'SignedRequest: Invalid signature' if (signature != hmac)
|
59
|
+
|
60
|
+
envelope
|
61
|
+
end
|
62
|
+
|
63
|
+
def fgraph_access_token
|
64
|
+
return unless fgraph_session
|
65
|
+
fgraph_session['access_token']
|
66
|
+
end
|
67
|
+
|
68
|
+
def fgraph_logged_in?
|
69
|
+
return true if fgraph_session and fgraph_access_token
|
70
|
+
end
|
71
|
+
|
72
|
+
# Currently logged in facebook user
|
73
|
+
def fgraph_current_user
|
74
|
+
return @fgraph_current_user if @fgraph_current_user
|
75
|
+
@fgraph_current_user = fgraph_client.me
|
76
|
+
end
|
77
|
+
|
78
|
+
# Alias for fgraph_current_user
|
79
|
+
def fgraph_user
|
80
|
+
fgraph_current_user
|
81
|
+
end
|
82
|
+
|
83
|
+
# Return FGraph::Client instance initialized with settings set in <tt>fgraph.yml</tt>.
|
84
|
+
# Initialized with <tt>:access_token</tt> as well if Facebook session exists.
|
85
|
+
def fgraph_client
|
86
|
+
return @fgraph_client if @fgraph_client
|
87
|
+
|
88
|
+
@fgraph_client = FGraph::Client.new(
|
89
|
+
:client_id => fgraph_config['app_id'],
|
90
|
+
:client_secret => fgraph_config['app_secret'],
|
91
|
+
:access_token => fgraph_access_token
|
92
|
+
)
|
93
|
+
end
|
94
|
+
|
95
|
+
# Return Facebook object picture url: http://graph.facebook.com/[id]/picture
|
86
96
|
#
|
87
97
|
# ==== Type Options
|
88
98
|
# * <tt>square</tt> - 50x50 (default)
|
@@ -40,12 +40,13 @@ module FGraph
|
|
40
40
|
window.afterFbAsyncInit();
|
41
41
|
}
|
42
42
|
};
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
43
|
+
|
44
|
+
(function(d) {
|
45
|
+
var js, id = 'facebook-jssdk'; if (d.getElementById(id)) {return;}
|
46
|
+
js = d.createElement('script'); js.id = id; js.async = true;
|
47
|
+
js.src = "//connect.facebook.net/en_US/all.js";
|
48
|
+
d.getElementsByTagName('head')[0].appendChild(js);
|
49
|
+
}(document));
|
49
50
|
</script>
|
50
51
|
}
|
51
52
|
else
|
data/test/fgraph_test.rb
CHANGED
@@ -229,7 +229,7 @@ class FGraphTest < Test::Unit::TestCase
|
|
229
229
|
|
230
230
|
should "return URL without empty options" do
|
231
231
|
formatted_url = FGraph.format_url('/test', {:username => 'john', :age => nil})
|
232
|
-
assert_equal "https://graph.facebook.com/test?username=john", formatted_url
|
232
|
+
assert_equal "https://graph.facebook.com/test?username=john&age=", formatted_url
|
233
233
|
end
|
234
234
|
end
|
235
235
|
|
metadata
CHANGED
@@ -5,9 +5,9 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
-
|
10
|
-
version: 0.
|
8
|
+
- 7
|
9
|
+
- 0
|
10
|
+
version: 0.7.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Herryanto Siatono
|
@@ -15,7 +15,8 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-
|
18
|
+
date: 2011-12-27 00:00:00 +08:00
|
19
|
+
default_executable:
|
19
20
|
dependencies:
|
20
21
|
- !ruby/object:Gem::Dependency
|
21
22
|
name: httparty
|
@@ -110,6 +111,7 @@ files:
|
|
110
111
|
- test/fixtures/access_token.txt
|
111
112
|
- test/fixtures/object_cocacola.json
|
112
113
|
- test/test_helper.rb
|
114
|
+
has_rdoc: true
|
113
115
|
homepage: http://github.com/jugend/fgraph
|
114
116
|
licenses: []
|
115
117
|
|
@@ -139,7 +141,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
139
141
|
requirements: []
|
140
142
|
|
141
143
|
rubyforge_project:
|
142
|
-
rubygems_version: 1.
|
144
|
+
rubygems_version: 1.4.2
|
143
145
|
signing_key:
|
144
146
|
specification_version: 3
|
145
147
|
summary: Ruby Facebook Graph API
|