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.
Files changed (3) hide show
  1. data/lib/facebook/client.rb +42 -0
  2. data/lib/facebook/login.rb +99 -0
  3. 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
+