devise_facebook_connectable 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
+
|