authpwn_rails 0.8.3 → 0.9.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/VERSION CHANGED
@@ -1 +1 @@
1
- 0.8.3
1
+ 0.9.0
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{authpwn_rails}
8
- s.version = "0.8.3"
8
+ s.version = "0.9.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = [%q{Victor Costan}]
12
- s.date = %q{2011-07-01}
12
+ s.date = %q{2011-07-05}
13
13
  s.description = %q{Works with Facebook.}
14
14
  s.email = %q{victor@costan.us}
15
15
  s.extra_rdoc_files = [
@@ -29,7 +29,8 @@ Gem::Specification.new do |s|
29
29
  "authpwn_rails.gemspec",
30
30
  "lib/authpwn_rails.rb",
31
31
  "lib/authpwn_rails/engine.rb",
32
- "lib/authpwn_rails/facebook_extensions.rb",
32
+ "lib/authpwn_rails/facebook_session.rb",
33
+ "lib/authpwn_rails/facebook_token_model.rb",
33
34
  "lib/authpwn_rails/generators/facebook_generator.rb",
34
35
  "lib/authpwn_rails/generators/session_generator.rb",
35
36
  "lib/authpwn_rails/generators/templates/001_create_users.rb",
@@ -46,6 +47,7 @@ Gem::Specification.new do |s|
46
47
  "lib/authpwn_rails/generators/templates/users.yml",
47
48
  "lib/authpwn_rails/generators/users_generator.rb",
48
49
  "lib/authpwn_rails/session.rb",
50
+ "lib/authpwn_rails/session_controller.rb",
49
51
  "lib/authpwn_rails/user_model.rb",
50
52
  "test/cookie_controller_test.rb",
51
53
  "test/facebook_controller_test.rb",
@@ -62,7 +64,7 @@ Gem::Specification.new do |s|
62
64
  s.homepage = %q{http://github.com/pwnall/authpwn_rails}
63
65
  s.licenses = [%q{MIT}]
64
66
  s.require_paths = [%q{lib}]
65
- s.rubygems_version = %q{1.8.4}
67
+ s.rubygems_version = %q{1.8.5}
66
68
  s.summary = %q{User authentication for Rails 3 applications.}
67
69
 
68
70
  if s.respond_to? :specification_version then
@@ -0,0 +1,33 @@
1
+ require 'action_controller'
2
+
3
+ # :nodoc: add authenticates_using_facebook
4
+ class ActionController::Base
5
+ # Authenticates users via Facebook OAuth2, using fbgraph_rails.
6
+ #
7
+ # The User model class must implement for_facebook_token. The controller
8
+ # should obtain the Facebook token, using probes_facebook_access_token or
9
+ # requires_facebook_access_token.
10
+ def self.authenticates_using_facebook(options = {})
11
+ include AuthpwnRails::FacebookControllerInstanceMethods
12
+ before_filter :authenticate_using_facebook_access_token, options
13
+ end
14
+ end # module AuthpwnRails::FacebookExtensions::ControllerClassMethods
15
+
16
+ # :nodoc: namespace
17
+ module AuthpwnRails
18
+
19
+ # Included in controllers that call authenticates_using_facebook.
20
+ module FacebookControllerInstanceMethods
21
+ def authenticate_using_facebook_access_token
22
+ return true if current_user
23
+ if access_token = current_facebook_access_token
24
+ self.current_user = User.for_facebook_token access_token
25
+ # NOTE: nixing the token from the session so the user won't be logged on
26
+ # immediately after logging off
27
+ self.current_facebook_access_token = nil
28
+ end
29
+ end
30
+ private :authenticate_using_facebook_access_token
31
+ end # module AuthpwnRails::FacebookControllerInstanceMethods
32
+
33
+ end # namespace AuthpwnRails
@@ -0,0 +1,66 @@
1
+ require 'active_support'
2
+
3
+ # :nodoc: namespace
4
+ module AuthpwnRails
5
+
6
+ # Included by the model class that represents facebook tokens.
7
+ #
8
+ # Right now, some parts of the codebase assume the model will be named
9
+ # FacebookToken.
10
+ module FacebookTokenModel
11
+ extend ActiveSupport::Concern
12
+
13
+ included do
14
+ # The user whose token this is.
15
+ belongs_to :user, :inverse_of => :facebook_token
16
+ validates :user, :presence => true
17
+
18
+ # A unique ID on the Facebook site for the user owning this token.
19
+ validates :external_uid, :length => 1..32, :presence => true
20
+
21
+ # The OAuth2 access token.
22
+ validates :access_token, :length => 1..128, :presence => true
23
+ end
24
+
25
+ # Included in the metaclass of models that call pwnauth_facebook_token_model.
26
+ module ClassMethods
27
+ # Finds or creates the model containing a token.
28
+ #
29
+ # If a model for the same user exists, the model is updated with the given
30
+ # token. Otherwise, a new model will be created, together with a user.
31
+ def for(access_token)
32
+ uid = uid_from_token access_token
33
+ token = self.where(:external_uid => uid.to_str).first
34
+ if token
35
+ token.access_token = access_token
36
+ else
37
+ token = FacebookToken.new :external_uid => uid,
38
+ :access_token => access_token
39
+ token.user = User.create_with_facebook_token token
40
+ end
41
+ token.save!
42
+ token
43
+ end
44
+
45
+ # Extracts the Facebook user ID from a OAuth2 token.
46
+ #
47
+ # This is a hack. It works based on the current format, but might break at
48
+ # any time. Hopefully, we'll eventually have an official way of pulling the
49
+ # UID out of an OAuth2 token.
50
+ def uid_from_token(access_token)
51
+ access_token.split('|')[1].split('-').last
52
+ end
53
+ end # module AuthpwnRails::FacebookTokenModel::ClassMethods
54
+
55
+
56
+ # Included in models that include AuthpwnRails::FacebookTokenModel.
57
+ module InstanceMethods
58
+ # FBGraph client loaded with this access token.
59
+ def facebook_client
60
+ @client ||= FBGraphRails.fbclient(access_token)
61
+ end
62
+ end # module AuthpwnRails::FacebookTokenModel::InstanceMethods
63
+
64
+ end # namespace AuthpwnRails::FacebookTokenModel
65
+
66
+ end # namespace AuthpwnRails
@@ -1,6 +1,6 @@
1
1
  # Wraps an OAuth2 access token for Facebook.
2
2
  class FacebookToken < ActiveRecord::Base
3
- pwnauth_facebook_token_model
3
+ include AuthpwnRails::FacebookTokenModel
4
4
 
5
5
  # Add your extensions to the FacebookToken class here.
6
6
  end
@@ -1,6 +1,6 @@
1
1
  # Manages logging in and out of the application.
2
2
  class SessionController < ApplicationController
3
- authpwn_session_controller
3
+ include AuthpwnRails::SessionController
4
4
 
5
5
  # Sets up the 'session/welcome' view. No user is logged in.
6
6
  def welcome
@@ -1,6 +1,6 @@
1
1
  # An user account.
2
2
  class User < ActiveRecord::Base
3
- pwnauth_user_model
3
+ include AuthpwnRails::UserModel
4
4
 
5
5
  # Add your extensions to the User class here.
6
6
  end
@@ -1,40 +1,21 @@
1
1
  require 'action_controller'
2
2
 
3
- # :nodoc: namespace
4
- module AuthpwnRails
5
-
6
- # :nodoc: namespace
7
- module Session
8
-
9
- # Mixed into ActiveController::Base
10
- module ControllerMixin
11
- def self.included(base)
12
- base.send :extend, ControllerClassMethods
13
- end
14
- end
15
-
16
- # Methods here become ActiveController::Base class methods.
17
- module ControllerClassMethods
3
+ # :nodoc: adds authenticates_using_session
4
+ class ActionController::Base
18
5
  # Keeps track of the currently authenticated user via the session.
19
6
  #
20
7
  # Assumes the existence of a User model. A bare ActiveModel model will do the
21
8
  # trick. Model instances must implement id, and the model class must implement
22
9
  # find_by_id.
23
- def authenticates_using_session(options = {})
24
- include ControllerInstanceMethods
10
+ def self.authenticates_using_session(options = {})
11
+ include AuthpwnRails::ControllerInstanceMethods
25
12
  before_filter :authenticate_using_session, options
26
- end
27
-
28
- # Turns the current controller into the session processing controller.
29
- #
30
- # Right now, this should be called from SessionController. The controller name
31
- # is hardwired in other parts of the implementation.
32
- def authpwn_session_controller
33
- include SessionControllerInstanceMethods
34
- authenticates_using_session
35
- end
13
+ end
36
14
  end
37
15
 
16
+ # :nodoc: namespace
17
+ module AuthpwnRails
18
+
38
19
  # Included in controllers that call authenticates_using_session.
39
20
  module ControllerInstanceMethods
40
21
  attr_reader :current_user
@@ -82,93 +63,9 @@ module ControllerInstanceMethods
82
63
  end
83
64
  end
84
65
  end
85
- end
86
-
87
- # Included in controllers that call authpwn_session_controller.
88
- module SessionControllerInstanceMethods
89
- # GET /session/new
90
- def new
91
- @user = User.new
92
- @redirect_url = flash[:auth_redirect_url]
93
- redirect_to session_url if current_user
94
- end
95
-
96
- # GET /session
97
- def show
98
- @user = current_user || User.new
99
- if @user.new_record?
100
- welcome
101
- unless performed?
102
- respond_to do |format|
103
- format.html { render :action => :welcome }
104
- format.json { render :json => {} }
105
- end
106
- end
107
- else
108
- home
109
- unless performed?
110
- respond_to do |format|
111
- format.html { render :action => :home }
112
- format.json do
113
- user_data = @user.as_json
114
- user_data = user_data['user'] if @user.class.include_root_in_json
115
- render :json => { :user => user_data,
116
- :csrf => form_authenticity_token }
117
- end
118
- end
119
- end
120
- end
121
- end
122
-
123
- # POST /session
124
- def create
125
- @user = User.new params[:user]
126
- @redirect_url = params[:redirect_url] || session_url
127
- self.current_user =
128
- User.find_by_email_and_password @user.email, @user.password
129
-
130
- respond_to do |format|
131
- if current_user
132
- format.html { redirect_to @redirect_url }
133
- format.json do
134
- user_data = @user.as_json
135
- user_data = user_data['user'] if @user.class.include_root_in_json
136
- render :json => { :user => user_data,
137
- :csrf => form_authenticity_token }
138
- end
139
- else
140
- notice = 'Invalid e-mail or password'
141
- format.html do
142
- redirect_to new_session_url, :flash => {
143
- :notice => notice, :auth_redirect_url => @redirect_url }
144
- end
145
- format.json { render :json => { :error => notice} }
146
- end
147
- end
148
- end
149
-
150
- # DELETE /session
151
- def destroy
152
- self.current_user = nil
153
- respond_to do |format|
154
- format.html { redirect_to session_url }
155
- format.json { head :ok }
156
- end
157
- end
158
-
159
- # Hook for setting up the home view.
160
- def home
161
- end
162
- private :home
163
-
164
- # Hook for setting up the welcome view.
165
- def welcome
166
- end
167
- private :welcome
168
- end # module Authpwn::Session::SessionControllerInstanceMethods
169
-
170
- ActionController::Base.send :include, ControllerMixin
66
+ end # module AuthpwnRails::ControllerInstanceMethods
171
67
 
68
+ end # namespace AuthpwnRails
172
69
 
173
70
  # :nodoc: add session modification
174
71
  class ActionController::TestCase
@@ -183,7 +80,3 @@ class ActionController::TestCase
183
80
  User.find_by_param user_param
184
81
  end
185
82
  end
186
-
187
- end # namespace AuthpwnRails::Session
188
-
189
- end # namespace AuthpwnRails
@@ -0,0 +1,102 @@
1
+ require 'active_support'
2
+
3
+ # :nodoc: namespace
4
+ module AuthpwnRails
5
+
6
+ # Included by the controller that handles user authentication.
7
+ #
8
+ # Right now, some parts of the codebase assume the controller will be named
9
+ # Session.
10
+ module SessionController
11
+ extend ActiveSupport::Concern
12
+
13
+ included do
14
+ authenticates_using_session
15
+ end
16
+
17
+ # Included in controllers that include AuthpwnRails::SessionController.
18
+ module InstanceMethods
19
+ # GET /session/new
20
+ def new
21
+ @user = User.new
22
+ @redirect_url = flash[:auth_redirect_url]
23
+ redirect_to session_url if current_user
24
+ end
25
+
26
+ # GET /session
27
+ def show
28
+ @user = current_user || User.new
29
+ if @user.new_record?
30
+ welcome
31
+ unless performed?
32
+ respond_to do |format|
33
+ format.html { render :action => :welcome }
34
+ format.json { render :json => {} }
35
+ end
36
+ end
37
+ else
38
+ home
39
+ unless performed?
40
+ respond_to do |format|
41
+ format.html { render :action => :home }
42
+ format.json do
43
+ user_data = @user.as_json
44
+ user_data = user_data['user'] if @user.class.include_root_in_json
45
+ render :json => { :user => user_data,
46
+ :csrf => form_authenticity_token }
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
52
+
53
+ # POST /session
54
+ def create
55
+ @user = User.new params[:user]
56
+ @redirect_url = params[:redirect_url] || session_url
57
+ self.current_user =
58
+ User.find_by_email_and_password @user.email, @user.password
59
+
60
+ respond_to do |format|
61
+ if current_user
62
+ format.html { redirect_to @redirect_url }
63
+ format.json do
64
+ user_data = @user.as_json
65
+ user_data = user_data['user'] if @user.class.include_root_in_json
66
+ render :json => { :user => user_data,
67
+ :csrf => form_authenticity_token }
68
+ end
69
+ else
70
+ notice = 'Invalid e-mail or password'
71
+ format.html do
72
+ redirect_to new_session_url, :flash => {
73
+ :notice => notice, :auth_redirect_url => @redirect_url }
74
+ end
75
+ format.json { render :json => { :error => notice} }
76
+ end
77
+ end
78
+ end
79
+
80
+ # DELETE /session
81
+ def destroy
82
+ self.current_user = nil
83
+ respond_to do |format|
84
+ format.html { redirect_to session_url }
85
+ format.json { head :ok }
86
+ end
87
+ end
88
+
89
+ # Hook for setting up the home view.
90
+ def home
91
+ end
92
+ private :home
93
+
94
+ # Hook for setting up the welcome view.
95
+ def welcome
96
+ end
97
+ private :welcome
98
+ end # module AuthpwnRails::SessionController::InstanceMethods
99
+
100
+ end # module AuthpwnRails::SessionController
101
+
102
+ end # namespace AuthpwnRails
@@ -1,24 +1,16 @@
1
- require 'active_record'
1
+ require 'active_model'
2
+ require 'active_support'
2
3
 
3
4
  # :nodoc: namespace
4
5
  module AuthpwnRails
5
6
 
6
- # :nodoc: namespace
7
+ # Included by the model class that represents users.
8
+ #
9
+ # Right now, some parts of the codebase assume the model will be named User.
7
10
  module UserModel
8
-
9
-
10
- # Mixed into ActiveRecord::Base
11
- module ModelMixin
12
- def self.included(base)
13
- base.send :extend, ModelClassMethods
14
- end
15
- end
16
-
17
-
18
- # Methods here become ActiveRecord::Base class methods.
19
- module ModelClassMethods
20
- # Extends the model with all that it needs to be PwnAuth's user model.
21
- def pwnauth_user_model
11
+ extend ActiveSupport::Concern
12
+
13
+ included do
22
14
  # E-mail address identifying the user account.
23
15
  validates :email, :format => /^[A-Za-z0-9.+_]+@[^@]*\.(\w+)$/,
24
16
  :presence => true, :length => 1..128, :uniqueness => true
@@ -42,94 +34,86 @@ module ModelClassMethods
42
34
 
43
35
  # Facebook token.
44
36
  has_one :facebook_token, :dependent => :destroy, :inverse_of => :user
45
-
46
- extend ModelMetaclassMethods
47
- include ModelInstanceMethods
48
37
  end
49
- end # module AuthpwnRails::UserModel::ModelClassMethods
50
38
 
51
-
52
- # Included in the metaclass of models that call pwnauth_user_model.
53
- module ModelMetaclassMethods
54
- # Queries the database using the value returned by User#to_param.
55
- #
56
- # Returns nil if no matching User exists.
57
- def find_by_param(param)
58
- where(:email_hash => param).first
59
- end
60
-
61
- # The authenticated user or nil.
62
- def find_by_email_and_password(email, password)
63
- user = where(:email => email).first
64
- (user && user.password_matches?(password)) ? user : nil
65
- end
66
-
67
- # Computes a password hash from a raw password and a salt.
68
- def hash_password(password, salt)
69
- Digest::SHA2.hexdigest(password + salt)
70
- end
71
-
72
- # Generates a random salt value.
73
- def random_salt
74
- [(0...12).map { |i| 1 + rand(255) }.pack('C*')].pack('m').strip
75
- end
76
-
77
- # Fills out a new user's information based on a Facebook access token.
78
- def create_with_facebook_token(token)
79
- self.create! :email => "#{token.external_uid}@graph.facebook.com"
80
- end
81
-
82
- # The user that owns a given Facebook OAuth2 token.
83
- #
84
- # A new user will be created if the token doesn't belong to any user. This is
85
- # the case for a new visitor.
86
- def for_facebook_token(access_token)
87
- FacebookToken.for(access_token).user
88
- end
89
- end # module AuthpwnRails::UserModel::ModelMetaclassMethods
90
-
91
-
92
- # Included in models that call pwnauth_user_model.
93
- module ModelInstanceMethods
94
- # Resets the virtual password attributes.
95
- def reset_password
96
- @password = @password_confirmation = nil
97
- end
39
+ # Class methods on models that include AuthpwnRails::UserModel.
40
+ module ClassMethods
41
+ # Queries the database using the value returned by User#to_param.
42
+ #
43
+ # Returns nil if no matching User exists.
44
+ def find_by_param(param)
45
+ where(:email_hash => param).first
46
+ end
98
47
 
99
- # Compares the given password against the user's stored password.
100
- #
101
- # Returns +true+ for a match, +false+ otherwise.
102
- def password_matches?(passwd)
103
- password_hash == self.class.hash_password(passwd, password_salt)
104
- end
105
-
106
- # Password virtual attribute.
107
- def password=(new_password)
108
- @password = new_password
109
- self.password_salt = self.class.random_salt
110
- self.password_hash = new_password &&
111
- self.class.hash_password(new_password, password_salt)
112
- end
113
-
114
- # Use e-mails instead of exposing ActiveRecord IDs.
115
- def to_param
116
- email_hash
117
- end
48
+ # The authenticated user or nil.
49
+ def find_by_email_and_password(email, password)
50
+ user = where(:email => email).first
51
+ (user && user.password_matches?(password)) ? user : nil
52
+ end
53
+
54
+ # Computes a password hash from a raw password and a salt.
55
+ def hash_password(password, salt)
56
+ Digest::SHA2.hexdigest(password + salt)
57
+ end
58
+
59
+ # Generates a random salt value.
60
+ def random_salt
61
+ [(0...12).map { |i| 1 + rand(255) }.pack('C*')].pack('m').strip
62
+ end
63
+
64
+ # Fills out a new user's information based on a Facebook access token.
65
+ def create_with_facebook_token(token)
66
+ self.create! :email => "#{token.external_uid}@graph.facebook.com"
67
+ end
68
+
69
+ # The user that owns a given Facebook OAuth2 token.
70
+ #
71
+ # A new user will be created if the token doesn't belong to any user. This
72
+ # is the case for a new visitor.
73
+ def for_facebook_token(access_token)
74
+ FacebookToken.for(access_token).user
75
+ end
76
+ end # module AuthpwnRails::UserModel::ClassMethods
118
77
 
119
- # :nodoc: overwrites
120
- def email=(new_email)
121
- super
122
- self.email_hash = new_email && Digest::SHA2.hexdigest(new_email)
123
- end
78
+ # Included in models that include AuthpwnRails::UserModel.
79
+ module InstanceMethods
80
+ # Resets the virtual password attributes.
81
+ def reset_password
82
+ @password = @password_confirmation = nil
83
+ end
84
+
85
+ # Compares the given password against the user's stored password.
86
+ #
87
+ # Returns +true+ for a match, +false+ otherwise.
88
+ def password_matches?(passwd)
89
+ password_hash == self.class.hash_password(passwd, password_salt)
90
+ end
124
91
 
125
- # Do not expose password and ActiveRecord IDs in JSON representation.
126
- def as_json(options = {})
127
- options ||= {}
128
- super(options.merge(:except => [:password_salt, :password_hash, :id]))
129
- end
130
- end # module AuthpwnRails::UserModel::ModelInstanceMethods
131
-
132
- ActiveRecord::Base.send :include, ModelMixin
92
+ # Password virtual attribute.
93
+ def password=(new_password)
94
+ @password = new_password
95
+ self.password_salt = self.class.random_salt
96
+ self.password_hash = new_password &&
97
+ self.class.hash_password(new_password, password_salt)
98
+ end
99
+
100
+ # Use e-mails instead of exposing ActiveRecord IDs.
101
+ def to_param
102
+ email_hash
103
+ end
104
+
105
+ # :nodoc: overwrites
106
+ def email=(new_email)
107
+ super
108
+ self.email_hash = new_email && Digest::SHA2.hexdigest(new_email)
109
+ end
110
+
111
+ # Do not expose password and ActiveRecord IDs in JSON representation.
112
+ def as_json(options = {})
113
+ options ||= {}
114
+ super(options.merge(:except => [:password_salt, :password_hash, :id]))
115
+ end
116
+ end # module AuthpwnRails::UserModel::InstanceMethods
133
117
 
134
118
  end # namespace AuthpwnRails::UserModel
135
119
 
data/lib/authpwn_rails.rb CHANGED
@@ -2,8 +2,10 @@
2
2
  module AuthpwnRails
3
3
  end
4
4
 
5
- require 'authpwn_rails/facebook_extensions.rb'
5
+ require 'authpwn_rails/facebook_session.rb'
6
+ require 'authpwn_rails/facebook_token_model.rb'
6
7
  require 'authpwn_rails/session.rb'
8
+ require 'authpwn_rails/session_controller.rb'
7
9
  require 'authpwn_rails/user_model.rb'
8
10
 
9
11
  if defined?(Rails)
@@ -34,7 +34,8 @@ class CookieControllerTest < ActionController::TestCase
34
34
  get :show
35
35
  assert_response :success
36
36
  assert_equal @user, assigns(:current_user)
37
- assert_equal "User: #{Fixtures.identify(:john)}", response.body
37
+ assert_equal "User: #{ActiveRecord::Fixtures.identify(:john)}",
38
+ response.body
38
39
  end
39
40
 
40
41
  test "invalid user_pid in session" do
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: authpwn_rails
3
3
  version: !ruby/object:Gem::Version
4
- hash: 57
4
+ hash: 59
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
- - 8
9
- - 3
10
- version: 0.8.3
8
+ - 9
9
+ - 0
10
+ version: 0.9.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Victor Costan
@@ -15,11 +15,10 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-07-01 00:00:00 Z
18
+ date: 2011-07-05 00:00:00 Z
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
21
- type: :runtime
22
- requirement: &id001 !ruby/object:Gem::Requirement
21
+ version_requirements: &id001 !ruby/object:Gem::Requirement
23
22
  none: false
24
23
  requirements:
25
24
  - - ">="
@@ -30,12 +29,12 @@ dependencies:
30
29
  - 1
31
30
  - 7
32
31
  version: 0.1.7
32
+ type: :runtime
33
+ requirement: *id001
33
34
  prerelease: false
34
- version_requirements: *id001
35
35
  name: fbgraph_rails
36
36
  - !ruby/object:Gem::Dependency
37
- type: :runtime
38
- requirement: &id002 !ruby/object:Gem::Requirement
37
+ version_requirements: &id002 !ruby/object:Gem::Requirement
39
38
  none: false
40
39
  requirements:
41
40
  - - ">="
@@ -48,12 +47,12 @@ dependencies:
48
47
  - rc
49
48
  - 4
50
49
  version: 3.1.0.rc4
50
+ type: :runtime
51
+ requirement: *id002
51
52
  prerelease: false
52
- version_requirements: *id002
53
53
  name: rails
54
54
  - !ruby/object:Gem::Dependency
55
- type: :development
56
- requirement: &id003 !ruby/object:Gem::Requirement
55
+ version_requirements: &id003 !ruby/object:Gem::Requirement
57
56
  none: false
58
57
  requirements:
59
58
  - - ~>
@@ -64,12 +63,12 @@ dependencies:
64
63
  - 0
65
64
  - 0
66
65
  version: 1.0.0
66
+ type: :development
67
+ requirement: *id003
67
68
  prerelease: false
68
- version_requirements: *id003
69
69
  name: bundler
70
70
  - !ruby/object:Gem::Dependency
71
- type: :development
72
- requirement: &id004 !ruby/object:Gem::Requirement
71
+ version_requirements: &id004 !ruby/object:Gem::Requirement
73
72
  none: false
74
73
  requirements:
75
74
  - - ~>
@@ -80,12 +79,12 @@ dependencies:
80
79
  - 6
81
80
  - 0
82
81
  version: 1.6.0
82
+ type: :development
83
+ requirement: *id004
83
84
  prerelease: false
84
- version_requirements: *id004
85
85
  name: jeweler
86
86
  - !ruby/object:Gem::Dependency
87
- type: :development
88
- requirement: &id005 !ruby/object:Gem::Requirement
87
+ version_requirements: &id005 !ruby/object:Gem::Requirement
89
88
  none: false
90
89
  requirements:
91
90
  - - ">="
@@ -94,12 +93,12 @@ dependencies:
94
93
  segments:
95
94
  - 0
96
95
  version: "0"
96
+ type: :development
97
+ requirement: *id005
97
98
  prerelease: false
98
- version_requirements: *id005
99
99
  name: rcov
100
100
  - !ruby/object:Gem::Dependency
101
- type: :development
102
- requirement: &id006 !ruby/object:Gem::Requirement
101
+ version_requirements: &id006 !ruby/object:Gem::Requirement
103
102
  none: false
104
103
  requirements:
105
104
  - - ">="
@@ -110,8 +109,9 @@ dependencies:
110
109
  - 3
111
110
  - 3
112
111
  version: 1.3.3
112
+ type: :development
113
+ requirement: *id006
113
114
  prerelease: false
114
- version_requirements: *id006
115
115
  name: sqlite3
116
116
  description: Works with Facebook.
117
117
  email: victor@costan.us
@@ -135,7 +135,8 @@ files:
135
135
  - authpwn_rails.gemspec
136
136
  - lib/authpwn_rails.rb
137
137
  - lib/authpwn_rails/engine.rb
138
- - lib/authpwn_rails/facebook_extensions.rb
138
+ - lib/authpwn_rails/facebook_session.rb
139
+ - lib/authpwn_rails/facebook_token_model.rb
139
140
  - lib/authpwn_rails/generators/facebook_generator.rb
140
141
  - lib/authpwn_rails/generators/session_generator.rb
141
142
  - lib/authpwn_rails/generators/templates/001_create_users.rb
@@ -152,6 +153,7 @@ files:
152
153
  - lib/authpwn_rails/generators/templates/users.yml
153
154
  - lib/authpwn_rails/generators/users_generator.rb
154
155
  - lib/authpwn_rails/session.rb
156
+ - lib/authpwn_rails/session_controller.rb
155
157
  - lib/authpwn_rails/user_model.rb
156
158
  - test/cookie_controller_test.rb
157
159
  - test/facebook_controller_test.rb
@@ -193,7 +195,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
193
195
  requirements: []
194
196
 
195
197
  rubyforge_project:
196
- rubygems_version: 1.8.4
198
+ rubygems_version: 1.8.5
197
199
  signing_key:
198
200
  specification_version: 3
199
201
  summary: User authentication for Rails 3 applications.
@@ -1,121 +0,0 @@
1
- require 'action_controller'
2
- require 'active_record'
3
-
4
- # :nodoc: namespace
5
- module AuthpwnRails
6
-
7
- # :nodoc: namespace
8
- module FacebookExtensions
9
-
10
-
11
- # Mixed into ActiveController::Base
12
- module ControllerMixin
13
- def self.included(base)
14
- base.send :extend, ControllerClassMethods
15
- end
16
- end
17
-
18
-
19
- # Methods here become ActiveController::Base class methods.
20
- module ControllerClassMethods
21
- # Authenticates users via Facebook OAuth2, using fbgraph_rails.
22
- #
23
- # The User model class must implement for_facebook_token. The controller
24
- # should obtain the Facebook token, using probes_facebook_access_token or
25
- # requires_facebook_access_token.
26
- def authenticates_using_facebook(options = {})
27
- include ControllerInstanceMethods
28
- before_filter :authenticate_using_facebook_access_token, options
29
- end
30
- end # module AuthpwnRails::FacebookExtensions::ControllerClassMethods
31
-
32
-
33
- # Included in controllers that call authenticates_using_facebook.
34
- module ControllerInstanceMethods
35
- def authenticate_using_facebook_access_token
36
- return true if current_user
37
- if access_token = current_facebook_access_token
38
- self.current_user = User.for_facebook_token access_token
39
- # NOTE: nixing the token from the session so the user won't be logged on
40
- # immediately after logging off
41
- self.current_facebook_access_token = nil
42
- end
43
- end
44
- private :authenticate_using_facebook_access_token
45
- end # module AuthpwnRails::FacebookExtensions::ControllerInstanceMethods
46
-
47
- ActionController::Base.send :include, ControllerMixin
48
-
49
-
50
- # Mixed into ActiveRecord::Base
51
- module ModelMixin
52
- def self.included(base)
53
- base.send :extend, ModelClassMethods
54
- end
55
- end
56
-
57
-
58
- # Methods here become ActiveRecord::Base class methods.
59
- module ModelClassMethods
60
- # Extends the model with all that it needs to be PwnAuth's user model.
61
- def pwnauth_facebook_token_model
62
- # The user whose token this is.
63
- belongs_to :user, :inverse_of => :facebook_token
64
- validates :user, :presence => true
65
-
66
- # A unique ID on the Facebook site for the user owning this token.
67
- validates :external_uid, :length => 1..32, :presence => true
68
-
69
- # The OAuth2 access token.
70
- validates :access_token, :length => 1..128, :presence => true
71
-
72
- extend ModelMetaclassMethods
73
- include ModelInstanceMethods
74
- end
75
- end # module AuthpwnRails::UserModel::ModelClassMethods
76
-
77
-
78
- # Included in the metaclass of models that call pwnauth_facebook_token_model.
79
- module ModelMetaclassMethods
80
- # Finds or creates the model containing a token.
81
- #
82
- # If a model for the same user exists, the model is updated with the given
83
- # token. Otherwise, a new model will be created, together with a user.
84
- def for(access_token)
85
- uid = uid_from_token access_token
86
- token = self.where(:external_uid => uid.to_str).first
87
- if token
88
- token.access_token = access_token
89
- else
90
- token = FacebookToken.new :external_uid => uid,
91
- :access_token => access_token
92
- token.user = User.create_with_facebook_token token
93
- end
94
- token.save!
95
- token
96
- end
97
-
98
- # Extracts the Facebook user ID from a OAuth2 token.
99
- #
100
- # This is a hack. It works based on the current format, but might break at any
101
- # time. Hopefully, we'll eventually have an official way of pulling the UID
102
- # out of an OAuth2 token.
103
- def uid_from_token(access_token)
104
- access_token.split('|')[1].split('-').last
105
- end
106
- end # module AuthpwnRails::UserModel::ModelMetaclassMethods
107
-
108
-
109
- # Included in models that call pwnauth_user_model.
110
- module ModelInstanceMethods
111
- # FBGraph client loaded with this access token.
112
- def facebook_client
113
- @client ||= FBGraphRails.fbclient(access_token)
114
- end
115
- end # module AuthpwnRails::UserModel::ModelInstanceMethods
116
-
117
- ActiveRecord::Base.send :include, ModelMixin
118
-
119
- end # namespace AuthpwnRails::FacebookExtensions
120
-
121
- end # namespace AuthpwnRails