fgraph 0.6.2 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|