devise_token_auth 1.1.0 → 1.1.1

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of devise_token_auth might be problematic. Click here for more details.

Files changed (40) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -0
  3. data/app/controllers/devise_token_auth/concerns/set_user_by_token.rb +26 -29
  4. data/app/controllers/devise_token_auth/confirmations_controller.rb +54 -7
  5. data/app/controllers/devise_token_auth/omniauth_callbacks_controller.rb +7 -7
  6. data/app/controllers/devise_token_auth/passwords_controller.rb +4 -4
  7. data/app/controllers/devise_token_auth/registrations_controller.rb +2 -2
  8. data/app/controllers/devise_token_auth/sessions_controller.rb +5 -5
  9. data/app/controllers/devise_token_auth/unlocks_controller.rb +3 -3
  10. data/app/models/devise_token_auth/concerns/active_record_support.rb +3 -21
  11. data/app/models/devise_token_auth/concerns/tokens_serialization.rb +19 -0
  12. data/app/models/devise_token_auth/concerns/user.rb +36 -45
  13. data/app/models/devise_token_auth/concerns/user_omniauth_callbacks.rb +1 -1
  14. data/app/validators/{devise_token_auth/email_validator.rb → devise_token_auth_email_validator.rb} +1 -1
  15. data/config/locales/en.yml +5 -0
  16. data/lib/devise_token_auth.rb +1 -0
  17. data/lib/devise_token_auth/engine.rb +2 -0
  18. data/lib/devise_token_auth/rails/routes.rb +1 -1
  19. data/lib/devise_token_auth/token_factory.rb +126 -0
  20. data/lib/devise_token_auth/version.rb +1 -1
  21. data/lib/generators/devise_token_auth/templates/devise_token_auth.rb +5 -0
  22. data/test/controllers/demo_user_controller_test.rb +2 -2
  23. data/test/controllers/devise_token_auth/confirmations_controller_test.rb +39 -0
  24. data/test/dummy/app/controllers/overrides/confirmations_controller.rb +3 -3
  25. data/test/dummy/app/controllers/overrides/passwords_controller.rb +3 -3
  26. data/test/dummy/app/controllers/overrides/registrations_controller.rb +1 -1
  27. data/test/dummy/app/controllers/overrides/sessions_controller.rb +1 -1
  28. data/test/dummy/config/initializers/devise.rb +275 -2
  29. data/test/dummy/config/initializers/devise_token_auth.rb +35 -4
  30. data/test/dummy/tmp/generators/app/views/devise/mailer/confirmation_instructions.html.erb +5 -0
  31. data/test/dummy/tmp/generators/app/views/devise/mailer/reset_password_instructions.html.erb +8 -0
  32. data/test/factories/users.rb +1 -1
  33. data/test/lib/devise_token_auth/token_factory_test.rb +191 -0
  34. data/test/models/concerns/tokens_serialization_test.rb +70 -0
  35. data/test/models/user_test.rb +0 -32
  36. metadata +29 -13
  37. data/test/dummy/tmp/generators/app/models/azpire/v1/human_resource/user.rb +0 -9
  38. data/test/dummy/tmp/generators/config/initializers/devise_token_auth.rb +0 -50
  39. data/test/dummy/tmp/generators/config/routes.rb +0 -4
  40. data/test/dummy/tmp/generators/db/migrate/20190112150327_devise_token_auth_create_azpire_v1_human_resource_users.rb +0 -56
@@ -5,7 +5,7 @@ module DeviseTokenAuth::Concerns::UserOmniauthCallbacks
5
5
 
6
6
  included do
7
7
  validates :email, presence: true,if: :email_provider?
8
- validates :email, 'devise_token_auth/email' => true, allow_nil: true, allow_blank: true, if: :email_provider?
8
+ validates :email, :devise_token_auth_email => true, allow_nil: true, allow_blank: true, if: :email_provider?
9
9
  validates_presence_of :uid, unless: :email_provider?
10
10
 
11
11
  # only validate unique emails among email registration users
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- class DeviseTokenAuth::EmailValidator < ActiveModel::EachValidator
3
+ class DeviseTokenAuthEmailValidator < ActiveModel::EachValidator
4
4
  def validate_each(record, attribute, value)
5
5
  unless value =~ /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z/i
6
6
  record.errors[attribute] << email_invalid_message
@@ -27,6 +27,11 @@ en:
27
27
  missing_email: "You must provide an email address."
28
28
  sended: "An email has been sent to '%{email}' containing instructions for unlocking your account."
29
29
  user_not_found: "Unable to find user with email '%{email}'."
30
+ confirmations:
31
+ sended: "An email has been sent to '%{email}' containing instructions for confirming your account."
32
+ user_not_found: "Unable to find user with email '%{email}'."
33
+ missing_email: "You must provide an email address."
34
+
30
35
  errors:
31
36
  messages:
32
37
  validate_sign_up_params: "Please submit proper sign up data in request body."
@@ -11,3 +11,4 @@ require 'devise_token_auth/controllers/url_helpers'
11
11
  require 'devise_token_auth/url'
12
12
  require 'devise_token_auth/errors'
13
13
  require 'devise_token_auth/blacklist'
14
+ require 'devise_token_auth/token_factory'
@@ -14,6 +14,7 @@ module DeviseTokenAuth
14
14
  mattr_accessor :change_headers_on_each_request,
15
15
  :max_number_of_devices,
16
16
  :token_lifespan,
17
+ :token_cost,
17
18
  :batch_request_buffer_throttle,
18
19
  :omniauth_prefix,
19
20
  :default_confirm_success_url,
@@ -29,6 +30,7 @@ module DeviseTokenAuth
29
30
  self.change_headers_on_each_request = true
30
31
  self.max_number_of_devices = 10
31
32
  self.token_lifespan = 2.weeks
33
+ self.token_cost = 10
32
34
  self.batch_request_buffer_throttle = 5.seconds
33
35
  self.omniauth_prefix = '/omniauth'
34
36
  self.default_confirm_success_url = nil
@@ -56,7 +56,7 @@ module ActionDispatch::Routing
56
56
 
57
57
  devise_scope mapping_name.to_sym do
58
58
  # path to verify token validity
59
- get "#{full_path}/validate_token", controller: token_validations_ctrl.to_s, action: 'validate_token'
59
+ get "#{full_path}/validate_token", controller: token_validations_ctrl.to_s, action: 'validate_token' if !opts[:skip].include?(:token_validations)
60
60
 
61
61
  # omniauth routes. only define if omniauth is installed and not skipped.
62
62
  if defined?(::OmniAuth) && !opts[:skip].include?(:omniauth_callbacks)
@@ -0,0 +1,126 @@
1
+ require 'bcrypt'
2
+
3
+ module DeviseTokenAuth
4
+ # A token management factory which allow generate token objects and check them.
5
+ module TokenFactory
6
+ # For BCrypt::Password class see:
7
+ # https://github.com/codahale/bcrypt-ruby/blob/master/lib/bcrypt/password.rb
8
+
9
+ # Creates a token instance. Takes an optional client, lifespan and cost options.
10
+ # Example:
11
+ # DeviseTokenAuth::TokenFactory.create
12
+ # => #<struct DeviseTokenAuth::TokenFactory::Token client="tElcgkdZ7f9XEa0unZhrYQ", token="rAMcWOs0-mGHFMnIgJD2cA", token_hash="$2a$10$wrsdlHVRGlYW11wfImxU..jr0Ux3bHo/qbXcSfgp8zmvVUNHosita", expiry=1518982690>
13
+ #
14
+ # DeviseTokenAuth::TokenFactory.create(lifespan: 10, cost: 4)
15
+ # => #<struct DeviseTokenAuth::TokenFactory::Token client="5qleT7_t9JPVcX9xmxkVYA", token="RBXX43u4xXNSO-fr2N_4pA", token_hash="$2a$04$9gpCaoFbu2dUKxU3qiTgluHX7jj9UzS.jq1QW0EkQmoaxARo1WxTy", expiry=1517773268>
16
+ def self.create(client: nil, lifespan: nil, cost: nil)
17
+ # obj_client = client.nil? ? client() : client
18
+ obj_client = client || client()
19
+ obj_token = token
20
+ obj_token_hash = token_hash(obj_token, cost)
21
+ obj_expiry = expiry(lifespan)
22
+
23
+ Token.new(obj_client, obj_token, obj_token_hash, obj_expiry)
24
+ end
25
+
26
+ # Generates a random URL-safe client.
27
+ # Example:
28
+ # DeviseTokenAuth::TokenFactory.client
29
+ # => "zNf0pNP5iGfuBItZJGCseQ"
30
+ def self.client
31
+ secure_string
32
+ end
33
+
34
+ # Generates a random URL-safe token.
35
+ # Example:
36
+ # DeviseTokenAuth::TokenFactory.token
37
+ # => "6Bqs4K9x8ChLmZogvruF3A"
38
+ def self.token
39
+ secure_string
40
+ end
41
+
42
+ # Returns token hash for a token with given cost. If no cost value is specified,
43
+ # the default value is used. The possible cost value is within range from 4 to 31.
44
+ # It is recommended to not use a value more than 10.
45
+ # Example:
46
+ # DeviseTokenAuth::TokenFactory.token_hash("_qxAxmc-biQLiYRHsmwd5Q")
47
+ # => "$2a$10$6/cTAtQ3CBLfpkeHW7dlt.PD2aVCbFRN5vDDJUUhGsZ6pzYFlh4Me"
48
+ #
49
+ # DeviseTokenAuth::TokenFactory.token_hash("_qxAxmc-biQLiYRHsmwd5Q", 4)
50
+ # => "$2a$04$RkIrosbdRtuet2eUk3si8eS4ufeNpiPc/rSSsfpniRK8ogM5YFOWS"
51
+ def self.token_hash(token, cost = nil)
52
+ cost ||= DeviseTokenAuth.token_cost
53
+ BCrypt::Password.create(token, cost: cost)
54
+ end
55
+
56
+ # Returns the value of time as an integer number of seconds. Takes one argument.
57
+ # Example:
58
+ # DeviseTokenAuth::TokenFactory.expiry
59
+ # => 1518983359
60
+ # DeviseTokenAuth::TokenFactory.expiry(10)
61
+ # => 1517773781
62
+ def self.expiry(lifespan = nil)
63
+ lifespan ||= DeviseTokenAuth.token_lifespan
64
+ (Time.zone.now + lifespan).to_i
65
+ end
66
+
67
+ # Generates a random URL-safe string.
68
+ # Example:
69
+ # DeviseTokenAuth::TokenFactory.secure_string
70
+ # => "ADBoIaqXsEDnxIpOuumrTA"
71
+ def self.secure_string
72
+ # https://ruby-doc.org/stdlib-2.5.0/libdoc/securerandom/rdoc/Random/Formatter.html#method-i-urlsafe_base64
73
+ SecureRandom.urlsafe_base64
74
+ end
75
+
76
+ # Returns true if token hash is a valid token hash.
77
+ # Example:
78
+ # token_hash = "$2a$10$ArjX0tskRIa5Z/Tmapy59OCiAXLStfhrCiaDz.8fCb6hnX1gJ0p/2"
79
+ # DeviseTokenAuth::TokenFactory.valid_token_hash?(token_hash)
80
+ # => true
81
+ def self.valid_token_hash?(token_hash)
82
+ !!BCrypt::Password.valid_hash?(token_hash)
83
+ end
84
+
85
+ # Compares a potential token against the token hash. Returns true if the token is the original token, false otherwise.
86
+ # Example:
87
+ # token = "4wZ9gcc900rMQD1McpcSNA"
88
+ # token_hash = "$2a$10$ArjX0tskRIa5Z/Tmapy59OCiAXLStfhrCiaDz.8fCb6hnX1gJ0p/2"
89
+ # DeviseTokenAuth::TokenFactory.token_hash_is_token?(token_hash, token)
90
+ # => true
91
+ def self.token_hash_is_token?(token_hash, token)
92
+ BCrypt::Password.new(token_hash).is_password?(token)
93
+ rescue StandardError
94
+ false
95
+ end
96
+
97
+ # Creates a token instance with instance variables equal nil.
98
+ # Example:
99
+ # DeviseTokenAuth::TokenFactory.new
100
+ # => #<struct DeviseTokenAuth::TokenFactory::Token client=nil, token=nil, token_hash=nil, expiry=nil>
101
+ def self.new
102
+ Token.new
103
+ end
104
+
105
+ Token = Struct.new(:client, :token, :token_hash, :expiry) do
106
+ # Sets all instance variables of the token to nil. It is faster than creating new empty token.
107
+ # Example:
108
+ # token.clear!
109
+ # => true
110
+ # token
111
+ # => #<struct DeviseTokenAuth::TokenFactory::Token client=nil, token=nil, token_hash=nil, expiry=nil>
112
+ def clear!
113
+ size.times { |i| self[i] = nil }
114
+ true
115
+ end
116
+
117
+ # Checks token attribute presence
118
+ # Example:
119
+ # token.present?
120
+ # => true
121
+ def present?
122
+ token.present?
123
+ end
124
+ end
125
+ end
126
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module DeviseTokenAuth
4
- VERSION = '1.1.0'.freeze
4
+ VERSION = '1.1.1'.freeze
5
5
  end
@@ -11,6 +11,11 @@ DeviseTokenAuth.setup do |config|
11
11
  # determines how long tokens will remain valid after they are issued.
12
12
  # config.token_lifespan = 2.weeks
13
13
 
14
+ # Limiting the token_cost to just 4 in testing will increase the performance of
15
+ # your test suite dramatically. The possible cost value is within range from 4
16
+ # to 31. It is recommended to not use a value more than 10 in other environments.
17
+ config.token_cost = Rails.env.test? ? 4 : 10
18
+
14
19
  # Sets the max number of concurrent devices per user, which is 10 by default.
15
20
  # After this limit is reached, the oldest tokens will be removed.
16
21
  # config.max_number_of_devices = 10
@@ -321,8 +321,8 @@ class DemoUserControllerTest < ActionDispatch::IntegrationTest
321
321
  assert @resource.tokens.count > 1
322
322
 
323
323
  # password changed from new device
324
- @resource.update_attributes(password: 'newsecret123',
325
- password_confirmation: 'newsecret123')
324
+ @resource.update(password: 'newsecret123',
325
+ password_confirmation: 'newsecret123')
326
326
 
327
327
  get '/demo/members_only',
328
328
  params: {},
@@ -86,6 +86,33 @@ class DeviseTokenAuth::ConfirmationsControllerTest < ActionController::TestCase
86
86
  assert response.body.include?('account_confirmation_success')
87
87
  end
88
88
  end
89
+
90
+ describe 'resend confirmation' do
91
+ before do
92
+ post :create,
93
+ params: { email: @new_user.email,
94
+ redirect_url: @redirect_url },
95
+ xhr: true
96
+ @resource = assigns(:resource)
97
+
98
+ @mail = ActionMailer::Base.deliveries.last
99
+ @token, @client_config = token_and_client_config_from(@mail.body)
100
+ end
101
+
102
+ test 'user should not be confirmed' do
103
+ assert_nil @resource.confirmed_at
104
+ end
105
+
106
+ test 'should generate raw token' do
107
+ assert @token
108
+ assert_equal @new_user.confirmation_token, @token
109
+ end
110
+
111
+ test 'user should receive confirmation email' do
112
+ assert_equal @resource.email, @mail['to'].to_s
113
+ end
114
+
115
+ end
89
116
  end
90
117
 
91
118
  describe 'failure' do
@@ -96,6 +123,18 @@ class DeviseTokenAuth::ConfirmationsControllerTest < ActionController::TestCase
96
123
  @resource = assigns(:resource)
97
124
  refute @resource.confirmed?
98
125
  end
126
+
127
+ test 'request resend confirmation without email' do
128
+ post :create, params: { email: nil }, xhr: true
129
+
130
+ assert_equal 401, response.status
131
+ end
132
+
133
+ test 'user should not be found on resend confirmation request' do
134
+ post :create, params: { email: 'bogus' }, xhr: true
135
+
136
+ assert_equal 404, response.status
137
+ end
99
138
  end
100
139
  end
101
140
 
@@ -6,7 +6,7 @@ module Overrides
6
6
  @resource = resource_class.confirm_by_token(params[:confirmation_token])
7
7
 
8
8
  if @resource && @resource.id
9
- client_id, token = @resource.create_token
9
+ token = @resource.create_token
10
10
  @resource.save!
11
11
 
12
12
  redirect_header_options = {
@@ -14,8 +14,8 @@ module Overrides
14
14
  config: params[:config],
15
15
  override_proof: '(^^,)'
16
16
  }
17
- redirect_headers = build_redirect_headers(token,
18
- client_id,
17
+ redirect_headers = build_redirect_headers(token.token,
18
+ token.client,
19
19
  redirect_header_options)
20
20
 
21
21
  redirect_to(@resource.build_auth_url(params[:redirect_url],
@@ -11,7 +11,7 @@ module Overrides
11
11
  )
12
12
 
13
13
  if @resource && @resource.id
14
- client_id, token = @resource.create_token
14
+ token = @resource.create_token
15
15
 
16
16
  # ensure that user is confirmed
17
17
  @resource.skip_confirmation! unless @resource.confirmed_at
@@ -22,8 +22,8 @@ module Overrides
22
22
  override_proof: OVERRIDE_PROOF,
23
23
  reset_password: true
24
24
  }
25
- redirect_headers = build_redirect_headers(token,
26
- client_id,
25
+ redirect_headers = build_redirect_headers(token.token,
26
+ token.client,
27
27
  redirect_header_options)
28
28
  redirect_to(@resource.build_auth_url(params[:redirect_url],
29
29
  redirect_headers))
@@ -6,7 +6,7 @@ module Overrides
6
6
 
7
7
  def update
8
8
  if @resource
9
- if @resource.update_attributes(account_update_params)
9
+ if @resource.update(account_update_params)
10
10
  render json: {
11
11
  status: 'success',
12
12
  data: @resource.as_json,
@@ -8,7 +8,7 @@ module Overrides
8
8
  @resource = resource_class.dta_find_by(email: resource_params[:email])
9
9
 
10
10
  if @resource && valid_params?(:email, resource_params[:email]) && @resource.valid_password?(resource_params[:password]) && @resource.confirmed?
11
- @client_id, @token = @resource.create_token
11
+ @token = @resource.create_token
12
12
  @resource.save
13
13
 
14
14
  render json: {
@@ -1,17 +1,290 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ # Use this hook to configure devise mailer, warden hooks and so forth.
4
+ # Many of these configuration options can be set straight in your model.
3
5
  Devise.setup do |config|
4
- config.authentication_keys = [:email, :nickname]
6
+ # The secret key used by Devise. Devise uses this key to generate
7
+ # random tokens. Changing this key will render invalid all existing
8
+ # confirmation, reset password and unlock tokens in the database.
9
+ # Devise will use the `secret_key_base` as its `secret_key`
10
+ # by default. You can change it below and use your own secret key.
11
+ # config.secret_key = '981f041712ce247008f46fec55e5d3e7fea904bd1601412a5810c74af3f1d9c33399bc34405b85a78dac04c9fb017270e691305b3ddb073f93578df124538e89'
12
+
13
+ # ==> Controller configuration
14
+ # Configure the parent class to the devise controllers.
15
+ # config.parent_controller = 'DeviseController'
5
16
 
6
17
  # ==> Mailer Configuration
7
18
  # Configure the e-mail address which will be shown in Devise::Mailer,
8
19
  # note that it will be overwritten if you use your own mailer class
9
20
  # with default "from" parameter.
10
- config.mailer_sender = 'no-reply@example.com'
21
+ config.mailer_sender = 'please-change-me-at-config-initializers-devise@example.com'
22
+
23
+ # Configure the class responsible to send e-mails.
24
+ # config.mailer = 'Devise::Mailer'
25
+
26
+ # Configure the parent class responsible to send e-mails.
27
+ # config.parent_mailer = 'ActionMailer::Base'
11
28
 
12
29
  # ==> ORM configuration
13
30
  # Load and configure the ORM. Supports :active_record (default) and
14
31
  # :mongoid (bson_ext recommended) by default. Other ORMs may be
15
32
  # available as additional gems.
16
33
  require "devise/orm/#{DEVISE_TOKEN_AUTH_ORM}"
34
+
35
+ # ==> Configuration for any authentication mechanism
36
+ # Configure which keys are used when authenticating a user. The default is
37
+ # just :email. You can configure it to use [:username, :subdomain], so for
38
+ # authenticating a user, both parameters are required. Remember that those
39
+ # parameters are used only when authenticating and not when retrieving from
40
+ # session. If you need permissions, you should implement that in a before filter.
41
+ # You can also supply a hash where the value is a boolean determining whether
42
+ # or not authentication should be aborted when the value is not present.
43
+ config.authentication_keys = [:email, :nickname]
44
+
45
+ # Configure parameters from the request object used for authentication. Each entry
46
+ # given should be a request method and it will automatically be passed to the
47
+ # find_for_authentication method and considered in your model lookup. For instance,
48
+ # if you set :request_keys to [:subdomain], :subdomain will be used on authentication.
49
+ # The same considerations mentioned for authentication_keys also apply to request_keys.
50
+ # config.request_keys = []
51
+
52
+ # Configure which authentication keys should be case-insensitive.
53
+ # These keys will be downcased upon creating or modifying a user and when used
54
+ # to authenticate or find a user. Default is :email.
55
+ config.case_insensitive_keys = [:email]
56
+
57
+ # Configure which authentication keys should have whitespace stripped.
58
+ # These keys will have whitespace before and after removed upon creating or
59
+ # modifying a user and when used to authenticate or find a user. Default is :email.
60
+ config.strip_whitespace_keys = [:email]
61
+
62
+ # Tell if authentication through request.params is enabled. True by default.
63
+ # It can be set to an array that will enable params authentication only for the
64
+ # given strategies, for example, `config.params_authenticatable = [:database]` will
65
+ # enable it only for database (email + password) authentication.
66
+ # config.params_authenticatable = true
67
+
68
+ # Tell if authentication through HTTP Auth is enabled. False by default.
69
+ # It can be set to an array that will enable http authentication only for the
70
+ # given strategies, for example, `config.http_authenticatable = [:database]` will
71
+ # enable it only for database authentication. The supported strategies are:
72
+ # :database = Support basic authentication with authentication key + password
73
+ # config.http_authenticatable = false
74
+
75
+ # If 401 status code should be returned for AJAX requests. True by default.
76
+ # config.http_authenticatable_on_xhr = true
77
+
78
+ # The realm used in Http Basic Authentication. 'Application' by default.
79
+ # config.http_authentication_realm = 'Application'
80
+
81
+ # It will change confirmation, password recovery and other workflows
82
+ # to behave the same regardless if the e-mail provided was right or wrong.
83
+ # Does not affect registerable.
84
+ # config.paranoid = true
85
+
86
+ # By default Devise will store the user in session. You can skip storage for
87
+ # particular strategies by setting this option.
88
+ # Notice that if you are skipping storage for all authentication paths, you
89
+ # may want to disable generating routes to Devise's sessions controller by
90
+ # passing skip: :sessions to `devise_for` in your config/routes.rb
91
+ config.skip_session_storage = [:http_auth]
92
+
93
+ # By default, Devise cleans up the CSRF token on authentication to
94
+ # avoid CSRF token fixation attacks. This means that, when using AJAX
95
+ # requests for sign in and sign up, you need to get a new CSRF token
96
+ # from the server. You can disable this option at your own risk.
97
+ # config.clean_up_csrf_token_on_authentication = true
98
+
99
+ # When false, Devise will not attempt to reload routes on eager load.
100
+ # This can reduce the time taken to boot the app but if your application
101
+ # requires the Devise mappings to be loaded during boot time the application
102
+ # won't boot properly.
103
+ # config.reload_routes = true
104
+
105
+ # ==> Configuration for :database_authenticatable
106
+ # For bcrypt, this is the cost for hashing the password and defaults to 11. If
107
+ # using other algorithms, it sets how many times you want the password to be hashed.
108
+ #
109
+ # Limiting the stretches to just one in testing will increase the performance of
110
+ # your test suite dramatically. However, it is STRONGLY RECOMMENDED to not use
111
+ # a value less than 10 in other environments. Note that, for bcrypt (the default
112
+ # algorithm), the cost increases exponentially with the number of stretches (e.g.
113
+ # a value of 20 is already extremely slow: approx. 60 seconds for 1 calculation).
114
+ config.stretches = Rails.env.test? ? 1 : 11
115
+
116
+ # Set up a pepper to generate the hashed password.
117
+ # config.pepper = 'ced2d580bc6502ee4c7c70eb54499e72c04430932a791b1ec4694f7ebecafec05f487517c2f7337a4757e67bcc74fa957d23d89b1ea61cfb48a8ebe31c8dade1'
118
+
119
+ # Send a notification to the original email when the user's email is changed.
120
+ # config.send_email_changed_notification = false
121
+
122
+ # Send a notification email when the user's password is changed.
123
+ # config.send_password_change_notification = false
124
+
125
+ # ==> Configuration for :confirmable
126
+ # A period that the user is allowed to access the website even without
127
+ # confirming their account. For instance, if set to 2.days, the user will be
128
+ # able to access the website for two days without confirming their account,
129
+ # access will be blocked just in the third day. Default is 0.days, meaning
130
+ # the user cannot access the website without confirming their account.
131
+ # config.allow_unconfirmed_access_for = 2.days
132
+
133
+ # A period that the user is allowed to confirm their account before their
134
+ # token becomes invalid. For example, if set to 3.days, the user can confirm
135
+ # their account within 3 days after the mail was sent, but on the fourth day
136
+ # their account can't be confirmed with the token any more.
137
+ # Default is nil, meaning there is no restriction on how long a user can take
138
+ # before confirming their account.
139
+ # config.confirm_within = 3.days
140
+
141
+ # If true, requires any email changes to be confirmed (exactly the same way as
142
+ # initial account confirmation) to be applied. Requires additional unconfirmed_email
143
+ # db field (see migrations). Until confirmed, new email is stored in
144
+ # unconfirmed_email column, and copied to email column on successful confirmation.
145
+ config.reconfirmable = true
146
+
147
+ # Defines which key will be used when confirming an account
148
+ # config.confirmation_keys = [:email]
149
+
150
+ # ==> Configuration for :rememberable
151
+ # The time the user will be remembered without asking for credentials again.
152
+ # config.remember_for = 2.weeks
153
+
154
+ # Invalidates all the remember me tokens when the user signs out.
155
+ config.expire_all_remember_me_on_sign_out = true
156
+
157
+ # If true, extends the user's remember period when remembered via cookie.
158
+ # config.extend_remember_period = false
159
+
160
+ # Options to be passed to the created cookie. For instance, you can set
161
+ # secure: true in order to force SSL only cookies.
162
+ # config.rememberable_options = {}
163
+
164
+ # ==> Configuration for :validatable
165
+ # Range for password length.
166
+ config.password_length = 6..128
167
+
168
+ # Email regex used to validate email formats. It simply asserts that
169
+ # one (and only one) @ exists in the given string. This is mainly
170
+ # to give user feedback and not to assert the e-mail validity.
171
+ config.email_regexp = /\A[^@\s]+@[^@\s]+\z/
172
+
173
+ # ==> Configuration for :timeoutable
174
+ # The time you want to timeout the user session without activity. After this
175
+ # time the user will be asked for credentials again. Default is 30 minutes.
176
+ # config.timeout_in = 30.minutes
177
+
178
+ # ==> Configuration for :lockable
179
+ # Defines which strategy will be used to lock an account.
180
+ # :failed_attempts = Locks an account after a number of failed attempts to sign in.
181
+ # :none = No lock strategy. You should handle locking by yourself.
182
+ # config.lock_strategy = :failed_attempts
183
+
184
+ # Defines which key will be used when locking and unlocking an account
185
+ # config.unlock_keys = [:email]
186
+
187
+ # Defines which strategy will be used to unlock an account.
188
+ # :email = Sends an unlock link to the user email
189
+ # :time = Re-enables login after a certain amount of time (see :unlock_in below)
190
+ # :both = Enables both strategies
191
+ # :none = No unlock strategy. You should handle unlocking by yourself.
192
+ # config.unlock_strategy = :both
193
+
194
+ # Number of authentication tries before locking an account if lock_strategy
195
+ # is failed attempts.
196
+ # config.maximum_attempts = 20
197
+
198
+ # Time interval to unlock the account if :time is enabled as unlock_strategy.
199
+ # config.unlock_in = 1.hour
200
+
201
+ # Warn on the last attempt before the account is locked.
202
+ # config.last_attempt_warning = true
203
+
204
+ # ==> Configuration for :recoverable
205
+ #
206
+ # Defines which key will be used when recovering the password for an account
207
+ # config.reset_password_keys = [:email]
208
+
209
+ # Time interval you can reset your password with a reset password key.
210
+ # Don't put a too small interval or your users won't have the time to
211
+ # change their passwords.
212
+ config.reset_password_within = 6.hours
213
+
214
+ # When set to false, does not sign a user in automatically after their password is
215
+ # reset. Defaults to true, so a user is signed in automatically after a reset.
216
+ # config.sign_in_after_reset_password = true
217
+
218
+ # ==> Configuration for :encryptable
219
+ # Allow you to use another hashing or encryption algorithm besides bcrypt (default).
220
+ # You can use :sha1, :sha512 or algorithms from others authentication tools as
221
+ # :clearance_sha1, :authlogic_sha512 (then you should set stretches above to 20
222
+ # for default behavior) and :restful_authentication_sha1 (then you should set
223
+ # stretches to 10, and copy REST_AUTH_SITE_KEY to pepper).
224
+ #
225
+ # Require the `devise-encryptable` gem when using anything other than bcrypt
226
+ # config.encryptor = :sha512
227
+
228
+ # ==> Scopes configuration
229
+ # Turn scoped views on. Before rendering "sessions/new", it will first check for
230
+ # "users/sessions/new". It's turned off by default because it's slower if you
231
+ # are using only default views.
232
+ # config.scoped_views = false
233
+
234
+ # Configure the default scope given to Warden. By default it's the first
235
+ # devise role declared in your routes (usually :user).
236
+ # config.default_scope = :user
237
+
238
+ # Set this configuration to false if you want /users/sign_out to sign out
239
+ # only the current scope. By default, Devise signs out all scopes.
240
+ # config.sign_out_all_scopes = true
241
+
242
+ # ==> Navigation configuration
243
+ # Lists the formats that should be treated as navigational. Formats like
244
+ # :html, should redirect to the sign in page when the user does not have
245
+ # access, but formats like :xml or :json, should return 401.
246
+ #
247
+ # If you have any extra navigational formats, like :iphone or :mobile, you
248
+ # should add them to the navigational formats lists.
249
+ #
250
+ # The "*/*" below is required to match Internet Explorer requests.
251
+ # config.navigational_formats = ['*/*', :html]
252
+
253
+ # The default HTTP method used to sign out a resource. Default is :delete.
254
+ config.sign_out_via = :delete
255
+
256
+ # ==> OmniAuth
257
+ # Add a new OmniAuth provider. Check the wiki for more information on setting
258
+ # up on your models and hooks.
259
+ # config.omniauth :github, 'APP_ID', 'APP_SECRET', scope: 'user,public_repo'
260
+
261
+ # ==> Warden configuration
262
+ # If you want to use other strategies, that are not supported by Devise, or
263
+ # change the failure app, you can configure them inside the config.warden block.
264
+ #
265
+ # config.warden do |manager|
266
+ # manager.intercept_401 = false
267
+ # manager.default_strategies(scope: :user).unshift :some_external_strategy
268
+ # end
269
+
270
+ # ==> Mountable engine configurations
271
+ # When using Devise inside an engine, let's call it `MyEngine`, and this engine
272
+ # is mountable, there are some extra configurations to be taken into account.
273
+ # The following options are available, assuming the engine is mounted as:
274
+ #
275
+ # mount MyEngine, at: '/my_engine'
276
+ #
277
+ # The router that invoked `devise_for`, in the example above, would be:
278
+ # config.router_name = :my_engine
279
+ #
280
+ # When using OmniAuth, Devise cannot automatically set OmniAuth path,
281
+ # so you need to do it manually. For the users scope, it would be:
282
+ # config.omniauth_path_prefix = '/my_engine/users/auth'
283
+
284
+ # ==> Turbolinks configuration
285
+ # If your app is using Turbolinks, Turbolinks::Controller needs to be included to make redirection work correctly:
286
+ #
287
+ # ActiveSupport.on_load(:devise_failure_app) do
288
+ # include Turbolinks::Controller
289
+ # end
17
290
  end