facebook-login 0.2.1
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/lib/facebook/client.rb +42 -0
- data/lib/facebook/login.rb +99 -0
- metadata +147 -0
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'oauth2'
|
2
|
+
|
3
|
+
module Facebook
|
4
|
+
# http://www.facebook.com/developers/apps.php?app_id=APPID
|
5
|
+
class Client
|
6
|
+
class << self
|
7
|
+
attr_accessor :app_id, :secret
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.oauth_client(app_id = nil, secret = nil)
|
11
|
+
self.app_id, self.secret = app_id, secret unless app_id.nil?
|
12
|
+
OAuth2::Client.new(self.app_id, self.secret, :site => 'https://graph.facebook.com')
|
13
|
+
end
|
14
|
+
|
15
|
+
def initialize(app_id, secret, options = {})
|
16
|
+
@oauth = self.class.oauth_client(app_id, secret)
|
17
|
+
@default_params = { :scope => options[:permissions], :display => options[:display] }
|
18
|
+
@user_fields = Array(options[:user_fields])
|
19
|
+
end
|
20
|
+
|
21
|
+
# params: redirect_uri, scope, display
|
22
|
+
def authorize_url(params = {})
|
23
|
+
@oauth.web_server.authorize_url(@default_params.merge(params))
|
24
|
+
end
|
25
|
+
|
26
|
+
def get_access_token(code, redirect_uri)
|
27
|
+
@oauth.web_server.get_access_token(code, :redirect_uri => redirect_uri)
|
28
|
+
end
|
29
|
+
|
30
|
+
def restore_access_token(token_string)
|
31
|
+
OAuth2::AccessToken.new(@oauth, token_string)
|
32
|
+
end
|
33
|
+
|
34
|
+
def login_handler(options = {})
|
35
|
+
Login.new(self, options)
|
36
|
+
end
|
37
|
+
|
38
|
+
def get_user_info(access_token, path)
|
39
|
+
access_token.get(path, :fields => @user_fields.join(','))
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,99 @@
|
|
1
|
+
require 'facebook/client'
|
2
|
+
require 'yajl'
|
3
|
+
require 'rack/request'
|
4
|
+
require 'addressable/uri'
|
5
|
+
|
6
|
+
module Facebook
|
7
|
+
class Login
|
8
|
+
attr_reader :options
|
9
|
+
|
10
|
+
def initialize(client, options = {})
|
11
|
+
@client = client
|
12
|
+
@options = { :return_to => '/' }.merge(options)
|
13
|
+
end
|
14
|
+
|
15
|
+
def call(env)
|
16
|
+
request = Request.new(env)
|
17
|
+
callback_url = Addressable::URI.parse(request.url)
|
18
|
+
callback_url.query = nil
|
19
|
+
|
20
|
+
if code = request[:code]
|
21
|
+
handle_facebook_authorization(code, callback_url, request)
|
22
|
+
elsif error = request[:error_reason]
|
23
|
+
handle_error(error, request)
|
24
|
+
else
|
25
|
+
redirect_to_facebook(callback_url)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
module Helpers
|
30
|
+
def facebook_client
|
31
|
+
facebook_oauth.restore_access_token session[:facebook_access_token]
|
32
|
+
end
|
33
|
+
|
34
|
+
def facebook_oauth
|
35
|
+
Facebook::Client.oauth_client
|
36
|
+
end
|
37
|
+
|
38
|
+
def facebook_user
|
39
|
+
if session[:facebook_user]
|
40
|
+
Hashie::Mash.new session[:facebook_user]
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def facebook_logout
|
45
|
+
[:facebook_user, :facebook_access_token].each do |key|
|
46
|
+
session[key] = nil # work around Rails 2.3.5 bug
|
47
|
+
session.delete key
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
class Request < ::Rack::Request
|
53
|
+
# for storing :request_token, :access_token
|
54
|
+
def session
|
55
|
+
env['rack.session'] ||= {}
|
56
|
+
end
|
57
|
+
|
58
|
+
# SUCKS: must duplicate logic from the `url` method
|
59
|
+
def url_for(path)
|
60
|
+
url = scheme + '://' + host
|
61
|
+
|
62
|
+
if scheme == 'https' && port != 443 ||
|
63
|
+
scheme == 'http' && port != 80
|
64
|
+
url << ":#{port}"
|
65
|
+
end
|
66
|
+
|
67
|
+
url << path
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
private
|
72
|
+
|
73
|
+
def handle_facebook_authorization(code, callback_url, request)
|
74
|
+
access_token = @client.get_access_token(code, callback_url)
|
75
|
+
user_info = @client.get_user_info(access_token, '/me')
|
76
|
+
|
77
|
+
request.session[:facebook_access_token] = access_token.token
|
78
|
+
request.session[:facebook_user] = Yajl::Parser.parse(user_info)
|
79
|
+
redirect_to_return_path(request)
|
80
|
+
end
|
81
|
+
|
82
|
+
def handle_error(error, request)
|
83
|
+
request.session[:facebook_error] = error
|
84
|
+
redirect_to_return_path(request)
|
85
|
+
end
|
86
|
+
|
87
|
+
def redirect_to_facebook(callback_url)
|
88
|
+
redirect @client.authorize_url(:redirect_uri => callback_url)
|
89
|
+
end
|
90
|
+
|
91
|
+
def redirect_to_return_path(request)
|
92
|
+
redirect request.url_for(options[:return_to])
|
93
|
+
end
|
94
|
+
|
95
|
+
def redirect(url)
|
96
|
+
['302', {'Location' => url, 'Content-type' => 'text/plain'}, []]
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
metadata
ADDED
@@ -0,0 +1,147 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: facebook-login
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 21
|
5
|
+
prerelease: false
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 2
|
9
|
+
- 1
|
10
|
+
version: 0.2.1
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- "Mislav Marohni\xC4\x87"
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2010-08-15 00:00:00 +02:00
|
19
|
+
default_executable:
|
20
|
+
dependencies:
|
21
|
+
- !ruby/object:Gem::Dependency
|
22
|
+
name: oauth2
|
23
|
+
prerelease: false
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ">="
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
hash: 19
|
30
|
+
segments:
|
31
|
+
- 0
|
32
|
+
- 0
|
33
|
+
- 6
|
34
|
+
version: 0.0.6
|
35
|
+
type: :runtime
|
36
|
+
version_requirements: *id001
|
37
|
+
- !ruby/object:Gem::Dependency
|
38
|
+
name: yajl-ruby
|
39
|
+
prerelease: false
|
40
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ~>
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
hash: 9
|
46
|
+
segments:
|
47
|
+
- 0
|
48
|
+
- 7
|
49
|
+
- 5
|
50
|
+
version: 0.7.5
|
51
|
+
type: :runtime
|
52
|
+
version_requirements: *id002
|
53
|
+
- !ruby/object:Gem::Dependency
|
54
|
+
name: rack
|
55
|
+
prerelease: false
|
56
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ~>
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
hash: 29
|
62
|
+
segments:
|
63
|
+
- 1
|
64
|
+
- 2
|
65
|
+
- 1
|
66
|
+
version: 1.2.1
|
67
|
+
type: :runtime
|
68
|
+
version_requirements: *id003
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: addressable
|
71
|
+
prerelease: false
|
72
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ~>
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
hash: 15
|
78
|
+
segments:
|
79
|
+
- 2
|
80
|
+
- 1
|
81
|
+
- 2
|
82
|
+
version: 2.1.2
|
83
|
+
type: :runtime
|
84
|
+
version_requirements: *id004
|
85
|
+
- !ruby/object:Gem::Dependency
|
86
|
+
name: hashie
|
87
|
+
prerelease: false
|
88
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ~>
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
hash: 23
|
94
|
+
segments:
|
95
|
+
- 0
|
96
|
+
- 2
|
97
|
+
- 0
|
98
|
+
version: 0.2.0
|
99
|
+
type: :runtime
|
100
|
+
version_requirements: *id005
|
101
|
+
description: Easy integration with Facebook Graph for your application
|
102
|
+
email: mislav.marohnic@gmail.com
|
103
|
+
executables: []
|
104
|
+
|
105
|
+
extensions: []
|
106
|
+
|
107
|
+
extra_rdoc_files: []
|
108
|
+
|
109
|
+
files:
|
110
|
+
- lib/facebook/client.rb
|
111
|
+
- lib/facebook/login.rb
|
112
|
+
has_rdoc: false
|
113
|
+
homepage: http://github.com/mislav/facebook
|
114
|
+
licenses: []
|
115
|
+
|
116
|
+
post_install_message:
|
117
|
+
rdoc_options: []
|
118
|
+
|
119
|
+
require_paths:
|
120
|
+
- lib
|
121
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
122
|
+
none: false
|
123
|
+
requirements:
|
124
|
+
- - ">="
|
125
|
+
- !ruby/object:Gem::Version
|
126
|
+
hash: 3
|
127
|
+
segments:
|
128
|
+
- 0
|
129
|
+
version: "0"
|
130
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
131
|
+
none: false
|
132
|
+
requirements:
|
133
|
+
- - ">="
|
134
|
+
- !ruby/object:Gem::Version
|
135
|
+
hash: 3
|
136
|
+
segments:
|
137
|
+
- 0
|
138
|
+
version: "0"
|
139
|
+
requirements: []
|
140
|
+
|
141
|
+
rubyforge_project:
|
142
|
+
rubygems_version: 1.3.7
|
143
|
+
signing_key:
|
144
|
+
specification_version: 3
|
145
|
+
summary: REST library + Rack middleware for the Facebook Graph API
|
146
|
+
test_files: []
|
147
|
+
|