devise_oauth2_facebook 0.1.42
Sign up to get free protection for your applications and to get access to all the features.
- data/README +36 -0
- data/app/controllers/devise/facebook_consumer_controller.rb +49 -0
- data/config/locales/en.yml +4 -0
- data/lib/devise_oauth2_facebook/engine.rb +7 -0
- data/lib/devise_oauth2_facebook/facebook_consumer_helper.rb +11 -0
- data/lib/devise_oauth2_facebook/model.rb +46 -0
- data/lib/devise_oauth2_facebook/routes.rb +11 -0
- data/lib/devise_oauth2_facebook.rb +32 -0
- metadata +101 -0
data/README
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
Only Rails 3 is supported.
|
2
|
+
|
3
|
+
Uses fbgraph (http://github.com/nsanta/fbgraph)
|
4
|
+
Could use the Oauth2 gem directly, but it is more than likely that you
|
5
|
+
would want to use other features of facebook (ie post feed updates).
|
6
|
+
|
7
|
+
|
8
|
+
How to use
|
9
|
+
----------
|
10
|
+
Setup devise (http://github.com/plataformatec/devise), use Rails 3
|
11
|
+
|
12
|
+
Include the gem in Gemfile after devise:
|
13
|
+
gem 'devise'
|
14
|
+
gem 'devise_oauth2_facebook'
|
15
|
+
|
16
|
+
Include the ':devise_oauth2_facebook' in your model:
|
17
|
+
|
18
|
+
devise :database_authenticatable, :registerable, :confirmable,
|
19
|
+
:recoverable, :rememberable, :trackable, :validatable, :devise_oauth2_facebook
|
20
|
+
|
21
|
+
|
22
|
+
Add the following config options:
|
23
|
+
|
24
|
+
$ config/initializers/devise.rb
|
25
|
+
|
26
|
+
config.facebook_api_key = "KEY"
|
27
|
+
config.facebook_api_secret = "SECRET"
|
28
|
+
config.facebook_permissions = 'offline_access,email,publish_stream'
|
29
|
+
|
30
|
+
Good minimum to have is "offline_access,email"
|
31
|
+
|
32
|
+
Create a migration file to add the columns:
|
33
|
+
|
34
|
+
add_column :users, :facebook_uid, :string
|
35
|
+
add_column :users, :facebook_token, :string
|
36
|
+
|
@@ -0,0 +1,49 @@
|
|
1
|
+
class Devise::FacebookConsumerController < ApplicationController
|
2
|
+
include Devise::Controllers::InternalHelpers
|
3
|
+
include DeviseOauth2Facebook::FacebookConsumerHelper
|
4
|
+
|
5
|
+
def auth
|
6
|
+
url = send("fb_#{resource_name}_callback_url".to_sym)
|
7
|
+
redirect_to facebook_client.authorization.authorize_url(:redirect_uri => url , :scope => Devise.facebook_permissions)
|
8
|
+
end
|
9
|
+
|
10
|
+
def callback
|
11
|
+
# if resource_class.respond_to?(:serialize_into_cookie)
|
12
|
+
# User.first.remember_me!
|
13
|
+
# cookies.signed["remember_#{resource_name}_token"] = {
|
14
|
+
# :value => User.first.class.serialize_into_cookie(User.first),
|
15
|
+
# :expires => User.first.remember_expires_at,
|
16
|
+
# :path => "/"
|
17
|
+
# }
|
18
|
+
# end
|
19
|
+
# sign_in_and_redirect(resource_name, User.first)
|
20
|
+
# set_flash_message :notice, :signed_in
|
21
|
+
# return
|
22
|
+
url = send("fb_#{resource_name}_callback_url".to_sym)
|
23
|
+
|
24
|
+
client = facebook_client
|
25
|
+
client.authorization.process_callback(params[:code], :redirect_uri => url)
|
26
|
+
|
27
|
+
token = client.access_token
|
28
|
+
fb_user = client.selection.me.info!
|
29
|
+
|
30
|
+
# Rails.logger.info "FB USER:"
|
31
|
+
# Rails.logger.info fb_user.inspect
|
32
|
+
|
33
|
+
resource = resource_class.find_with_facebook_user(fb_user, token)
|
34
|
+
unless resource
|
35
|
+
resource = resource_class.create_with_facebook_user(fb_user, token)
|
36
|
+
end
|
37
|
+
if resource_class.respond_to?(:serialize_into_cookie)
|
38
|
+
resource.remember_me!
|
39
|
+
cookies.signed["remember_#{resource_name}_token"] = {
|
40
|
+
:value => resource.class.serialize_into_cookie(resource),
|
41
|
+
:expires => resource.remember_expires_at,
|
42
|
+
:path => "/"
|
43
|
+
}
|
44
|
+
end
|
45
|
+
set_flash_message :notice, :signed_in
|
46
|
+
sign_in_and_redirect(resource_name, resource)
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
module DeviseOauth2Facebook::FacebookConsumerHelper
|
2
|
+
|
3
|
+
def facebook_client(token = nil)
|
4
|
+
if token.present?
|
5
|
+
FBGraph::Client.new(:client_id => Devise.facebook_api_key, :secret_id => Devise.facebook_api_secret)
|
6
|
+
else
|
7
|
+
FBGraph::Client.new(:client_id => Devise.facebook_api_key, :secret_id => Devise.facebook_api_secret, :token => token)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module Devise
|
2
|
+
module Models
|
3
|
+
|
4
|
+
module DeviseOauth2Facebook
|
5
|
+
extend ActiveSupport::Concern
|
6
|
+
|
7
|
+
def do_update_facebook_user(fb_user, token)
|
8
|
+
self.send("#{self.class.facebook_uid_field}=".to_sym, fb_user.id)
|
9
|
+
self.send("#{self.class.facebook_token_field}=".to_sym, token)
|
10
|
+
self.email = fb_user.email.to_s.downcase if fb_user.respond_to?(:email)
|
11
|
+
update_facebook_user(fb_user)
|
12
|
+
self.save_without_validation
|
13
|
+
end
|
14
|
+
|
15
|
+
def update_facebook_user(fb_user)
|
16
|
+
# override me
|
17
|
+
end
|
18
|
+
|
19
|
+
def active?
|
20
|
+
true
|
21
|
+
end
|
22
|
+
|
23
|
+
protected
|
24
|
+
|
25
|
+
module ClassMethods
|
26
|
+
Devise::Models.config(self, :facebook_uid_field, :facebook_token_field)
|
27
|
+
|
28
|
+
def find_with_facebook_user(fb_user, token)
|
29
|
+
user = where(facebook_uid_field.to_sym => fb_user.id).first || where(:email => fb_user.email.downcase).first
|
30
|
+
if user
|
31
|
+
user.do_update_facebook_user(fb_user, token)
|
32
|
+
end
|
33
|
+
user
|
34
|
+
end
|
35
|
+
|
36
|
+
def create_with_facebook_user(fb_user, token)
|
37
|
+
user = new(facebook_uid_field.to_sym => fb_user.id, :password => "fakepass", :password_confirmation => "fakepass")
|
38
|
+
user.skip_confirmation! if user.respond_to?(:skip_confirmation!)
|
39
|
+
user.do_update_facebook_user(fb_user, token)
|
40
|
+
user
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
ActionDispatch::Routing::Mapper.class_eval do
|
2
|
+
|
3
|
+
protected
|
4
|
+
|
5
|
+
def devise_facebook_consumer(mapping, controllers)
|
6
|
+
scope mapping.full_path do
|
7
|
+
get mapping.path_names[:fb_auth], :to => "#{controllers[:facebook_consumer]}#auth", :as => :"fb_#{mapping.name}_auth"
|
8
|
+
get mapping.path_names[:fb_callback], :to => "#{controllers[:facebook_consumer]}#callback", :as => :"fb_#{mapping.name}_callback"
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'devise'
|
2
|
+
require 'fbgraph'
|
3
|
+
|
4
|
+
require 'devise_oauth2_facebook/engine'
|
5
|
+
|
6
|
+
module Devise
|
7
|
+
mattr_accessor :facebook_uid_field
|
8
|
+
@@facebook_uid_field = :facebook_uid
|
9
|
+
|
10
|
+
mattr_accessor :facebook_token_field
|
11
|
+
@@facebook_token_field = :facebook_token
|
12
|
+
|
13
|
+
mattr_accessor :facebook_api_key
|
14
|
+
@@facebook_api_key = nil
|
15
|
+
|
16
|
+
mattr_accessor :facebook_api_secret
|
17
|
+
@@facebook_api_secret = nil
|
18
|
+
|
19
|
+
mattr_accessor :facebook_permissions
|
20
|
+
@@facebook_permissions = 'offline_access,email'
|
21
|
+
|
22
|
+
mattr_accessor :facebook_callback_url
|
23
|
+
@@facebook_callback_url = nil
|
24
|
+
|
25
|
+
end
|
26
|
+
|
27
|
+
Devise.add_module(:devise_oauth2_facebook,
|
28
|
+
:strategy => false,
|
29
|
+
:controller => :facebook_consumer,
|
30
|
+
:route => :facebook_consumer,
|
31
|
+
:model => 'devise_oauth2_facebook/model'
|
32
|
+
)
|
metadata
ADDED
@@ -0,0 +1,101 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: devise_oauth2_facebook
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 79
|
5
|
+
prerelease: false
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 1
|
9
|
+
- 42
|
10
|
+
version: 0.1.42
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- Mooktakim Ahmed
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2010-06-11 00:00:00 +01:00
|
19
|
+
default_executable:
|
20
|
+
dependencies:
|
21
|
+
- !ruby/object:Gem::Dependency
|
22
|
+
name: devise
|
23
|
+
prerelease: false
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ">="
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
hash: 3
|
30
|
+
segments:
|
31
|
+
- 0
|
32
|
+
version: "0"
|
33
|
+
type: :runtime
|
34
|
+
version_requirements: *id001
|
35
|
+
- !ruby/object:Gem::Dependency
|
36
|
+
name: fbgraph
|
37
|
+
prerelease: false
|
38
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ">="
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
hash: 3
|
44
|
+
segments:
|
45
|
+
- 0
|
46
|
+
version: "0"
|
47
|
+
type: :runtime
|
48
|
+
version_requirements: *id002
|
49
|
+
description:
|
50
|
+
email: mooktakim@fluxter.co.uk
|
51
|
+
executables: []
|
52
|
+
|
53
|
+
extensions: []
|
54
|
+
|
55
|
+
extra_rdoc_files:
|
56
|
+
- README
|
57
|
+
files:
|
58
|
+
- README
|
59
|
+
- app/controllers/devise/facebook_consumer_controller.rb
|
60
|
+
- config/locales/en.yml
|
61
|
+
- lib/devise_oauth2_facebook.rb
|
62
|
+
- lib/devise_oauth2_facebook/engine.rb
|
63
|
+
- lib/devise_oauth2_facebook/facebook_consumer_helper.rb
|
64
|
+
- lib/devise_oauth2_facebook/model.rb
|
65
|
+
- lib/devise_oauth2_facebook/routes.rb
|
66
|
+
has_rdoc: true
|
67
|
+
homepage: http://github.com/mooktakim/devise_oauth2_facebook
|
68
|
+
licenses: []
|
69
|
+
|
70
|
+
post_install_message:
|
71
|
+
rdoc_options:
|
72
|
+
- --charset=UTF-8
|
73
|
+
require_paths:
|
74
|
+
- lib
|
75
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
76
|
+
none: false
|
77
|
+
requirements:
|
78
|
+
- - ">="
|
79
|
+
- !ruby/object:Gem::Version
|
80
|
+
hash: 3
|
81
|
+
segments:
|
82
|
+
- 0
|
83
|
+
version: "0"
|
84
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
85
|
+
none: false
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
hash: 3
|
90
|
+
segments:
|
91
|
+
- 0
|
92
|
+
version: "0"
|
93
|
+
requirements: []
|
94
|
+
|
95
|
+
rubyforge_project:
|
96
|
+
rubygems_version: 1.3.7
|
97
|
+
signing_key:
|
98
|
+
specification_version: 3
|
99
|
+
summary: Devise OAuth2 Facebook extension
|
100
|
+
test_files: []
|
101
|
+
|