authenticate 0.5.0 → 0.6.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.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/.ruby-version +1 -1
- data/.travis.yml +15 -8
- data/Appraisals +10 -0
- data/CHANGELOG.md +58 -26
- data/Rakefile +14 -0
- data/app/controllers/authenticate/passwords_controller.rb +14 -3
- data/authenticate.gemspec +6 -4
- data/bin/setup +15 -0
- data/gemfiles/4.2.gemfile +7 -0
- data/gemfiles/5.0.gemfile +8 -0
- data/lib/authenticate/configuration.rb +16 -1
- data/lib/authenticate/controller.rb +9 -11
- data/lib/authenticate/version.rb +1 -1
- data/lib/generators/authenticate/install/templates/authenticate.rb +3 -2
- data/spec/controllers/secured_controller_spec.rb +4 -4
- data/spec/dummy/config/application.rb +1 -1
- data/spec/dummy/config/environments/test.rb +3 -2
- data/spec/features/create_user_spec.rb +45 -0
- data/spec/features/new_user_form_spec.rb +26 -0
- data/spec/features/password_reset_spec.rb +3 -1
- data/spec/features/password_update_spec.rb +83 -11
- data/spec/features/sign_in_spec.rb +19 -0
- data/spec/features/sign_out_spec.rb +12 -1
- data/spec/model/password_reset_spec.rb +12 -10
- data/spec/requests/csrf_rotation_spec.rb +39 -0
- data/spec/requests/session_key_spec.rb +42 -0
- data/spec/spec_helper.rb +46 -4
- data/spec/support/features/feature_helpers.rb +5 -1
- data/spec/support/mailer.rb +6 -0
- metadata +50 -17
- data/gemfiles/rails42.gemfile +0 -17
- data/spec/controllers/passwords_controller_spec.rb +0 -117
- data/spec/controllers/sessions_controller_spec.rb +0 -86
- data/spec/controllers/users_controller_spec.rb +0 -82
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a77403e50b229de8318c79477ee44062589afb05
|
4
|
+
data.tar.gz: c6bf923d8809f923a48cb4211d97dd406b42e03f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 55cd9cb2b412bb87ebe3d6e6a46ce89eebd23147946aaa31b0f7e3fbf566f24bdf237a010be18eb6b1cb785d424821df3e9a55ad798b18b420246d6a18cfa963
|
7
|
+
data.tar.gz: 5f5f9aeaf98ce47c9ce16d90c7ebcc7930fc58a2013c909fdec27c18979e4fe3b0821a6075eecab22d5433fc7dd21d9071d28cc7493f53116d4fbf18f9000a74
|
data/.gitignore
CHANGED
data/.ruby-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.
|
1
|
+
2.4.1
|
data/.travis.yml
CHANGED
@@ -1,17 +1,24 @@
|
|
1
|
-
|
1
|
+
cache: bundler
|
2
|
+
|
3
|
+
language:
|
4
|
+
- ruby
|
2
5
|
|
3
6
|
rvm:
|
4
7
|
- 2.1.8
|
5
8
|
- 2.2.4
|
6
|
-
- 2.3.
|
9
|
+
- 2.3.3
|
7
10
|
|
8
11
|
gemfile:
|
9
|
-
- gemfiles/
|
12
|
+
- gemfiles/4.2.gemfile
|
13
|
+
- gemfiles/5.0.gemfile
|
10
14
|
|
11
|
-
branches:
|
12
|
-
only:
|
13
|
-
- master
|
14
15
|
|
15
|
-
|
16
|
+
matrix:
|
17
|
+
exclude:
|
18
|
+
- rvm: 2.1.8
|
19
|
+
gemfile: gemfiles/5.0.gemfile
|
16
20
|
|
17
|
-
|
21
|
+
install:
|
22
|
+
- "bin/setup"
|
23
|
+
|
24
|
+
sudo: false
|
data/Appraisals
ADDED
data/CHANGELOG.md
CHANGED
@@ -1,8 +1,40 @@
|
|
1
1
|
# Authenticate Changelog
|
2
2
|
|
3
|
+
|
4
|
+
## [0.6.0] - May 16, 2017
|
5
|
+
|
6
|
+
### Security
|
7
|
+
- Prevent [password reset token leakage] through HTTP referrer across domains. password#edit removes the password
|
8
|
+
reset token from the url, sets it into the user's session (typically a cookie), and redirects to password#url
|
9
|
+
without the token in the url.
|
10
|
+
|
11
|
+
- Prevent [session fixation] attacks by rotating CSRF tokens on sign-in by setting
|
12
|
+
`Authentication.configuration.rotate_csrf_on_sign_in` to `true`. This is recommended for
|
13
|
+
all applications. The setting defaults to `false` in this release, but will default to `true`
|
14
|
+
in a future release.
|
15
|
+
|
16
|
+
### Fixed
|
17
|
+
- Location to return to after login is now written to session. Was previously written explicitly to a cookie.
|
18
|
+
- Most controller tests rewritten as feature and request tests.
|
19
|
+
|
20
|
+
[password reset token leakage]: https://security.stackexchange.com/questions/69074/how-to-implement-password-reset-functionality-without-becoming-susceptible-to-cr
|
21
|
+
[session fixation]: http://guides.rubyonrails.org/security.html#session-fixation
|
22
|
+
[0.6.0]: https://github.com/tomichj/authenticate/compare/v0.5.0...v0.6.0
|
23
|
+
|
24
|
+
|
25
|
+
|
26
|
+
## [0.5.0] - March 26, 2017
|
27
|
+
|
28
|
+
### Support for rails 5.1.
|
29
|
+
|
30
|
+
[0.5.0]: https://github.com/tomichj/authenticate/compare/v0.4.0...v0.5.0
|
31
|
+
|
32
|
+
|
33
|
+
|
3
34
|
## [0.4.0] - June 2, 2016
|
4
35
|
|
5
|
-
|
36
|
+
### Fixed
|
37
|
+
- Install generator User: ActiveRecord::Base for Rails 4 apps, ApplicationRecord for rails 5 (issue #2).
|
6
38
|
|
7
39
|
[0.4.0]: https://github.com/tomichj/authenticate/compare/v0.3.3...v0.4.0
|
8
40
|
|
@@ -10,10 +42,10 @@ Install generator User: ActiveRecord::Base for Rails 4 apps, ApplicationRecord
|
|
10
42
|
|
11
43
|
## [0.3.3] - April 29, 2016
|
12
44
|
|
13
|
-
Password change uses active record's dirty bit to detect that password was updated.
|
14
|
-
password_updated attribute removed.
|
15
|
-
spec_helper now calls ActiveRecord::Migration.maintain_test_schema! (or check_pending!) to handle dummy test db.
|
16
|
-
Added CodeClimate config.
|
45
|
+
- Password change uses active record's dirty bit to detect that password was updated.
|
46
|
+
- password_updated attribute removed.
|
47
|
+
- spec_helper now calls ActiveRecord::Migration.maintain_test_schema! (or check_pending!) to handle dummy test db.
|
48
|
+
- Added CodeClimate config.
|
17
49
|
|
18
50
|
[0.3.3]: https://github.com/tomichj/authenticate/compare/v0.3.2...v0.3.3
|
19
51
|
|
@@ -21,8 +53,8 @@ Added CodeClimate config.
|
|
21
53
|
|
22
54
|
## [0.3.2] - April 28, 2016
|
23
55
|
|
24
|
-
Error now raised if User model is missing required attributes.
|
25
|
-
All code now conforms to a rubocode profile.
|
56
|
+
- Error now raised if User model is missing required attributes.
|
57
|
+
- All code now conforms to a rubocode profile.
|
26
58
|
|
27
59
|
[0.3.2]: https://github.com/tomichj/authenticate/compare/v0.3.1...v0.3.2
|
28
60
|
|
@@ -30,11 +62,10 @@ All code now conforms to a rubocode profile.
|
|
30
62
|
|
31
63
|
## [0.3.1] - March 10, 2016
|
32
64
|
|
33
|
-
User controller now allows arbitrary parameters without having to explicitly declare
|
34
|
-
them. Still requires email and password.
|
35
|
-
Mailer now checks for mail.respond_to?(:deliver_later) rather than rails version,
|
36
|
-
|
37
|
-
Removed unused user_id_parameter config method.
|
65
|
+
- User controller now allows arbitrary parameters without having to explicitly declare
|
66
|
+
them. Still requires email and password.
|
67
|
+
- Mailer now checks for mail.respond_to?(:deliver_later) rather than rails version, to decide deliver vs deliver_later.
|
68
|
+
- Removed unused user_id_parameter config method.
|
38
69
|
|
39
70
|
[0.3.1]: https://github.com/tomichj/authenticate/compare/v0.3.0...v0.3.1
|
40
71
|
|
@@ -42,11 +73,12 @@ Removed unused user_id_parameter config method.
|
|
42
73
|
|
43
74
|
## [0.3.0] - February 24, 2016
|
44
75
|
|
45
|
-
Moved normalize_email and find_normalized_email methods to base User module.
|
46
|
-
Added full suite of controller and feature tests.
|
47
|
-
|
48
|
-
|
49
|
-
|
76
|
+
- Moved normalize_email and find_normalized_email methods to base User module.
|
77
|
+
- Added full suite of controller and feature tests.
|
78
|
+
|
79
|
+
### Fixes
|
80
|
+
- failed login count fix was off by one.
|
81
|
+
- password validation now done only in correct circumstances
|
50
82
|
|
51
83
|
[0.3.0]: https://github.com/tomichj/authenticate/compare/v0.2.2...v0.3.0
|
52
84
|
|
@@ -54,8 +86,8 @@ Bug fixes:
|
|
54
86
|
|
55
87
|
## [0.2.3] - February 13, 2016
|
56
88
|
|
57
|
-
Small bugfix for :username authentication.
|
58
|
-
Improved documentation, started adding wiki pages.
|
89
|
+
- Small bugfix for :username authentication.
|
90
|
+
- Improved documentation, started adding wiki pages.
|
59
91
|
|
60
92
|
[0.2.3]: https://github.com/tomichj/authenticate/compare/v0.2.2...v0.2.3
|
61
93
|
|
@@ -63,8 +95,8 @@ Improved documentation, started adding wiki pages.
|
|
63
95
|
|
64
96
|
## [0.2.2] - February 9, 2016
|
65
97
|
|
66
|
-
Password length range requirements added, defaults to 8..128.
|
67
|
-
Generators and app now respect model class more completely, including in routes.
|
98
|
+
- Password length range requirements added, defaults to 8..128.
|
99
|
+
- Generators and app now respect model class more completely, including in routes.
|
68
100
|
|
69
101
|
[0.2.2]: https://github.com/tomichj/authenticate/compare/v0.2.1...v0.2.2
|
70
102
|
|
@@ -72,9 +104,9 @@ Generators and app now respect model class more completely, including in routes.
|
|
72
104
|
|
73
105
|
## [0.2.1] - February 9, 2016
|
74
106
|
|
75
|
-
Fixed potential password_reset nil pointer.
|
76
|
-
Continued adding I18n support.
|
77
|
-
Minor documentation
|
107
|
+
- Fixed potential password_reset nil pointer.
|
108
|
+
- Continued adding I18n support.
|
109
|
+
- Minor documentation improvements.
|
78
110
|
|
79
111
|
[0.2.1]: https://github.com/tomichj/authenticate/compare/v0.2.0...v0.2.1
|
80
112
|
|
@@ -82,7 +114,7 @@ Minor documentation improvments.
|
|
82
114
|
|
83
115
|
## [0.2.0] - February 2, 2016
|
84
116
|
|
85
|
-
Added app/ including controllers, views, routes, mailers.
|
117
|
+
- Added app/ including controllers, views, routes, mailers.
|
86
118
|
|
87
119
|
[0.2.0]: https://github.com/tomichj/authenticate/compare/v0.1.0...v0.2.0
|
88
120
|
|
@@ -90,5 +122,5 @@ Added app/ including controllers, views, routes, mailers.
|
|
90
122
|
|
91
123
|
## 0.1.0 - January 23, 2016
|
92
124
|
|
93
|
-
Initial Release, barely functioning
|
125
|
+
- Initial Release, barely functioning
|
94
126
|
|
data/Rakefile
CHANGED
@@ -1,4 +1,18 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'bundler/setup'
|
1
3
|
require 'bundler/gem_tasks'
|
4
|
+
require 'appraisal'
|
5
|
+
|
6
|
+
APP_RAKEFILE = File.expand_path('../spec/dummy/Rakefile', __FILE__)
|
7
|
+
load 'rails/tasks/engine.rake'
|
2
8
|
require 'rspec/core/rake_task'
|
9
|
+
|
10
|
+
namespace :dummy do
|
11
|
+
require_relative "spec/dummy/config/application"
|
12
|
+
Dummy::Application.load_tasks
|
13
|
+
end
|
14
|
+
|
3
15
|
RSpec::Core::RakeTask.new(:spec)
|
16
|
+
|
17
|
+
desc 'Run all specs in spec directory (excluding plugin specs)'
|
4
18
|
task default: :spec
|
@@ -23,10 +23,19 @@ class Authenticate::PasswordsController < Authenticate::AuthenticateController
|
|
23
23
|
|
24
24
|
# Screen to enter your new password.
|
25
25
|
#
|
26
|
-
#
|
26
|
+
# A get with the token in the url is expected:
|
27
|
+
# GET /users/passwords/3/edit?token=abcdef
|
28
|
+
#
|
29
|
+
# This results in a redirect with the token removed from the url & copied to the session:
|
30
|
+
# GET /users/passwords/3/edit
|
31
|
+
#
|
27
32
|
def edit
|
28
33
|
@user = find_user_for_edit
|
29
|
-
|
34
|
+
|
35
|
+
if params[:token]
|
36
|
+
session[:password_reset_token] = params[:token]
|
37
|
+
redirect_to edit_users_password_url(@user)
|
38
|
+
elsif !@user.reset_password_period_valid?
|
30
39
|
redirect_to sign_in_path, notice: flash_failure_token_expired
|
31
40
|
else
|
32
41
|
render template: 'passwords/edit'
|
@@ -87,7 +96,9 @@ class Authenticate::PasswordsController < Authenticate::AuthenticateController
|
|
87
96
|
end
|
88
97
|
|
89
98
|
def find_user_by_id_and_password_reset_token
|
90
|
-
|
99
|
+
token = session[:password_reset_token] || params[:token]
|
100
|
+
# Authenticate.configuration.user_model_class.where(id: params[:id], password_reset_token: token).first
|
101
|
+
Authenticate.configuration.user_model_class.find_by_id_and_password_reset_token params[:id], token.to_s
|
91
102
|
end
|
92
103
|
|
93
104
|
def flash_create_description
|
data/authenticate.gemspec
CHANGED
@@ -21,18 +21,20 @@ Gem::Specification.new do |s|
|
|
21
21
|
s.extra_rdoc_files = %w(LICENSE README.md CHANGELOG.md)
|
22
22
|
s.rdoc_options = ['--charset=UTF-8']
|
23
23
|
|
24
|
-
s.add_dependency 'bcrypt'
|
24
|
+
s.add_dependency 'bcrypt'
|
25
25
|
s.add_dependency 'email_validator', '~> 1.6'
|
26
26
|
s.add_dependency 'rails', '>= 4.0', '< 5.2'
|
27
27
|
|
28
|
-
s.add_development_dependency 'factory_girl', '~> 4.
|
29
|
-
s.add_development_dependency 'rspec-rails', '~> 3.
|
28
|
+
s.add_development_dependency 'factory_girl', '~> 4.8'
|
29
|
+
s.add_development_dependency 'rspec-rails', '~> 3.6'
|
30
30
|
s.add_development_dependency 'pry', '~> 0.10'
|
31
31
|
s.add_development_dependency 'sqlite3', '~> 1.3'
|
32
32
|
s.add_development_dependency 'shoulda-matchers', '~> 2.8'
|
33
|
-
s.add_development_dependency 'capybara', '~> 2.
|
33
|
+
s.add_development_dependency 'capybara', '~> 2.14'
|
34
34
|
s.add_development_dependency 'database_cleaner', '~> 1.5'
|
35
35
|
s.add_development_dependency 'timecop', '~> 0.8'
|
36
|
+
s.add_development_dependency 'appraisal'
|
37
|
+
s.add_development_dependency 'rake'
|
36
38
|
|
37
39
|
s.required_ruby_version = Gem::Requirement.new('>= 2.0')
|
38
40
|
end
|
data/bin/setup
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
#!/bin/sh
|
2
|
+
|
3
|
+
set -e
|
4
|
+
|
5
|
+
# Install required gems, including Appraisal, which helps us test against
|
6
|
+
# multiple Rails versions
|
7
|
+
gem install bundler --conservative
|
8
|
+
bundle check || bundle install
|
9
|
+
|
10
|
+
if [ -z "$CI" ]; then
|
11
|
+
bundle exec appraisal install
|
12
|
+
fi
|
13
|
+
|
14
|
+
# Set up database for the application that Clearance tests against
|
15
|
+
RAILS_ENV=test bundle exec rake dummy:db:reset
|
@@ -169,7 +169,10 @@ module Authenticate
|
|
169
169
|
# config.authentication_strategy = :username
|
170
170
|
# end
|
171
171
|
#
|
172
|
-
#
|
172
|
+
# Authenticate is designed to authenticate via :email. Some support for username is included.
|
173
|
+
# Username still requires an :email attribute on your User model.
|
174
|
+
#
|
175
|
+
# Alternatively, you can plug in your own authentication class:
|
173
176
|
#
|
174
177
|
# Configuration.configure do |config|
|
175
178
|
# config.authentication_strategy = MyFunkyAuthClass
|
@@ -186,6 +189,13 @@ module Authenticate
|
|
186
189
|
# @return [String]
|
187
190
|
attr_accessor :redirect_url
|
188
191
|
|
192
|
+
# Rotate CSRF token on sign in if true.
|
193
|
+
#
|
194
|
+
# Defaults to false, but will default to true in 1.0.
|
195
|
+
#
|
196
|
+
# @return [Boolean]
|
197
|
+
attr_accessor :rotate_csrf_on_sign_in
|
198
|
+
|
189
199
|
# Controls whether the "sign up" route, allowing creation of users, is enabled.
|
190
200
|
#
|
191
201
|
# Defaults to `true`.
|
@@ -239,6 +249,7 @@ module Authenticate
|
|
239
249
|
@cookie_http_only = true
|
240
250
|
@mailer_sender = 'reply@example.com'
|
241
251
|
@redirect_url = '/'
|
252
|
+
@rotate_csrf_on_sign_in = false
|
242
253
|
@allow_sign_up = true
|
243
254
|
@routes = true
|
244
255
|
@reset_password_within = 2.days
|
@@ -277,6 +288,10 @@ module Authenticate
|
|
277
288
|
@routes
|
278
289
|
end
|
279
290
|
|
291
|
+
def rotate_csrf_on_sign_in?
|
292
|
+
rotate_csrf_on_sign_in
|
293
|
+
end
|
294
|
+
|
280
295
|
# List of symbols naming modules to load.
|
281
296
|
def modules
|
282
297
|
modules = @modules.dup # in case the user pushes any on
|
@@ -42,6 +42,11 @@ module Authenticate
|
|
42
42
|
# Runs all valid callbacks and sends the user a session token.
|
43
43
|
def login(user, &block)
|
44
44
|
authenticate_session.login user, &block
|
45
|
+
|
46
|
+
if authenticated? && Authenticate.configuration.rotate_csrf_on_sign_in?
|
47
|
+
session.delete(:_csrf_token)
|
48
|
+
form_authenticity_token
|
49
|
+
end
|
45
50
|
end
|
46
51
|
|
47
52
|
# Log the user out. Typically used in session controller.
|
@@ -158,26 +163,19 @@ module Authenticate
|
|
158
163
|
|
159
164
|
private
|
160
165
|
|
161
|
-
# Write location to return to in
|
166
|
+
# Write location to return to in user's session (normally a cookie).
|
162
167
|
def store_location
|
163
168
|
if request.get?
|
164
|
-
|
165
|
-
expires: nil,
|
166
|
-
httponly: true,
|
167
|
-
path: nil,
|
168
|
-
secure: Authenticate.configuration.secure_cookie,
|
169
|
-
value: request.original_fullpath
|
170
|
-
}
|
171
|
-
cookies[:authenticate_return_to] = value
|
169
|
+
session[:authenticate_return_to] = request.original_fullpath
|
172
170
|
end
|
173
171
|
end
|
174
172
|
|
175
173
|
def stored_location
|
176
|
-
|
174
|
+
session[:authenticate_return_to]
|
177
175
|
end
|
178
176
|
|
179
177
|
def clear_stored_location
|
180
|
-
|
178
|
+
session[:authenticate_return_to] = nil
|
181
179
|
end
|
182
180
|
|
183
181
|
def authenticate_session
|
data/lib/authenticate/version.rb
CHANGED
@@ -1,19 +1,20 @@
|
|
1
1
|
Authenticate.configure do |config|
|
2
|
-
|
2
|
+
config.rotate_csrf_on_sign_in = true
|
3
3
|
|
4
|
+
# config.user_model = 'User'
|
4
5
|
# config.cookie_name = 'authenticate_session_token'
|
5
6
|
# config.cookie_expiration = { 1.month.from_now.utc }
|
6
7
|
# config.cookie_domain = nil
|
7
8
|
# config.cookie_path = '/'
|
8
9
|
# config.secure_cookie = false # set to true in production https environments
|
9
10
|
# config.cookie_http_only = false # set to true if you can
|
10
|
-
|
11
11
|
# config.mailer_sender = 'reply@example.com'
|
12
12
|
# config.crypto_provider = Authenticate::Model::BCrypt
|
13
13
|
# config.timeout_in = 45.minutes
|
14
14
|
# config.max_session_lifetime = 8.hours
|
15
15
|
# config.max_consecutive_bad_logins_allowed = 4
|
16
16
|
# config.bad_login_lockout_period = 10.minutes
|
17
|
+
# config.password_length = 8..128
|
17
18
|
# config.authentication_strategy = :email
|
18
19
|
# config.redirect_url = '/'
|
19
20
|
# config.allow_sign_up = true
|