devise_facebook_open_graph 0.0.2
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/.document +5 -0
- data/.gitignore +22 -0
- data/Gemfile +12 -0
- data/Gemfile.lock +112 -0
- data/LICENSE +20 -0
- data/README.rdoc +183 -0
- data/Rakefile +30 -0
- data/VERSION +1 -0
- data/devise_facebook_open_graph.gemspec +85 -0
- data/init.rb +2 -0
- data/lib/devise_facebook_open_graph.rb +59 -0
- data/lib/devise_facebook_open_graph/facebook/config.rb +49 -0
- data/lib/devise_facebook_open_graph/facebook/session.rb +59 -0
- data/lib/devise_facebook_open_graph/model.rb +54 -0
- data/lib/devise_facebook_open_graph/rails.rb +2 -0
- data/lib/devise_facebook_open_graph/rails/controller_helpers.rb +17 -0
- data/lib/devise_facebook_open_graph/rails/view_helpers.rb +29 -0
- data/lib/devise_facebook_open_graph/schema.rb +13 -0
- data/lib/devise_facebook_open_graph/strategy.rb +64 -0
- data/spec/spec.opts +1 -0
- data/spec/spec_helper.rb +9 -0
- metadata +204 -0
data/.document
ADDED
data/.gitignore
ADDED
data/Gemfile
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
gem 'rails', '>= 3.0.0.beta3'
|
2
|
+
gem 'devise', '>= 1.1.rc1'
|
3
|
+
gem 'koala'
|
4
|
+
gem 'json' # Koala needs this, but it has no gem spec which dictates this on it's own as it seems
|
5
|
+
|
6
|
+
|
7
|
+
group :development do
|
8
|
+
gem 'bundler'
|
9
|
+
gem 'rake'
|
10
|
+
gem 'jeweler'
|
11
|
+
gem 'rspec'
|
12
|
+
end
|
data/Gemfile.lock
ADDED
@@ -0,0 +1,112 @@
|
|
1
|
+
---
|
2
|
+
dependencies:
|
3
|
+
rails:
|
4
|
+
group:
|
5
|
+
- :default
|
6
|
+
version: ">= 3.0.0.beta3"
|
7
|
+
rake:
|
8
|
+
group:
|
9
|
+
- :development
|
10
|
+
version: ">= 0"
|
11
|
+
rspec:
|
12
|
+
group:
|
13
|
+
- :development
|
14
|
+
version: ">= 0"
|
15
|
+
json:
|
16
|
+
group:
|
17
|
+
- :default
|
18
|
+
version: ">= 0"
|
19
|
+
devise:
|
20
|
+
group:
|
21
|
+
- :default
|
22
|
+
version: ">= 1.1.rc1"
|
23
|
+
bundler:
|
24
|
+
group:
|
25
|
+
- :development
|
26
|
+
version: ">= 0"
|
27
|
+
jeweler:
|
28
|
+
group:
|
29
|
+
- :development
|
30
|
+
version: ">= 0"
|
31
|
+
koala:
|
32
|
+
group:
|
33
|
+
- :default
|
34
|
+
version: ">= 0"
|
35
|
+
specs:
|
36
|
+
- rake:
|
37
|
+
version: 0.8.7
|
38
|
+
- abstract:
|
39
|
+
version: 1.0.0
|
40
|
+
- builder:
|
41
|
+
version: 2.1.2
|
42
|
+
- i18n:
|
43
|
+
version: 0.3.7
|
44
|
+
- memcache-client:
|
45
|
+
version: 1.8.3
|
46
|
+
- tzinfo:
|
47
|
+
version: 0.3.22
|
48
|
+
- activesupport:
|
49
|
+
version: 3.0.0.beta3
|
50
|
+
- activemodel:
|
51
|
+
version: 3.0.0.beta3
|
52
|
+
- erubis:
|
53
|
+
version: 2.6.5
|
54
|
+
- rack:
|
55
|
+
version: 1.1.0
|
56
|
+
- rack-mount:
|
57
|
+
version: 0.6.4
|
58
|
+
- rack-test:
|
59
|
+
version: 0.5.4
|
60
|
+
- actionpack:
|
61
|
+
version: 3.0.0.beta3
|
62
|
+
- mime-types:
|
63
|
+
version: "1.16"
|
64
|
+
- polyglot:
|
65
|
+
version: 0.3.1
|
66
|
+
- treetop:
|
67
|
+
version: 1.4.8
|
68
|
+
- mail:
|
69
|
+
version: 2.2.3
|
70
|
+
- text-hyphen:
|
71
|
+
version: 1.0.0
|
72
|
+
- text-format:
|
73
|
+
version: 1.0.0
|
74
|
+
- actionmailer:
|
75
|
+
version: 3.0.0.beta3
|
76
|
+
- arel:
|
77
|
+
version: 0.3.3
|
78
|
+
- activerecord:
|
79
|
+
version: 3.0.0.beta3
|
80
|
+
- activeresource:
|
81
|
+
version: 3.0.0.beta3
|
82
|
+
- bundler:
|
83
|
+
version: 0.9.26
|
84
|
+
- warden:
|
85
|
+
version: 0.10.7
|
86
|
+
- devise:
|
87
|
+
version: 1.1.rc1
|
88
|
+
- json_pure:
|
89
|
+
version: 1.4.3
|
90
|
+
- gemcutter:
|
91
|
+
version: 0.5.0
|
92
|
+
- git:
|
93
|
+
version: 1.2.5
|
94
|
+
- rubyforge:
|
95
|
+
version: 2.0.4
|
96
|
+
- jeweler:
|
97
|
+
version: 1.4.0
|
98
|
+
- json:
|
99
|
+
version: 1.4.3
|
100
|
+
- koala:
|
101
|
+
version: 0.7.2
|
102
|
+
- thor:
|
103
|
+
version: 0.13.6
|
104
|
+
- railties:
|
105
|
+
version: 3.0.0.beta3
|
106
|
+
- rails:
|
107
|
+
version: 3.0.0.beta3
|
108
|
+
- rspec:
|
109
|
+
version: 1.3.0
|
110
|
+
hash: 69ed2d8540d60c12b9b97af95a0db518ddfd013f
|
111
|
+
sources: []
|
112
|
+
|
data/LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2009 Thorbjørn Hermansen
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.rdoc
ADDED
@@ -0,0 +1,183 @@
|
|
1
|
+
= devise_facebook_open_graph
|
2
|
+
|
3
|
+
The goal of this gem is to give Devise the ability to authorize users based if they are connected to Facebook or not.
|
4
|
+
It relays on connection to Facebook set up via the Facebook JavaScript SDK. Maybe devise facebook js sdk connectable
|
5
|
+
should be a better name for this gem ;-)
|
6
|
+
|
7
|
+
== Warning
|
8
|
+
|
9
|
+
I guess I should start with a small warning: Right now, this gem is kinda a fast-written prototype for me. Don't expect anything to
|
10
|
+
work ;-) ..Even though committed code do work for me in my Rails 3 beta 3 application :-) I have managed to authenticate users which
|
11
|
+
sign in via Facebook's JavaScript SDK and I guess this code might be useful to others too. Sadly, I haven't written any specs while
|
12
|
+
writing this code. This is not 100% complete code either. For instance, creating users based on facebook connection is not finished,
|
13
|
+
although I guess it will be soon.
|
14
|
+
|
15
|
+
|
16
|
+
|
17
|
+
= How to get started
|
18
|
+
|
19
|
+
== Set up gem dependency in your Gemfile
|
20
|
+
|
21
|
+
gem 'devise_facebook_open_graph'
|
22
|
+
|
23
|
+
== Get facebook credentials, add ids and keys to a configuration file
|
24
|
+
|
25
|
+
If you haven't done so already, create a facebook application so you'll acquire an application id, secret and an API key.
|
26
|
+
You can register applications here: http://www.facebook.com/developers/.
|
27
|
+
|
28
|
+
DeviseFacebookOpenGraph provides a class for easy access to configuration values. These are by default read from
|
29
|
+
Rails.root/config/facebook.yml which should look something like this:
|
30
|
+
|
31
|
+
production: &production
|
32
|
+
application_id: ""
|
33
|
+
api_key: ""
|
34
|
+
application_secret: ""
|
35
|
+
|
36
|
+
development:
|
37
|
+
<<: *production
|
38
|
+
|
39
|
+
== Configure your model to use facebook_open_graph_authenticatable
|
40
|
+
class User < ActiveRecord::Base
|
41
|
+
devise :database_authenticatable, :facebook_open_graph_authenticatable # etc..
|
42
|
+
|
43
|
+
== Add facebook user id column to your users table
|
44
|
+
|
45
|
+
class CreateUsers < ActiveRecord::Migration
|
46
|
+
def self.up
|
47
|
+
create_table :users do |t|
|
48
|
+
# ...other definitions here..
|
49
|
+
|
50
|
+
t.facebook_open_graph_authenticatable
|
51
|
+
end
|
52
|
+
|
53
|
+
add_index :users, User.facebook_uid_field, :unique => true
|
54
|
+
end
|
55
|
+
|
56
|
+
|
57
|
+
def self.down
|
58
|
+
drop_table :users
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
|
63
|
+
== Add Facebook SDK initializer HTML and JavaScript
|
64
|
+
|
65
|
+
The next thing we'll be doing are adding Facebook's JavaScript SDK and initialize it. This should be added
|
66
|
+
at the bottom of the page, before </body>. Add it with the helper <tt>facebook_init_javascript_sdk</tt>. I guess
|
67
|
+
more options to this one will come later.
|
68
|
+
|
69
|
+
== Add Facebook login button to your page
|
70
|
+
|
71
|
+
This can be done in different ways. One way is to use the fbml tag <tt>fb:login-button</tt>. See
|
72
|
+
http://developers.facebook.com/docs/authentication/, single sign-on section for more information.
|
73
|
+
|
74
|
+
== Last step...
|
75
|
+
|
76
|
+
Once a user has clicked your login button a cookie will be set with name fbs_<your_application_id>. When this is
|
77
|
+
set and Warden tries the authentication strategy which this gem provides it will parse the cookie content, find
|
78
|
+
the user's facebook uid and look that up in your users' table. If found, the user is authenticated.
|
79
|
+
|
80
|
+
== How to sign out users?
|
81
|
+
|
82
|
+
Facebook connected users are signed out when they sign out of Facebook. You can log a user out by calling <tt>FB.logout()</tt>
|
83
|
+
from your JavaScript. Here are some lines of JavaScript (jQuery) which I use to sign in/out users. Hope it helps you out if you are stuck:
|
84
|
+
|
85
|
+
$("a#sign_out").click(function(e) {
|
86
|
+
var sign_out_link = $(this);
|
87
|
+
|
88
|
+
FB.getLoginStatus(function(response) {
|
89
|
+
if (response.session) { // User is connected to Facebook
|
90
|
+
e.preventDefault();
|
91
|
+
|
92
|
+
FB.logout(function() { // Signs the user out and redirect to the application's sign out url
|
93
|
+
window.location.href = sign_out_link.attr("href");
|
94
|
+
});
|
95
|
+
}
|
96
|
+
});
|
97
|
+
});
|
98
|
+
|
99
|
+
FB.Event.subscribe('auth.login', function(response) {
|
100
|
+
window.location.href = "/profile"; // Redirect to some url when the user gets connected to facebook
|
101
|
+
});
|
102
|
+
|
103
|
+
For more information take a look at http://developers.facebook.com/docs/reference/javascript/FB.getLoginStatus
|
104
|
+
Oh! ..and you might want to start here: http://developers.facebook.com/docs/reference/javascript/
|
105
|
+
|
106
|
+
|
107
|
+
== Callbacks
|
108
|
+
|
109
|
+
There are defined some callback methods for devise models which are set up to be facebook_open_graph_authenticatable.
|
110
|
+
When these methods are called the model should have access to the facebook session through self.
|
111
|
+
Just make a call to facebook_session on your model. With this session you have access to uid, open graph api on behalf of the user
|
112
|
+
etc. Take a look at DeviseFacebookOpenGraph::Facebook::Session and the Koala gem which we use for communicating with the open graph.
|
113
|
+
|
114
|
+
=== before/after/around create_by_facebook
|
115
|
+
|
116
|
+
This one is called when a new user is created based on facebook connection, but the facebook uid is now found in the database.
|
117
|
+
Note that this is only relevant if devise's configuration value facebook_auto_create_account is set to true. Oh, one more thing,
|
118
|
+
the user is as a default saved without running validations meaning that you should implement a before_create_by_facebook function and extract
|
119
|
+
what you can like email etc from the facebook_session. You can override this though via configuration key 'run_validations_when_creating_facebook_user'.
|
120
|
+
|
121
|
+
==== Simple example on how to extract user's data from Facebook
|
122
|
+
class User < ActiveRecord::Base
|
123
|
+
before_create_by_facebook :extract_user_data_from_facebook_session
|
124
|
+
|
125
|
+
def extract_user_data_from_facebook_session
|
126
|
+
# The following code returns hash with information about current user being created
|
127
|
+
# For more information, see Koala gem documentation http://wiki.github.com/arsduo/koala/graph-api
|
128
|
+
user_data_from_facebook = facebook_session.graph.get_object(:me)
|
129
|
+
# Assign attributes with fetched data..
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
=== before/after/around connecting_to_facebook
|
134
|
+
|
135
|
+
These are called when Devise authenticates the user via facebook connect. In effect the user will be connected to facebook
|
136
|
+
at this point; signing out of facebook means signing out of your application too and visa-versa. As you might expect from a
|
137
|
+
before filter; you can halt the connection to facebook in the before filter by making it return false.
|
138
|
+
|
139
|
+
== Configuration
|
140
|
+
|
141
|
+
There are some configuration options which you can add in config/initializers/devise.rb
|
142
|
+
|
143
|
+
# Overrides the default column name for where to store the user's facebook user id
|
144
|
+
#config.facebook_uid_field = "facebook_uid"
|
145
|
+
|
146
|
+
# Auto creates accounts for new users. Default is true
|
147
|
+
#config.facebook_auto_create_account = true
|
148
|
+
|
149
|
+
# Runs validation when auto creating users on facebook connect. Default is false
|
150
|
+
#config.run_validations_when_creating_facebook_user = false
|
151
|
+
|
152
|
+
# Skip confirmation loop on facebook connection users. Default is true
|
153
|
+
#config,skip_confimation_for_facebook_users = true
|
154
|
+
|
155
|
+
|
156
|
+
== Access facebook session through controllers and views
|
157
|
+
|
158
|
+
When a user is signed in via facebook connect you have access to the user's facebook session by calling <tt>facebook_session</tt>
|
159
|
+
inside a controller or view. With this session you have access to the user's open graph by calling <tt>facebook_session.graph</tt>.
|
160
|
+
See the simple example on how to extract user's data from Facebook above.
|
161
|
+
|
162
|
+
|
163
|
+
|
164
|
+
= TODO
|
165
|
+
* Add other controller helpers for easy access to users facebook session (more specifically access to user's session & open graph).
|
166
|
+
* Add support for non-JavaScript authentication (see http://developers.facebook.com/docs/authentication/ "Authenticating Users in a Web Application").
|
167
|
+
* I'm sure there are more things to do..
|
168
|
+
* ..For instance; I guess some testing should be nice :-]
|
169
|
+
|
170
|
+
|
171
|
+
== Note on Patches/Pull Requests
|
172
|
+
|
173
|
+
* Fork the project.
|
174
|
+
* Make your feature addition or bug fix.
|
175
|
+
* Add tests for it. This is important so I don't break it in a
|
176
|
+
future version unintentionally.
|
177
|
+
* Commit, do not mess with rakefile, version, or history.
|
178
|
+
(if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
|
179
|
+
* Send me a pull request. Bonus points for topic branches.
|
180
|
+
|
181
|
+
== Copyright
|
182
|
+
|
183
|
+
Copyright (c) 2010 Thorbjørn Hermansen. See LICENSE for details.
|
data/Rakefile
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rake'
|
3
|
+
require 'bundler'
|
4
|
+
|
5
|
+
Bundler.setup
|
6
|
+
|
7
|
+
begin
|
8
|
+
require 'jeweler'
|
9
|
+
Jeweler::Tasks.new do |gem|
|
10
|
+
gem.name = "devise_facebook_open_graph"
|
11
|
+
gem.summary = %Q{Extends Devise with an authentication strategy against Facebook}
|
12
|
+
gem.description = %Q{Extends Devise with an authentication strategy against Facebook's Open Graph and it's JavaScrip SDK}
|
13
|
+
gem.email = "thhermansen@gmail.com"
|
14
|
+
gem.homepage = "http://github.com/thhermansen/devise_facebook_open_graph"
|
15
|
+
gem.authors = ["Thorbjørn Hermansen"]
|
16
|
+
gem.add_bundler_dependencies
|
17
|
+
end
|
18
|
+
Jeweler::GemcutterTasks.new
|
19
|
+
end
|
20
|
+
|
21
|
+
|
22
|
+
require 'rake/rdoctask'
|
23
|
+
Rake::RDocTask.new do |rdoc|
|
24
|
+
version = File.exist?('VERSION') ? File.read('VERSION') : ""
|
25
|
+
|
26
|
+
rdoc.rdoc_dir = 'rdoc'
|
27
|
+
rdoc.title = "devise_facebook_open_graph #{version}"
|
28
|
+
rdoc.rdoc_files.include('README*')
|
29
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
30
|
+
end
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.0.2
|
@@ -0,0 +1,85 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = %q{devise_facebook_open_graph}
|
8
|
+
s.version = "0.0.2"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["Thorbj\303\270rn Hermansen"]
|
12
|
+
s.date = %q{2010-06-15}
|
13
|
+
s.description = %q{Extends Devise with an authentication strategy against Facebook's Open Graph and it's JavaScrip SDK}
|
14
|
+
s.email = %q{thhermansen@gmail.com}
|
15
|
+
s.extra_rdoc_files = [
|
16
|
+
"LICENSE",
|
17
|
+
"README.rdoc"
|
18
|
+
]
|
19
|
+
s.files = [
|
20
|
+
".document",
|
21
|
+
".gitignore",
|
22
|
+
"Gemfile",
|
23
|
+
"Gemfile.lock",
|
24
|
+
"LICENSE",
|
25
|
+
"README.rdoc",
|
26
|
+
"Rakefile",
|
27
|
+
"VERSION",
|
28
|
+
"devise_facebook_open_graph.gemspec",
|
29
|
+
"init.rb",
|
30
|
+
"lib/devise_facebook_open_graph.rb",
|
31
|
+
"lib/devise_facebook_open_graph/facebook/config.rb",
|
32
|
+
"lib/devise_facebook_open_graph/facebook/session.rb",
|
33
|
+
"lib/devise_facebook_open_graph/model.rb",
|
34
|
+
"lib/devise_facebook_open_graph/rails.rb",
|
35
|
+
"lib/devise_facebook_open_graph/rails/controller_helpers.rb",
|
36
|
+
"lib/devise_facebook_open_graph/rails/view_helpers.rb",
|
37
|
+
"lib/devise_facebook_open_graph/schema.rb",
|
38
|
+
"lib/devise_facebook_open_graph/strategy.rb",
|
39
|
+
"spec/spec.opts",
|
40
|
+
"spec/spec_helper.rb"
|
41
|
+
]
|
42
|
+
s.homepage = %q{http://github.com/thhermansen/devise_facebook_open_graph}
|
43
|
+
s.rdoc_options = ["--charset=UTF-8"]
|
44
|
+
s.require_paths = ["lib"]
|
45
|
+
s.rubygems_version = %q{1.3.7}
|
46
|
+
s.summary = %q{Extends Devise with an authentication strategy against Facebook}
|
47
|
+
s.test_files = [
|
48
|
+
"spec/spec_helper.rb"
|
49
|
+
]
|
50
|
+
|
51
|
+
if s.respond_to? :specification_version then
|
52
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
53
|
+
s.specification_version = 3
|
54
|
+
|
55
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
56
|
+
s.add_runtime_dependency(%q<rails>, [">= 3.0.0.beta3"])
|
57
|
+
s.add_development_dependency(%q<rake>, [">= 0"])
|
58
|
+
s.add_development_dependency(%q<rspec>, [">= 0"])
|
59
|
+
s.add_runtime_dependency(%q<devise>, [">= 1.1.rc1"])
|
60
|
+
s.add_runtime_dependency(%q<json>, [">= 0"])
|
61
|
+
s.add_development_dependency(%q<jeweler>, [">= 0"])
|
62
|
+
s.add_development_dependency(%q<bundler>, [">= 0"])
|
63
|
+
s.add_runtime_dependency(%q<koala>, [">= 0"])
|
64
|
+
else
|
65
|
+
s.add_dependency(%q<rails>, [">= 3.0.0.beta3"])
|
66
|
+
s.add_dependency(%q<rake>, [">= 0"])
|
67
|
+
s.add_dependency(%q<rspec>, [">= 0"])
|
68
|
+
s.add_dependency(%q<devise>, [">= 1.1.rc1"])
|
69
|
+
s.add_dependency(%q<json>, [">= 0"])
|
70
|
+
s.add_dependency(%q<jeweler>, [">= 0"])
|
71
|
+
s.add_dependency(%q<bundler>, [">= 0"])
|
72
|
+
s.add_dependency(%q<koala>, [">= 0"])
|
73
|
+
end
|
74
|
+
else
|
75
|
+
s.add_dependency(%q<rails>, [">= 3.0.0.beta3"])
|
76
|
+
s.add_dependency(%q<rake>, [">= 0"])
|
77
|
+
s.add_dependency(%q<rspec>, [">= 0"])
|
78
|
+
s.add_dependency(%q<devise>, [">= 1.1.rc1"])
|
79
|
+
s.add_dependency(%q<json>, [">= 0"])
|
80
|
+
s.add_dependency(%q<jeweler>, [">= 0"])
|
81
|
+
s.add_dependency(%q<bundler>, [">= 0"])
|
82
|
+
s.add_dependency(%q<koala>, [">= 0"])
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
data/init.rb
ADDED
@@ -0,0 +1,59 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'devise'
|
3
|
+
|
4
|
+
|
5
|
+
require 'devise_facebook_open_graph/rails'
|
6
|
+
|
7
|
+
module DeviseFacebookOpenGraph
|
8
|
+
module Facebook
|
9
|
+
extend ActiveSupport::Autoload
|
10
|
+
|
11
|
+
autoload :Config
|
12
|
+
autoload :Session
|
13
|
+
end
|
14
|
+
|
15
|
+
module Rails
|
16
|
+
extend ActiveSupport::Autoload
|
17
|
+
|
18
|
+
autoload :ViewHelpers
|
19
|
+
autoload :ControllerHelpers
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
|
24
|
+
|
25
|
+
require 'devise_facebook_open_graph/strategy'
|
26
|
+
require 'devise_facebook_open_graph/schema'
|
27
|
+
|
28
|
+
module Devise
|
29
|
+
#
|
30
|
+
# Specifies database column name to store the facebook user id.
|
31
|
+
#
|
32
|
+
mattr_accessor :facebook_uid_field
|
33
|
+
@@facebook_uid_field = :facebook_uid
|
34
|
+
|
35
|
+
#
|
36
|
+
# Instructs this gem to auto create an account for facebook
|
37
|
+
# users which have not visited before
|
38
|
+
#
|
39
|
+
mattr_accessor :facebook_auto_create_account
|
40
|
+
@@facebook_auto_create_account = true
|
41
|
+
|
42
|
+
#
|
43
|
+
# Runs validation when auto creating users on facebook connect
|
44
|
+
#
|
45
|
+
mattr_accessor :run_validations_when_creating_facebook_user
|
46
|
+
@@run_validations_when_creating_facebook_user = false
|
47
|
+
|
48
|
+
#
|
49
|
+
# Skip confirmation loop on facebook connection users
|
50
|
+
#
|
51
|
+
mattr_accessor :skip_confimation_for_facebook_users
|
52
|
+
@@skip_confimation_for_facebook_users = true
|
53
|
+
end
|
54
|
+
|
55
|
+
Devise.add_module(:facebook_open_graph_authenticatable,
|
56
|
+
:strategy => true,
|
57
|
+
:controller => :sessions,
|
58
|
+
:model => 'devise_facebook_open_graph/model'
|
59
|
+
)
|
@@ -0,0 +1,49 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require "yaml"
|
3
|
+
|
4
|
+
#
|
5
|
+
# Provides basic Facebook functionality. You can ask it for
|
6
|
+
# the current configuration strings like Facebook.api_key,
|
7
|
+
# Facebook.application_id and Facebook.application_secret.
|
8
|
+
#
|
9
|
+
module DeviseFacebookOpenGraph
|
10
|
+
module Facebook
|
11
|
+
module Config
|
12
|
+
class << self
|
13
|
+
|
14
|
+
#
|
15
|
+
# Overrides the default configuration file path which is
|
16
|
+
# read from when requesting application_id, api_key,
|
17
|
+
# application_secret etc.
|
18
|
+
#
|
19
|
+
#
|
20
|
+
#
|
21
|
+
attr_accessor :path
|
22
|
+
|
23
|
+
%w(application_id api_key application_secret).each do |config_key|
|
24
|
+
define_method config_key do
|
25
|
+
instance_variable_get('@'+config_key) or
|
26
|
+
instance_variable_set('@'+config_key, config[config_key].value)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def sdk_java_script_source
|
31
|
+
"http://connect.facebook.net/#{I18n.locale}/all.js"
|
32
|
+
end
|
33
|
+
|
34
|
+
def facebook_session_name
|
35
|
+
"fbs_#{application_id}"
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
39
|
+
def config_file_path
|
40
|
+
path || ::Rails.root.join('config', 'facebook.yml')
|
41
|
+
end
|
42
|
+
|
43
|
+
def config
|
44
|
+
@config ||= YAML.parse_file(config_file_path)[::Rails.env]
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'koala'
|
4
|
+
|
5
|
+
module DeviseFacebookOpenGraph
|
6
|
+
module Facebook
|
7
|
+
class Session
|
8
|
+
#
|
9
|
+
# Keys found in cookie content. We are supplying reader
|
10
|
+
# methods for these values which are read from cookie content
|
11
|
+
#
|
12
|
+
FACEBOOK_SESSION_KEYS = %w(session_key expires uid sig secret access_token)
|
13
|
+
|
14
|
+
#
|
15
|
+
# Creates a new Facebook session based cookies hash from a request
|
16
|
+
#
|
17
|
+
def initialize(cookies)
|
18
|
+
@cookies = cookies
|
19
|
+
end
|
20
|
+
|
21
|
+
#
|
22
|
+
# Returns facebook's cookie content
|
23
|
+
#
|
24
|
+
def cookie_content
|
25
|
+
@cookie_content ||= parse_cookie
|
26
|
+
end
|
27
|
+
|
28
|
+
#
|
29
|
+
# Gives access to query as user with an oauth access token fetched from the cookie content
|
30
|
+
#
|
31
|
+
def graph
|
32
|
+
Koala::Facebook::GraphAPI.new(access_token)
|
33
|
+
end
|
34
|
+
|
35
|
+
|
36
|
+
#
|
37
|
+
# Define reader methods for facebook session keys
|
38
|
+
#
|
39
|
+
FACEBOOK_SESSION_KEYS.each do |key|
|
40
|
+
define_method key do
|
41
|
+
cookie_content[key] if cookie_content
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
#
|
46
|
+
# Is this a valid session? True if we were able to parse facebook's cookie content
|
47
|
+
#
|
48
|
+
def valid?
|
49
|
+
!!cookie_content
|
50
|
+
end
|
51
|
+
|
52
|
+
private
|
53
|
+
def parse_cookie # :nodoc:
|
54
|
+
oauth = Koala::Facebook::OAuth.new(Config.application_id, Config.application_secret)
|
55
|
+
parsed = oauth.get_user_from_cookie(@cookies)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'devise'
|
3
|
+
|
4
|
+
module Devise
|
5
|
+
module Models
|
6
|
+
module FacebookOpenGraphAuthenticatable
|
7
|
+
extend ActiveSupport::Concern
|
8
|
+
|
9
|
+
included do
|
10
|
+
attr_accessor :facebook_session
|
11
|
+
define_model_callbacks :create_by_facebook
|
12
|
+
define_model_callbacks :connecting_to_facebook
|
13
|
+
end
|
14
|
+
|
15
|
+
module ClassMethods
|
16
|
+
Devise::Models.config(self,
|
17
|
+
:facebook_uid_field, :facebook_auto_create_account, :run_validations_when_creating_facebook_user,
|
18
|
+
:skip_confimation_for_facebook_users
|
19
|
+
)
|
20
|
+
|
21
|
+
def facebook_auto_create_account?
|
22
|
+
!!facebook_auto_create_account
|
23
|
+
end
|
24
|
+
|
25
|
+
def authenticate_facebook_user(facebook_uid)
|
26
|
+
send("find_by_" + facebook_uid_field.to_s, facebook_uid)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def set_facebook_credentials_from_session!
|
31
|
+
raise "Can't set facebook credentials from session without the session!" if facebook_session.blank?
|
32
|
+
send(self.class.facebook_uid_field.to_s+'=', facebook_session.uid)
|
33
|
+
make_facebook_model_valid!
|
34
|
+
end
|
35
|
+
|
36
|
+
def authenticated_via_facebook?
|
37
|
+
read_attribute(self.class.facebook_uid_field).present?
|
38
|
+
end
|
39
|
+
|
40
|
+
private
|
41
|
+
#
|
42
|
+
# In case of model having included other modules like
|
43
|
+
# database_authenticate and so on we need to "by pass" some validations etc.
|
44
|
+
#
|
45
|
+
def make_facebook_model_valid!
|
46
|
+
# These database fields are required if authenticable is used
|
47
|
+
write_attribute(:password_salt, '') if self.respond_to?(:password_salt)
|
48
|
+
write_attribute(:encrypted_password, '') if self.respond_to?(:encrypted_password)
|
49
|
+
|
50
|
+
skip_confirmation! if self.class.skip_confimation_for_facebook_users && respond_to?(:skip_confirmation!)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module DeviseFacebookOpenGraph
|
4
|
+
module Rails
|
5
|
+
module ControllerHelpers
|
6
|
+
extend ActiveSupport::Concern
|
7
|
+
|
8
|
+
included do
|
9
|
+
helper_method :facebook_session
|
10
|
+
end
|
11
|
+
|
12
|
+
def facebook_session
|
13
|
+
@facebook_session ||= DeviseFacebookOpenGraph::Facebook::Session.new(cookies)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module DeviseFacebookOpenGraph
|
4
|
+
module Rails
|
5
|
+
module ViewHelpers
|
6
|
+
#
|
7
|
+
# Inserts facebook HTML and javascript tag for initializing
|
8
|
+
# JavaScript SDK. See http://developers.facebook.com/docs/authentication/: Single Sign-on.
|
9
|
+
#
|
10
|
+
# Some options to this helper-method might be added in the future :-)
|
11
|
+
#
|
12
|
+
def facebook_init_javascript_sdk
|
13
|
+
buffer = content_tag :div, '', :id => 'fb-root'
|
14
|
+
buffer << javascript_include_tag(DeviseFacebookOpenGraph::Facebook::Config.sdk_java_script_source)
|
15
|
+
|
16
|
+
buffer << javascript_tag(<<-JAVASCRIPT)
|
17
|
+
FB.init({
|
18
|
+
appId: '#{DeviseFacebookOpenGraph::Facebook::Config.application_id}',
|
19
|
+
status: true,
|
20
|
+
cookie: true,
|
21
|
+
xfbml: true
|
22
|
+
});
|
23
|
+
JAVASCRIPT
|
24
|
+
|
25
|
+
buffer.html_safe
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module DeviseFacebookOpenGraph
|
4
|
+
module Schema
|
5
|
+
def facebook_open_graph_authenticatable
|
6
|
+
apply_schema ::Devise.facebook_uid_field, :integer, :limit => 8
|
7
|
+
end
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
Devise::Schema.module_eval do
|
12
|
+
include DeviseFacebookOpenGraph::Schema
|
13
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'devise/strategies/base'
|
4
|
+
|
5
|
+
module Devise
|
6
|
+
module FacebookOpenGraphAuthenticatable
|
7
|
+
module Strategies
|
8
|
+
class FacebookOpenGraphAuthenticatable < ::Devise::Strategies::Base
|
9
|
+
#
|
10
|
+
# This strategy is valid if Facebook has set it's session data object in
|
11
|
+
# current application's domain cookies.
|
12
|
+
#
|
13
|
+
def valid?
|
14
|
+
mapping.to.respond_to?(:authenticate_facebook_user) && cookies.has_key?(::DeviseFacebookOpenGraph::Facebook::Config.facebook_session_name)
|
15
|
+
end
|
16
|
+
|
17
|
+
#
|
18
|
+
# Authenticates the user as if this requests seems
|
19
|
+
# valid as FacebookOpenGraphAuthenticatable
|
20
|
+
#
|
21
|
+
# Tries to auto create the user if configured to do so.
|
22
|
+
#
|
23
|
+
def authenticate!
|
24
|
+
session = DeviseFacebookOpenGraph::Facebook::Session.new(cookies)
|
25
|
+
|
26
|
+
if session.valid?
|
27
|
+
klass = mapping.to
|
28
|
+
user = klass.authenticate_facebook_user session.uid
|
29
|
+
|
30
|
+
if user.blank? && klass.facebook_auto_create_account?
|
31
|
+
user = klass.new
|
32
|
+
user.facebook_session = session
|
33
|
+
user.set_facebook_credentials_from_session!
|
34
|
+
user.run_callbacks :create_by_facebook do
|
35
|
+
begin
|
36
|
+
user.save(:validate => klass.run_validations_when_creating_facebook_user)
|
37
|
+
rescue ActiveRecord::RecordNotUnique
|
38
|
+
fail!(:not_unique_user_on_creation) and return
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
if klass.run_validations_when_creating_facebook_user && !user.persisted?
|
43
|
+
fail!(:invalid_facebook_user_on_creation) and return
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
if user.present? && user.persisted?
|
48
|
+
user.facebook_session = session
|
49
|
+
user.run_callbacks :connecting_to_facebook do
|
50
|
+
success!(user) and return
|
51
|
+
end
|
52
|
+
else
|
53
|
+
fail!(:facebook_user_not_found_locally) and return
|
54
|
+
end
|
55
|
+
else
|
56
|
+
fail!(:invalid_facebook_session) and return
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
::Warden::Strategies.add(:facebook_open_graph_authenticatable, Devise::FacebookOpenGraphAuthenticatable::Strategies::FacebookOpenGraphAuthenticatable)
|
data/spec/spec.opts
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--color
|
data/spec/spec_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,204 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: devise_facebook_open_graph
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 27
|
5
|
+
prerelease: false
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 0
|
9
|
+
- 2
|
10
|
+
version: 0.0.2
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- "Thorbj\xC3\xB8rn Hermansen"
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2010-06-15 00:00:00 +02:00
|
19
|
+
default_executable:
|
20
|
+
dependencies:
|
21
|
+
- !ruby/object:Gem::Dependency
|
22
|
+
name: rails
|
23
|
+
prerelease: false
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ">="
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
hash: -1848230021
|
30
|
+
segments:
|
31
|
+
- 3
|
32
|
+
- 0
|
33
|
+
- 0
|
34
|
+
- beta3
|
35
|
+
version: 3.0.0.beta3
|
36
|
+
type: :runtime
|
37
|
+
version_requirements: *id001
|
38
|
+
- !ruby/object:Gem::Dependency
|
39
|
+
name: rake
|
40
|
+
prerelease: false
|
41
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
42
|
+
none: false
|
43
|
+
requirements:
|
44
|
+
- - ">="
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
hash: 3
|
47
|
+
segments:
|
48
|
+
- 0
|
49
|
+
version: "0"
|
50
|
+
type: :development
|
51
|
+
version_requirements: *id002
|
52
|
+
- !ruby/object:Gem::Dependency
|
53
|
+
name: rspec
|
54
|
+
prerelease: false
|
55
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
56
|
+
none: false
|
57
|
+
requirements:
|
58
|
+
- - ">="
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
hash: 3
|
61
|
+
segments:
|
62
|
+
- 0
|
63
|
+
version: "0"
|
64
|
+
type: :development
|
65
|
+
version_requirements: *id003
|
66
|
+
- !ruby/object:Gem::Dependency
|
67
|
+
name: devise
|
68
|
+
prerelease: false
|
69
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
70
|
+
none: false
|
71
|
+
requirements:
|
72
|
+
- - ">="
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
hash: 977940498
|
75
|
+
segments:
|
76
|
+
- 1
|
77
|
+
- 1
|
78
|
+
- rc1
|
79
|
+
version: 1.1.rc1
|
80
|
+
type: :runtime
|
81
|
+
version_requirements: *id004
|
82
|
+
- !ruby/object:Gem::Dependency
|
83
|
+
name: json
|
84
|
+
prerelease: false
|
85
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
86
|
+
none: false
|
87
|
+
requirements:
|
88
|
+
- - ">="
|
89
|
+
- !ruby/object:Gem::Version
|
90
|
+
hash: 3
|
91
|
+
segments:
|
92
|
+
- 0
|
93
|
+
version: "0"
|
94
|
+
type: :runtime
|
95
|
+
version_requirements: *id005
|
96
|
+
- !ruby/object:Gem::Dependency
|
97
|
+
name: jeweler
|
98
|
+
prerelease: false
|
99
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
100
|
+
none: false
|
101
|
+
requirements:
|
102
|
+
- - ">="
|
103
|
+
- !ruby/object:Gem::Version
|
104
|
+
hash: 3
|
105
|
+
segments:
|
106
|
+
- 0
|
107
|
+
version: "0"
|
108
|
+
type: :development
|
109
|
+
version_requirements: *id006
|
110
|
+
- !ruby/object:Gem::Dependency
|
111
|
+
name: bundler
|
112
|
+
prerelease: false
|
113
|
+
requirement: &id007 !ruby/object:Gem::Requirement
|
114
|
+
none: false
|
115
|
+
requirements:
|
116
|
+
- - ">="
|
117
|
+
- !ruby/object:Gem::Version
|
118
|
+
hash: 3
|
119
|
+
segments:
|
120
|
+
- 0
|
121
|
+
version: "0"
|
122
|
+
type: :development
|
123
|
+
version_requirements: *id007
|
124
|
+
- !ruby/object:Gem::Dependency
|
125
|
+
name: koala
|
126
|
+
prerelease: false
|
127
|
+
requirement: &id008 !ruby/object:Gem::Requirement
|
128
|
+
none: false
|
129
|
+
requirements:
|
130
|
+
- - ">="
|
131
|
+
- !ruby/object:Gem::Version
|
132
|
+
hash: 3
|
133
|
+
segments:
|
134
|
+
- 0
|
135
|
+
version: "0"
|
136
|
+
type: :runtime
|
137
|
+
version_requirements: *id008
|
138
|
+
description: Extends Devise with an authentication strategy against Facebook's Open Graph and it's JavaScrip SDK
|
139
|
+
email: thhermansen@gmail.com
|
140
|
+
executables: []
|
141
|
+
|
142
|
+
extensions: []
|
143
|
+
|
144
|
+
extra_rdoc_files:
|
145
|
+
- LICENSE
|
146
|
+
- README.rdoc
|
147
|
+
files:
|
148
|
+
- .document
|
149
|
+
- .gitignore
|
150
|
+
- Gemfile
|
151
|
+
- Gemfile.lock
|
152
|
+
- LICENSE
|
153
|
+
- README.rdoc
|
154
|
+
- Rakefile
|
155
|
+
- VERSION
|
156
|
+
- devise_facebook_open_graph.gemspec
|
157
|
+
- init.rb
|
158
|
+
- lib/devise_facebook_open_graph.rb
|
159
|
+
- lib/devise_facebook_open_graph/facebook/config.rb
|
160
|
+
- lib/devise_facebook_open_graph/facebook/session.rb
|
161
|
+
- lib/devise_facebook_open_graph/model.rb
|
162
|
+
- lib/devise_facebook_open_graph/rails.rb
|
163
|
+
- lib/devise_facebook_open_graph/rails/controller_helpers.rb
|
164
|
+
- lib/devise_facebook_open_graph/rails/view_helpers.rb
|
165
|
+
- lib/devise_facebook_open_graph/schema.rb
|
166
|
+
- lib/devise_facebook_open_graph/strategy.rb
|
167
|
+
- spec/spec.opts
|
168
|
+
- spec/spec_helper.rb
|
169
|
+
has_rdoc: true
|
170
|
+
homepage: http://github.com/thhermansen/devise_facebook_open_graph
|
171
|
+
licenses: []
|
172
|
+
|
173
|
+
post_install_message:
|
174
|
+
rdoc_options:
|
175
|
+
- --charset=UTF-8
|
176
|
+
require_paths:
|
177
|
+
- lib
|
178
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
179
|
+
none: false
|
180
|
+
requirements:
|
181
|
+
- - ">="
|
182
|
+
- !ruby/object:Gem::Version
|
183
|
+
hash: 3
|
184
|
+
segments:
|
185
|
+
- 0
|
186
|
+
version: "0"
|
187
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
188
|
+
none: false
|
189
|
+
requirements:
|
190
|
+
- - ">="
|
191
|
+
- !ruby/object:Gem::Version
|
192
|
+
hash: 3
|
193
|
+
segments:
|
194
|
+
- 0
|
195
|
+
version: "0"
|
196
|
+
requirements: []
|
197
|
+
|
198
|
+
rubyforge_project:
|
199
|
+
rubygems_version: 1.3.7
|
200
|
+
signing_key:
|
201
|
+
specification_version: 3
|
202
|
+
summary: Extends Devise with an authentication strategy against Facebook
|
203
|
+
test_files:
|
204
|
+
- spec/spec_helper.rb
|