devise_oauth2_fb_canvas 0.0.1
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 +52 -0
- data/app/controllers/devise/facebook_consumer_controller.rb +46 -0
- data/config/locales/en.yml +4 -0
- data/lib/devise_oauth2_fb_canvas.rb +40 -0
- data/lib/devise_oauth2_fb_canvas/engine.rb +10 -0
- data/lib/devise_oauth2_fb_canvas/facebook_consumer_helper.rb +10 -0
- data/lib/devise_oauth2_fb_canvas/model.rb +46 -0
- data/lib/devise_oauth2_fb_canvas/routes.rb +11 -0
- metadata +103 -0
data/README
ADDED
@@ -0,0 +1,52 @@
|
|
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, web applications
|
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_fb_canvas'
|
15
|
+
|
16
|
+
Include the ':devise_oauth2_fb_canvas' in your model:
|
17
|
+
|
18
|
+
devise :database_authenticatable, :registerable, :confirmable,
|
19
|
+
:recoverable, :rememberable, :trackable, :validatable, :devise_oauth2_fb_canvas
|
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
|
+
|
37
|
+
Finally, update your view to include "Login with facebook" link:
|
38
|
+
<%= link_to "Login with facebook", user_fb_auth_path %>
|
39
|
+
|
40
|
+
How to use, facebook canvas applications
|
41
|
+
|
42
|
+
------
|
43
|
+
|
44
|
+
As above, except with this configuration:
|
45
|
+
|
46
|
+
$ config/initializers/devise.rb
|
47
|
+
|
48
|
+
config.facebook_api_key = "KEY"
|
49
|
+
config.facebook_api_secret = "SECRET"
|
50
|
+
config.facebook_permissions = 'offline_access,email,publish_stream'
|
51
|
+
config.facebook_canvas_app = true
|
52
|
+
config.facebook_canvas_url = 'your_facebook_canvas_app_url'
|
@@ -0,0 +1,46 @@
|
|
1
|
+
class Devise::FacebookConsumerController < ApplicationController
|
2
|
+
include Devise::Controllers::InternalHelpers
|
3
|
+
include DeviseOauth2FbCanvas::FacebookConsumerHelper
|
4
|
+
|
5
|
+
def auth
|
6
|
+
url = send("#{resource_name}_fb_callback_url".to_sym)
|
7
|
+
uri = facebook_client.authorization.authorize_url(:redirect_uri => url , :scope => Devise.facebook_permissions)
|
8
|
+
if Devise.facebook_canvas_app
|
9
|
+
render :layout => false, :inline => "<script type='text/javascript' charset='utf-8'>top.location.href='#{uri}';</script>"
|
10
|
+
else
|
11
|
+
redirect_to uri
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def callback
|
16
|
+
url = send("#{resource_name}_fb_callback_url".to_sym)
|
17
|
+
|
18
|
+
client = facebook_client
|
19
|
+
client.authorization.process_callback(params[:code], :redirect_uri => url)
|
20
|
+
|
21
|
+
token = client.access_token
|
22
|
+
fb_user = client.selection.me.info!
|
23
|
+
|
24
|
+
resource = resource_class.find_with_facebook_user(fb_user, token)
|
25
|
+
unless resource
|
26
|
+
resource = resource_class.create_with_facebook_user(fb_user, token)
|
27
|
+
end
|
28
|
+
if resource_class.respond_to?(:serialize_into_cookie)
|
29
|
+
resource.remember_me!
|
30
|
+
cookies.signed["remember_#{resource_name}_token"] = {
|
31
|
+
:value => resource.class.serialize_into_cookie(resource),
|
32
|
+
:expires => resource.remember_expires_at,
|
33
|
+
:path => "/"
|
34
|
+
}
|
35
|
+
end
|
36
|
+
set_flash_message :notice, :signed_in
|
37
|
+
|
38
|
+
if Devise.facebook_canvas_app
|
39
|
+
sign_in(resource_name, resource)
|
40
|
+
redirect_to Devise.facebook_canvas_url
|
41
|
+
else
|
42
|
+
sign_in_and_redirect(resource_name, resource)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'devise'
|
2
|
+
require 'fbgraph'
|
3
|
+
|
4
|
+
require 'devise_oauth2_fb_canvas/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
|
+
mattr_accessor :facebook_canvas_app
|
26
|
+
@@facebook_canvas_app = false
|
27
|
+
|
28
|
+
mattr_accessor :facebook_canvas_url
|
29
|
+
@@facebook_canvas_url = nil
|
30
|
+
|
31
|
+
|
32
|
+
|
33
|
+
end
|
34
|
+
|
35
|
+
Devise.add_module(:devise_oauth2_fb_canvas,
|
36
|
+
:strategy => false,
|
37
|
+
:controller => :facebook_consumer,
|
38
|
+
:route => :facebook_consumer,
|
39
|
+
:model => 'devise_oauth2_fb_canvas/model'
|
40
|
+
)
|
@@ -0,0 +1,10 @@
|
|
1
|
+
require "devise_oauth2_fb_canvas/routes"
|
2
|
+
|
3
|
+
module DeviseOauth2FbCanvas
|
4
|
+
class Engine < ::Rails::Engine
|
5
|
+
config.devise_oauth2_fb_canvas = DeviseOauth2FbCanvas
|
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,10 @@
|
|
1
|
+
module DeviseOauth2FbCanvas::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
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module Devise
|
2
|
+
module Models
|
3
|
+
|
4
|
+
module DeviseOauth2FbCanvas
|
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 = 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.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,103 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: devise_oauth2_fb_canvas
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 29
|
5
|
+
prerelease: false
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 0
|
9
|
+
- 1
|
10
|
+
version: 0.0.1
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- Nina Jansen
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2010-09-02 00:00:00 +02: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: 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: info@ninajansen.dk
|
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_fb_canvas.rb
|
64
|
+
- lib/devise_oauth2_fb_canvas/engine.rb
|
65
|
+
- lib/devise_oauth2_fb_canvas/facebook_consumer_helper.rb
|
66
|
+
- lib/devise_oauth2_fb_canvas/model.rb
|
67
|
+
- lib/devise_oauth2_fb_canvas/routes.rb
|
68
|
+
has_rdoc: true
|
69
|
+
homepage: http://github.com/ninajansen/devise_oauth2_fb_canvas
|
70
|
+
licenses: []
|
71
|
+
|
72
|
+
post_install_message:
|
73
|
+
rdoc_options:
|
74
|
+
- --charset=UTF-8
|
75
|
+
require_paths:
|
76
|
+
- lib
|
77
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
78
|
+
none: false
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
hash: 3
|
83
|
+
segments:
|
84
|
+
- 0
|
85
|
+
version: "0"
|
86
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
87
|
+
none: false
|
88
|
+
requirements:
|
89
|
+
- - ">="
|
90
|
+
- !ruby/object:Gem::Version
|
91
|
+
hash: 3
|
92
|
+
segments:
|
93
|
+
- 0
|
94
|
+
version: "0"
|
95
|
+
requirements: []
|
96
|
+
|
97
|
+
rubyforge_project:
|
98
|
+
rubygems_version: 1.3.7
|
99
|
+
signing_key:
|
100
|
+
specification_version: 3
|
101
|
+
summary: Devise OAuth2 Facebook extension
|
102
|
+
test_files: []
|
103
|
+
|