devise_oauth2_fb_canvas 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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,4 @@
1
+ en:
2
+ devise:
3
+ facebook_consumer:
4
+ signed_in: 'Signed in successfully.'
@@ -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
+