devise_facebook_connectable 0.1.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/Rakefile ADDED
@@ -0,0 +1,46 @@
1
+ # encoding: utf-8
2
+ require 'rubygems'
3
+ require 'rake'
4
+ require 'rake/rdoctask'
5
+
6
+ NAME = "devise_facebook_connectable"
7
+ SUMMARY = %{Devise << Facebook Connect.}
8
+ HOMEPAGE = "http://github.com/grimen/#{NAME}"
9
+ AUTHORS = ["Jonas Grimfelt"]
10
+ EMAIL = "grimen@gmail.com"
11
+ SUPPORT_FILES = %w(README)
12
+
13
+ begin
14
+ gem 'jeweler'
15
+ require 'jeweler'
16
+ Jeweler::Tasks.new do |gemspec|
17
+ gemspec.name = NAME
18
+ gemspec.summary = SUMMARY
19
+ gemspec.description = SUMMARY
20
+ gemspec.homepage = HOMEPAGE
21
+ gemspec.authors = AUTHORS
22
+ gemspec.email = EMAIL
23
+
24
+ gemspec.require_paths = %w{lib}
25
+ gemspec.files = SUPPORT_FILES << %w(Rakefile) <<
26
+ Dir.glob(File.join(*%w[{assets,lib} ** *]).to_s)
27
+ gemspec.extra_rdoc_files = SUPPORT_FILES
28
+
29
+ gemspec.add_dependency 'activesupport', '>= 2.3.0'
30
+ gemspec.add_dependency 'devise', '>= 0.7.0'
31
+ gemspec.add_dependency 'facebooker', '>= 1.0.55'
32
+ end
33
+ Jeweler::GemcutterTasks.new
34
+ rescue LoadError
35
+ puts "Jeweler - or one of its dependencies - is not available. " <<
36
+ "Install it with: sudo gem install jeweler -s http://gemcutter.org"
37
+ end
38
+
39
+ desc %Q{Generate documentation for "#{NAME}".}
40
+ Rake::RDocTask.new(:rdoc) do |rdoc|
41
+ rdoc.rdoc_dir = 'rdoc'
42
+ rdoc.title = NAME
43
+ rdoc.options << '--line-numbers' << '--inline-source' << '--charset=UTF-8'
44
+ rdoc.rdoc_files.include(SUPPORT_FILES)
45
+ rdoc.rdoc_files.include(File.join(*%w[lib ** *.rb]))
46
+ end
@@ -0,0 +1,30 @@
1
+ # encoding: utf-8
2
+ require 'facebooker'
3
+
4
+ module Devise
5
+ module FacebookConnectable
6
+ module Controllers
7
+ module Filters
8
+
9
+ def self.included(klass)
10
+ klass.class_eval do
11
+ before_filter :set_facebook_session
12
+ helper_method :facebook_session # session[:facebook_session]
13
+ rescue_from ::Facebooker::Session::SessionExpired, :with => :facebook_session_expired
14
+
15
+ # Handle expired Facebook sessions automatically.
16
+ #
17
+ def facebook_session_expired
18
+ clear_fb_cookies!
19
+ clear_facebook_session_information
20
+ redirect_to root_url # TODO: Maybe a bad assumption? Maybe just re-load current page?
21
+ end
22
+ end
23
+ end
24
+
25
+ end
26
+ end
27
+ end
28
+ end
29
+
30
+ ActionController::Base.send :include, Devise::FacebookConnectable::Controllers::Filters
@@ -0,0 +1,7 @@
1
+ en:
2
+ devise:
3
+ sessions:
4
+ facebook_invalid: "Could not login. Invalid account."
5
+ facebook_session_expired: "Could not login. Facebook Connect session expired."
6
+ facebook_login: "Connect"
7
+ facebook_logout: "Logout"
@@ -0,0 +1,208 @@
1
+ # encoding: utf-8
2
+ require 'devise_facebook_connectable/strategy'
3
+ require 'devise_facebook_connectable/serializer'
4
+
5
+ module Devise
6
+ module FacebookConnectable
7
+ module Model
8
+ # Facebook Connectable Module, responsible for validating authenticity of a
9
+ # user and storing credentials while signing in using their Facebook account.
10
+ #
11
+ # Configuration:
12
+ #
13
+ # You can overwrite configuration values by setting in globally in Devise (+Devise.setup+),
14
+ # using devise method, or overwriting the respective instance method.
15
+ #
16
+ # facebook_uid_field: Defines the name of the Facebook user UID database attribute/column.
17
+ #
18
+ # facebook_session_key_field: Defines the name of the Facebook session key database attribute/column.
19
+ #
20
+ # facebook_skip_create: Speifies if account should automatically be created upon connect
21
+ # if not already exists.
22
+ #
23
+ # Examples:
24
+ #
25
+ # User.facebook_connect(:uid => '123456789') # returns authenticated user or nil
26
+ # User.find(1).facebook_connected? # returns true/false
27
+ #
28
+ module FacebookConnectable
29
+
30
+ DEFAULT_FACEBOOK_UID_FIELD = :facebook_uid
31
+ DEFAULT_FACEBOOK_SESSION_KEY_FIELD = :facebook_session_key
32
+
33
+ def self.included(base)
34
+ base.class_eval do
35
+ extend ClassMethods
36
+ extend ::Devise::Models::SessionSerializer
37
+
38
+ cattr_accessor :facebook_uid_field, :facebook_session_key_field, :facebook_skip_create
39
+ end
40
+ end
41
+
42
+ # Store Facebook Connect account/session credentials.
43
+ #
44
+ def store_facebook_credentials!(attributes = {})
45
+ # FIXME: Don't work...nil for some reason.
46
+ # self.send(:"#{self.class.facebook_uid_field}=", attributes[:uid])
47
+ # self.send(:"#{self.class.facebook_session_key_field}=", attributes[:session_key])
48
+
49
+ self.send(:"#{DEFAULT_FACEBOOK_UID_FIELD}=", attributes[:uid])
50
+ self.send(:"#{DEFAULT_FACEBOOK_SESSION_KEY_FIELD}=", attributes[:session_key])
51
+
52
+ # Only populate +email+ field if it's available (say, if +authenticable+ module is used).
53
+ self.email = attributes[:email] || '' if self.respond_to?(:email)
54
+
55
+ # Lazy hack: These database fields are required if +authenticable+/+confirmable+
56
+ # module(s) is used.
57
+ self.password_salt = '' if self.respond_to?(:password_salt)
58
+ self.encrypted_password = '' if self.respond_to?(:encrypted_password)
59
+ self.confirmed_at = ::Time.now if self.respond_to?(:confirmed_at)
60
+ end
61
+
62
+ # Checks if Facebook Connect:ed.
63
+ #
64
+ def facebook_connected?
65
+ self.send(:"#{self.class.facebook_uid_field}").present?
66
+ end
67
+ alias :is_facebook_connected? :facebook_connected?
68
+
69
+ # Hook that gets called before connect (each time). Useful for
70
+ # fetching additional user info (etc.) from Facebook.
71
+ #
72
+ # Default: Do nothing.
73
+ #
74
+ # Examples:
75
+ #
76
+ # # Overridden in Facebook Connect:able model, e.g. "User".
77
+ # #
78
+ # def before_facebook_connect(fb_session)
79
+ #
80
+ # # Just fetch what we really need from Facebook...
81
+ # fb_session.user.populate(:locale, :current_location, :username, :name,
82
+ # :first_name, :last_name, :birthday_date, :sex,
83
+ # :city, :state, :country)
84
+ #
85
+ # self.locale = my_fancy_locale_parser(fb_session.user.locale)
86
+ # "Stockholm" => "(GMT+01:00) Stockholm", "Never-Never-land" => "(GMT+00:00) UTC"
87
+ # self.time_zone = fb_session.user.current_location.try(:city)
88
+ # self.country = fb_session.user.current_location.try(:country)
89
+ #
90
+ # self.username = fb_session.user.username
91
+ #
92
+ # self.profile.real_name = fb_session.user.name
93
+ # self.profile.first_name = fb_session.user.first_name
94
+ # self.profile.last_name = fb_session.user.last_name
95
+ # self.profile.birthdate = fb_session.user.birthday_date.try(:to_date)
96
+ # self.profile.gender = my_fancy_gender_parser(fb_session.user.sex)
97
+ #
98
+ # self.profile.city = fb_session.user.hometown_location.try(:city)
99
+ # self.profile.zip_code = fb_session.user.hometown_location.try(:state)
100
+ # self.profile.country = fb_session.user.hometown_location.try(:country)
101
+ #
102
+ # # etc...
103
+ #
104
+ # end
105
+ #
106
+ # For more info:
107
+ # http://facebooker.pjkh.com/user/populate
108
+ #
109
+ def before_facebook_connect(facebook_session)
110
+ # Default: Do nothing.
111
+ end
112
+ alias :before_connect :before_facebook_connect
113
+
114
+ def store_session(using_session_key)
115
+ if self.session_key != using_session_key
116
+ self.update_attribute(:facebook_session_key, using_session_key)
117
+ end
118
+ end
119
+
120
+ # Optional: Recreate Facebook session for this account/user.
121
+ #
122
+ def new_facebook_session
123
+ returning(::Facebooker::Session.create) do |new_session|
124
+ new_session.secure_with!(self.facebook_session_key, self.facebook_uid, 1.hour.from_now)
125
+ ::Facebooker::Session.current = new_session
126
+ end
127
+ end
128
+
129
+ # Optional: See +new_facebook_session+.
130
+ #
131
+ def facebook_session(force = false)
132
+ @facebook_session = self.new_facebook_session if force || @facebook_session.nil?
133
+ @facebook_session
134
+ end
135
+
136
+ module ClassMethods
137
+
138
+ # Alias don't work for some reason, so...a more Ruby-ish alias
139
+ # for +facebook_skip_create+.
140
+ #
141
+ def facebook_skip_create?
142
+ self.facebook_skip_create
143
+ end
144
+
145
+ # Specifies the name of the database column name used for storing
146
+ # the user Facebook UID.
147
+ #
148
+ def facebook_uid_field
149
+ @@facebook_uid_field ||= DEFAULT_FACEBOOK_UID_FIELD
150
+ end
151
+
152
+ # Specifies the name of the database column name used for storing
153
+ # the user Facebook session key.
154
+ #
155
+ def facebook_session_key_field
156
+ @@facebook_session_key_field ||= DEFAULT_FACEBOOK_SESSION_KEY_FIELD
157
+ end
158
+
159
+ # Authenticate using a Facebook UID.
160
+ #
161
+ def facebook_connect(attributes = {})
162
+ if attributes[:uid].present?
163
+ self.find_for_facebook_connect(attributes[:uid])
164
+ end
165
+ end
166
+
167
+ protected
168
+
169
+ # Find first record based on conditions given (Facebook UID).
170
+ # Overwrite to add customized conditions, create a join, or maybe use a
171
+ # namedscope to filter records while authenticating.
172
+ #
173
+ # Example:
174
+ #
175
+ # def self.find_for_facebook_connect(conditions = {})
176
+ # conditions[:active] = true
177
+ # self.find(:first, :conditions => conditions)
178
+ # end
179
+ #
180
+ def find_for_facebook_connect(uid)
181
+ self.find_by_facebook_uid(uid)
182
+ end
183
+
184
+ # Contains the logic used in authentication. Overwritten by other devise modules.
185
+ # In the Facebook Connect case; nothing fancy required.
186
+ #
187
+ def valid_for_facebook_connect(resource, attributes)
188
+ true
189
+ end
190
+
191
+ # Configuration params accessible within +Devise.setup+ procedure (in initalizer).
192
+ #
193
+ ::Devise::Models.config(self,
194
+ :facebook_uid_field,
195
+ :facebook_session_key_field,
196
+ :facebook_skip_create
197
+ )
198
+
199
+ end
200
+
201
+ end
202
+ end
203
+ end
204
+ end
205
+
206
+ Devise::Models.module_eval do
207
+ include ::Devise::FacebookConnectable::Model
208
+ end
@@ -0,0 +1,9 @@
1
+ # encoding: utf-8
2
+
3
+ ActionController::Routing::RouteSet::Mapper.class_eval do
4
+
5
+ protected
6
+ # Re-use "authenticatable"-stuff.
7
+ alias :facebook_connectable :authenticatable
8
+
9
+ end
@@ -0,0 +1,21 @@
1
+ # encoding: utf-8
2
+ require 'devise_facebook_connectable/model'
3
+
4
+ module Devise
5
+ module FacebookConnectable
6
+ module Schema
7
+
8
+ # Creates facebook_uid and facebook_session_key (for Facebook Connect authentication/management).
9
+ def facebook_connectable
10
+ # apply_schema ::Devise::Models::FacebookConnectable.facebook_uid_field, Integer, :limit => 8 # BIGINT unsigned / 64-bit int
11
+ apply_schema ::Devise::Models::FacebookConnectable.facebook_uid_field, String
12
+ apply_schema ::Devise::Models::FacebookConnectable.facebook_session_key_field, String
13
+ end
14
+
15
+ end
16
+ end
17
+ end
18
+
19
+ Devise::Schema.module_eval do
20
+ include ::Devise::FacebookConnectable::Schema
21
+ end
@@ -0,0 +1,3 @@
1
+ # encoding: utf-8
2
+
3
+ Warden::Serializers.add(:facebook_connectable, Devise::Serializers::Authenticatable)
@@ -0,0 +1,60 @@
1
+ # encoding: utf-8
2
+
3
+ module Devise
4
+ module Strategies
5
+
6
+ # Default strategy for signing in a user using Facebook Connect (a Facebook account).
7
+ # Redirects to sign_in page if it's not authenticated
8
+ #
9
+ class FacebookConnectable < ::Warden::Strategies::Base
10
+
11
+ include ::Devise::Strategies::Base
12
+
13
+ # Without a Facebook session authentication cannot proceed.
14
+ #
15
+ def valid?
16
+ session[:facebook_session].present?
17
+ end
18
+
19
+ # Authenticate user with Facebook Connect.
20
+ #
21
+ def authenticate!
22
+ klass = mapping.to
23
+ begin
24
+ facebook_session = session[:facebook_session]
25
+ user = klass.facebook_connect(:uid => facebook_session.user.uid)
26
+
27
+ if user.present?
28
+ success!(user)
29
+ else
30
+ if klass.facebook_skip_create?
31
+ fail!(:facebook_invalid)
32
+ else
33
+ user = returning(klass.new) do |u|
34
+ u.store_facebook_credentials!(
35
+ :session_key => facebook_session.session_key,
36
+ :uid => facebook_session.user.uid,
37
+ :email => facebook_session.user.proxied_email
38
+ )
39
+ u.before_connect(facebook_session)
40
+ end
41
+
42
+ begin
43
+ user.save_with_validation(false)
44
+ success!(user)
45
+ rescue
46
+ fail!(:facebook_invalid)
47
+ end
48
+ end
49
+ end
50
+ # Now handled in the controller.
51
+ # rescue ::Facebooker::Session::SessionExpired
52
+ # fail!(:facebook_session_expired)
53
+ end
54
+ end
55
+
56
+ end
57
+ end
58
+ end
59
+
60
+ Warden::Strategies.add(:facebook_connectable, Devise::Strategies::FacebookConnectable)
@@ -0,0 +1,125 @@
1
+ # encoding: utf-8
2
+
3
+ module Devise
4
+ module FacebookConnectable
5
+ module Helpers
6
+
7
+ # References:
8
+ #
9
+ # * http://facebooker.rubyforge.org/
10
+ # * http://wiki.developers.facebook.com/index.php/Connect/Authorization_Websites
11
+ # * http://developers.facebook.com/docs/?u=facebook.jslib.FB.Connect
12
+ #
13
+
14
+ # Known issues:
15
+ #
16
+ # * autologoutlink - There's no onlogout callback - only onlogin, so it's not straightforward
17
+ # to trigger submit on the logout form to destroy the Warden session.
18
+ # Best solution now is either to hook the even manually on click,
19
+ # or use regular link like propsed here:
20
+ #
21
+ # http://forum.developers.facebook.com/viewtopic.php?pid=121283
22
+ #
23
+
24
+ # Make the Facebook Connect strings localized with current locale
25
+ # by default. Just for convenience.
26
+ #
27
+ def localized_fb_connect_javascript_tag(options = {})
28
+ fb_connect_javascript_tag(options.reverse_merge(:lang => ::I18n.locale))
29
+ end
30
+
31
+ # Convenient connect/login/logout method. See below.
32
+ #
33
+ def facebook_link(options = {})
34
+ unless signed_in?(options[:for])
35
+ facebook_login_or_connect_link(options)
36
+ else
37
+ facebook_logout_link(options)
38
+ end
39
+ end
40
+
41
+ # Agnostic Facebook Connect login/connect button/link.
42
+ #
43
+ # Case 1: If Facebook account already connected to the app/site, this is same as
44
+ # a traditional "account login" but with the Facebook dialog unless already
45
+ # logged in to Facebook.
46
+ #
47
+ # Case 2: If account is not connected to the app/site already;
48
+ # then this is the same as a traditional "create account".
49
+ #
50
+ def facebook_login_or_connect_link(options = {})
51
+ resource = options.delete(:for)
52
+ options.reverse_merge!(
53
+ :label => ::I18n.t(:facebook_login, :scope => [:devise, :sessions]),
54
+ :size => :large,
55
+ :length => :long,
56
+ :background => :white,
57
+ :button => true,
58
+ :autologoutlink => false
59
+ )
60
+
61
+ # It seems Devise using :get method for session destroy. Not really RESTful?
62
+ # options.merge!(:method => :delete) if options[:autologoutlink] && signed_in?(options[:for])
63
+
64
+ content_tag(:div, :class => 'fb_connect_login_link') do
65
+ facebook_connect_form(resource, options.slice(:method)) <<
66
+ if options[:button]
67
+ fb_login_button('devise.facebook_connectable.login();', options)
68
+ else
69
+ fb_logout_link(options[:label], 'devise.facebook_connectable.custom_login();')
70
+ end
71
+ end
72
+ end
73
+ alias :facebook_login_link :facebook_login_or_connect_link
74
+ alias :facebook_connect_link :facebook_login_or_connect_link
75
+
76
+ # Agnostic Facebook Connect logout button/link. Logs out the current
77
+ # user from both the app/site and Facebook main site (for security reasons).
78
+ #
79
+ def facebook_logout_link(options = {})
80
+ options.reverse_merge!(
81
+ :label => ::I18n.t(:facebook_logout, :scope => [:devise, :sessions]),
82
+ :size => :large,
83
+ :length => :long,
84
+ :background => :white,
85
+ :button => false
86
+ )
87
+
88
+ content_tag(:div, :class => 'fb_connect_logout_link') do
89
+ facebook_connect_form(options.delete(:for), :logout => true, :method => :get) <<
90
+ if options[:button]
91
+ fb_login_button('devise.facebook_connectable.logout();', options.merge(:autologoutlink => true))
92
+ else
93
+ fb_logout_link(options[:label], destroy_session_path(:user))
94
+ end
95
+ end
96
+ end
97
+
98
+ # TODO: Agnostic Facebook Connect disconnect button/link.
99
+ # Disconnects, i.e. deletes, user account. Identical as "Delete my account",
100
+ # but for Facebook Connect (which "un-installs" the app/site for the current user).
101
+ #
102
+ def facebook_disconnect_link(options = {})
103
+ raise "facebook_disconnect_link: Not implemented yet."
104
+ end
105
+
106
+ protected
107
+
108
+ # Generate agnostic hidden login/logout form for Facebook Connect.
109
+ #
110
+ def facebook_connect_form(for_resource, options = {})
111
+ logout_form = options.delete(:logout) || (options[:method] == :delete)
112
+ options.reverse_merge!(
113
+ :id => (logout_form ? 'fb_connect_logout_form' : 'fb_connect_login_form'),
114
+ :style => 'display:none;'
115
+ )
116
+ resource = ::Devise::Mapping.find_by_path(request.path).to rescue for_resource
117
+ url = logout_form ? destroy_session_path(resource) : session_path(resource)
118
+ form_for(resource, :url => url, :html => options) { |f| }
119
+ end
120
+
121
+ end
122
+ end
123
+ end
124
+
125
+ ::ActionView::Base.send :include, ::Devise::FacebookConnectable::Helpers
@@ -0,0 +1,46 @@
1
+ # encoding: utf-8
2
+ begin
3
+ require 'devise'
4
+ rescue
5
+ gem 'devise'
6
+ require 'devise'
7
+ end
8
+
9
+ begin
10
+ require 'facebooker'
11
+ rescue
12
+ gem 'facebooker'
13
+ require 'facebooker'
14
+ end
15
+
16
+ require 'devise_facebook_connectable/model'
17
+ require 'devise_facebook_connectable/serializer'
18
+ require 'devise_facebook_connectable/strategy'
19
+ require 'devise_facebook_connectable/schema'
20
+ require 'devise_facebook_connectable/controller_filters'
21
+ require 'devise_facebook_connectable/routes'
22
+ require 'devise_facebook_connectable/view_helpers'
23
+
24
+ module Devise
25
+ module FacebookConnectable
26
+
27
+ extend self
28
+
29
+ mattr_accessor :verbose
30
+
31
+ # Logging helper: Internal debug-logging for the plugin.
32
+ #
33
+ def log(message, level = :info)
34
+ return unless @@verbose
35
+ level = :info if level.blank?
36
+ @@logger ||= ::Logger.new(::STDOUT)
37
+ @@logger.send(level.to_sym, "[devise/facebook_connectable:] #{level.to_s.upcase} #{message}")
38
+ end
39
+
40
+ end
41
+ end
42
+
43
+ # Ugly hack, but needed now.
44
+ #
45
+ Devise::STRATEGIES.unshift :facebook_connectable
46
+ Devise::SERIALIZERS.unshift :facebook_connectable
metadata ADDED
@@ -0,0 +1,102 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: devise_facebook_connectable
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Jonas Grimfelt
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-12-08 00:00:00 +01:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: activesupport
17
+ type: :runtime
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: 2.3.0
24
+ version:
25
+ - !ruby/object:Gem::Dependency
26
+ name: devise
27
+ type: :runtime
28
+ version_requirement:
29
+ version_requirements: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 0.7.0
34
+ version:
35
+ - !ruby/object:Gem::Dependency
36
+ name: facebooker
37
+ type: :runtime
38
+ version_requirement:
39
+ version_requirements: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ version: 1.0.55
44
+ version:
45
+ description: Devise << Facebook Connect.
46
+ email: grimen@gmail.com
47
+ executables: []
48
+
49
+ extensions: []
50
+
51
+ extra_rdoc_files:
52
+ - Rakefile
53
+ - lib/devise_facebook_connectable.rb
54
+ - lib/devise_facebook_connectable/controller_filters.rb
55
+ - lib/devise_facebook_connectable/locales/en.yml
56
+ - lib/devise_facebook_connectable/model.rb
57
+ - lib/devise_facebook_connectable/routes.rb
58
+ - lib/devise_facebook_connectable/schema.rb
59
+ - lib/devise_facebook_connectable/serializer.rb
60
+ - lib/devise_facebook_connectable/strategy.rb
61
+ - lib/devise_facebook_connectable/view_helpers.rb
62
+ files:
63
+ - Rakefile
64
+ - lib/devise_facebook_connectable.rb
65
+ - lib/devise_facebook_connectable/controller_filters.rb
66
+ - lib/devise_facebook_connectable/locales/en.yml
67
+ - lib/devise_facebook_connectable/model.rb
68
+ - lib/devise_facebook_connectable/routes.rb
69
+ - lib/devise_facebook_connectable/schema.rb
70
+ - lib/devise_facebook_connectable/serializer.rb
71
+ - lib/devise_facebook_connectable/strategy.rb
72
+ - lib/devise_facebook_connectable/view_helpers.rb
73
+ has_rdoc: true
74
+ homepage: http://github.com/grimen/devise_facebook_connectable
75
+ licenses: []
76
+
77
+ post_install_message:
78
+ rdoc_options:
79
+ - --charset=UTF-8
80
+ require_paths:
81
+ - lib
82
+ required_ruby_version: !ruby/object:Gem::Requirement
83
+ requirements:
84
+ - - ">="
85
+ - !ruby/object:Gem::Version
86
+ version: "0"
87
+ version:
88
+ required_rubygems_version: !ruby/object:Gem::Requirement
89
+ requirements:
90
+ - - ">="
91
+ - !ruby/object:Gem::Version
92
+ version: "0"
93
+ version:
94
+ requirements: []
95
+
96
+ rubyforge_project:
97
+ rubygems_version: 1.3.5
98
+ signing_key:
99
+ specification_version: 3
100
+ summary: Devise << Facebook Connect.
101
+ test_files: []
102
+