devise_oauth2_facebook_mongoid 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/README +36 -0
- data/app/controllers/devise/facebook_consumer_controller.rb +32 -0
- data/config/locales/en.yml +4 -0
- data/lib/devise_oauth2_facebook.rb +32 -0
- data/lib/devise_oauth2_facebook/engine.rb +10 -0
- data/lib/devise_oauth2_facebook/facebook_consumer_helper.rb +11 -0
- data/lib/devise_oauth2_facebook/model.rb +48 -0
- data/lib/devise_oauth2_facebook/routes.rb +11 -0
- metadata +102 -0
data/README
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
Only Rails 3 and Mongoid is supported.
|
2
|
+
|
3
|
+
Uses fbgraph (http://github.com/nsanta/fbgraph) v= 1.5.4
|
4
|
+
|
5
|
+
|
6
|
+
How to use
|
7
|
+
----------
|
8
|
+
|
9
|
+
Include the gem in Gemfile after devise:
|
10
|
+
gem 'devise'
|
11
|
+
gem 'devise_oauth2_facebook'
|
12
|
+
gem 'fbgraph', "~> 1.5.4"
|
13
|
+
|
14
|
+
Include the ':devise_oauth2_facebook' in your model:
|
15
|
+
|
16
|
+
devise :database_authenticatable, :registerable, :confirmable,
|
17
|
+
:recoverable, :rememberable, :trackable, :validatable, :devise_oauth2_facebook
|
18
|
+
|
19
|
+
|
20
|
+
Add the following config options:
|
21
|
+
|
22
|
+
$ config/initializers/devise.rb
|
23
|
+
|
24
|
+
config.facebook_api_key = "KEY"
|
25
|
+
config.facebook_api_secret = "SECRET"
|
26
|
+
config.facebook_permissions = 'offline_access,email,publish_stream'
|
27
|
+
|
28
|
+
Good minimum to have is "offline_access,email"
|
29
|
+
|
30
|
+
Create a migration file to add the columns:
|
31
|
+
|
32
|
+
add_column :users, :facebook_uid, :string
|
33
|
+
add_column :users, :facebook_token, :string
|
34
|
+
|
35
|
+
Finally, update your view to include "Login with facebook" link:
|
36
|
+
<%= link_to "Login with facebook", user_fb_auth_path %>
|
@@ -0,0 +1,32 @@
|
|
1
|
+
class Devise::FacebookConsumerController < ApplicationController
|
2
|
+
include Devise::Controllers::InternalHelpers
|
3
|
+
include DeviseOauth2Facebook::FacebookConsumerHelper
|
4
|
+
|
5
|
+
def auth
|
6
|
+
url = send("#{resource_name}_fb_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
|
+
|
12
|
+
url = send("#{resource_name}_fb_callback_url".to_sym)
|
13
|
+
|
14
|
+
client = facebook_client
|
15
|
+
|
16
|
+
puts params[:code]
|
17
|
+
client.authorization.process_callback(params[:code], :redirect_uri => url)
|
18
|
+
|
19
|
+
token = client.access_token
|
20
|
+
fb_user = client.selection.me.info!
|
21
|
+
|
22
|
+
resource = resource_class.find_with_facebook_user(fb_user, token)
|
23
|
+
unless resource
|
24
|
+
resource = resource_class.create_with_facebook_user(fb_user, token)
|
25
|
+
end
|
26
|
+
puts resource.inspect
|
27
|
+
set_flash_message :notice, :signed_in
|
28
|
+
sign_in_and_redirect(:user, resource)
|
29
|
+
|
30
|
+
end
|
31
|
+
|
32
|
+
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
|
+
)
|
@@ -0,0 +1,10 @@
|
|
1
|
+
require "devise_oauth2_facebook/routes"
|
2
|
+
|
3
|
+
module DeviseOauth2Facebook
|
4
|
+
class Engine < ::Rails::Engine
|
5
|
+
config.devise_oauth2_facebook = DeviseOauth2Facebook
|
6
|
+
|
7
|
+
config.autoload_paths << File.expand_path(File.join(File.dirname(__FILE__), "..")) if config.respond_to? :autoload_paths
|
8
|
+
|
9
|
+
end
|
10
|
+
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, :token => token)
|
6
|
+
else
|
7
|
+
FBGraph::Client.new(:client_id => Devise.facebook_api_key, :secret_id => Devise.facebook_api_secret)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
end
|
@@ -0,0 +1,48 @@
|
|
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.email.present?
|
11
|
+
update_facebook_user(fb_user)
|
12
|
+
self.save(:validate => false)
|
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 = User.last(conditions: {email: fb_user.email.downcase})
|
30
|
+
if !user.nil?
|
31
|
+
user
|
32
|
+
else # Create a user with a stub password.
|
33
|
+
User.create!(:email => fb_user.email.downcase, :password => token)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
|
38
|
+
def create_with_facebook_user(fb_user, token)
|
39
|
+
user = new(facebook_uid_field.to_sym => fb_user["id"], :password => "fakepass", :password_confirmation => "fakepass")
|
40
|
+
user.skip_confirmation! if user.respond_to?(:skip_confirmation!)
|
41
|
+
user.do_update_facebook_user(fb_user, token)
|
42
|
+
user
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
47
|
+
end
|
48
|
+
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.fullpath do
|
7
|
+
get mapping.path_names[:fb_auth], :to => "#{controllers[:facebook_consumer]}#auth", :as => :fb_auth
|
8
|
+
get mapping.path_names[:fb_callback], :to => "#{controllers[:facebook_consumer]}#callback", :as => :fb_callback
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
metadata
ADDED
@@ -0,0 +1,102 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: devise_oauth2_facebook_mongoid
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 27
|
5
|
+
prerelease:
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 1
|
9
|
+
- 0
|
10
|
+
version: 0.1.0
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- Mooktakim Ahmed
|
14
|
+
- Hugo Rincon
|
15
|
+
autorequire:
|
16
|
+
bindir: bin
|
17
|
+
cert_chain: []
|
18
|
+
|
19
|
+
date: 2011-06-09 00:00:00 Z
|
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: 17
|
30
|
+
segments:
|
31
|
+
- 1
|
32
|
+
- 1
|
33
|
+
- 1
|
34
|
+
version: 1.1.1
|
35
|
+
type: :runtime
|
36
|
+
version_requirements: *id001
|
37
|
+
- !ruby/object:Gem::Dependency
|
38
|
+
name: fbgraph
|
39
|
+
prerelease: false
|
40
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ">="
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
hash: 3
|
46
|
+
segments:
|
47
|
+
- 0
|
48
|
+
version: "0"
|
49
|
+
type: :runtime
|
50
|
+
version_requirements: *id002
|
51
|
+
description:
|
52
|
+
email: hugo@bakedweb.net
|
53
|
+
executables: []
|
54
|
+
|
55
|
+
extensions: []
|
56
|
+
|
57
|
+
extra_rdoc_files:
|
58
|
+
- README
|
59
|
+
files:
|
60
|
+
- README
|
61
|
+
- app/controllers/devise/facebook_consumer_controller.rb
|
62
|
+
- config/locales/en.yml
|
63
|
+
- lib/devise_oauth2_facebook.rb
|
64
|
+
- lib/devise_oauth2_facebook/engine.rb
|
65
|
+
- lib/devise_oauth2_facebook/facebook_consumer_helper.rb
|
66
|
+
- lib/devise_oauth2_facebook/model.rb
|
67
|
+
- lib/devise_oauth2_facebook/routes.rb
|
68
|
+
homepage: https://github.com/hugoerg56/devise_oauth2_facebook_mongoid
|
69
|
+
licenses: []
|
70
|
+
|
71
|
+
post_install_message:
|
72
|
+
rdoc_options: []
|
73
|
+
|
74
|
+
require_paths:
|
75
|
+
- lib
|
76
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
77
|
+
none: false
|
78
|
+
requirements:
|
79
|
+
- - ">="
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
hash: 3
|
82
|
+
segments:
|
83
|
+
- 0
|
84
|
+
version: "0"
|
85
|
+
required_rubygems_version: !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
|
+
requirements: []
|
95
|
+
|
96
|
+
rubyforge_project:
|
97
|
+
rubygems_version: 1.7.2
|
98
|
+
signing_key:
|
99
|
+
specification_version: 3
|
100
|
+
summary: Devise OAuth2 Facebook extension for rails 3 and mongoid
|
101
|
+
test_files: []
|
102
|
+
|