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 +46 -0
- data/lib/devise_facebook_connectable/controller_filters.rb +30 -0
- data/lib/devise_facebook_connectable/locales/en.yml +7 -0
- data/lib/devise_facebook_connectable/model.rb +208 -0
- data/lib/devise_facebook_connectable/routes.rb +9 -0
- data/lib/devise_facebook_connectable/schema.rb +21 -0
- data/lib/devise_facebook_connectable/serializer.rb +3 -0
- data/lib/devise_facebook_connectable/strategy.rb +60 -0
- data/lib/devise_facebook_connectable/view_helpers.rb +125 -0
- data/lib/devise_facebook_connectable.rb +46 -0
- metadata +102 -0
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,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,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,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
|
+
|