devise_token_auth 1.1.3 → 1.1.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (39) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/devise_token_auth/confirmations_controller.rb +1 -0
  3. data/app/controllers/devise_token_auth/omniauth_callbacks_controller.rb +2 -1
  4. data/app/models/devise_token_auth/concerns/confirmable_support.rb +27 -0
  5. data/app/models/devise_token_auth/concerns/user.rb +10 -6
  6. data/app/models/devise_token_auth/concerns/user_omniauth_callbacks.rb +1 -1
  7. data/config/locales/ja.yml +1 -1
  8. data/config/locales/ko.yml +51 -0
  9. data/config/locales/pl.yml +4 -3
  10. data/config/locales/pt.yml +4 -3
  11. data/lib/devise_token_auth/engine.rb +2 -0
  12. data/lib/devise_token_auth/url.rb +3 -0
  13. data/lib/devise_token_auth/version.rb +1 -1
  14. data/lib/generators/devise_token_auth/USAGE +1 -1
  15. data/lib/generators/devise_token_auth/install_generator.rb +3 -3
  16. data/lib/generators/devise_token_auth/install_mongoid_generator.rb +2 -2
  17. data/lib/generators/devise_token_auth/templates/devise_token_auth.rb +5 -0
  18. data/lib/generators/devise_token_auth/templates/user.rb.erb +2 -2
  19. data/lib/generators/devise_token_auth/templates/user_mongoid.rb.erb +2 -2
  20. data/test/controllers/devise_token_auth/confirmations_controller_test.rb +4 -0
  21. data/test/dummy/app/active_record/confirmable_user.rb +11 -0
  22. data/test/dummy/app/mongoid/confirmable_user.rb +52 -0
  23. data/test/dummy/config/initializers/figaro.rb +1 -1
  24. data/test/dummy/config/initializers/omniauth.rb +1 -0
  25. data/test/dummy/config/routes.rb +2 -0
  26. data/test/dummy/{tmp/generators/db/migrate/20170630171909_devise_token_auth_create_mangs.rb → db/migrate/20190924101113_devise_token_auth_create_confirmable_users.rb} +9 -14
  27. data/test/dummy/db/schema.rb +26 -1
  28. data/test/dummy/tmp/generators/app/views/devise/mailer/confirmation_instructions.html.erb +5 -0
  29. data/test/dummy/tmp/generators/app/views/devise/mailer/reset_password_instructions.html.erb +8 -0
  30. data/test/factories/users.rb +1 -0
  31. data/test/lib/devise_token_auth/url_test.rb +2 -2
  32. data/test/models/confirmable_user_test.rb +35 -0
  33. data/test/test_helper.rb +1 -1
  34. metadata +32 -16
  35. data/test/dummy/tmp/generators/app/models/mang.rb +0 -7
  36. data/test/dummy/tmp/generators/app/models/user.rb +0 -7
  37. data/test/dummy/tmp/generators/config/initializers/devise_token_auth.rb +0 -48
  38. data/test/dummy/tmp/generators/config/routes.rb +0 -9
  39. data/test/dummy/tmp/generators/db/migrate/20170630171909_devise_token_auth_create_users.rb +0 -54
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9481d98d2610adb862b38d97afadba1d1a58594eab37606522fc0a0700e403b1
4
- data.tar.gz: c9f1900cbabbffebc8fb84091ec35dda733c18f16537b562962f4274c464d680
3
+ metadata.gz: 395c104491ef2762e5c41f0b35af5f2421f8d24c99cc10145231d1cb2cab2d70
4
+ data.tar.gz: c637be9bc9c731f1b6218002925c0e558dbc62f2d6fb999fdd187d31d60e20c4
5
5
  SHA512:
6
- metadata.gz: ea77bdbf1b588b53dfdea504ed37967f3c8dacb7c492a5a741444057de29e2e0443e535a98be60862e2139e6c768389627e438a27838afe2904c77f80c6c31dc
7
- data.tar.gz: 533ee038f53fb8f63f521522468bbf966577d3ab941c3b689c948d45cb1f11524f8738f1bdcc0e48179a11008f123eea5831f1429d4426e847abddf9b5bbcec7
6
+ metadata.gz: a1a184d38110e9157c941f1b5e2b8a0cdd7901702f12c7316a4ffba2b5af239455bddc9c288d8fbbd2c909aadfdfe388283c16abcce1814abf595cfe853e3c51
7
+ data.tar.gz: 7ac1939d622a50f46e9ce3943826b85e67e9457178bba79326c5656f4c8fbacc5205b44828aa4935be4c2c4dc713f68ab1d44b8d7485ced86fa90416769e1431
@@ -13,6 +13,7 @@ module DeviseTokenAuth
13
13
 
14
14
  if signed_in?(resource_name)
15
15
  token = signed_in_resource.create_token
16
+ signed_in_resource.save!
16
17
 
17
18
  redirect_headers = build_redirect_headers(token.token,
18
19
  token.client,
@@ -112,7 +112,8 @@ module DeviseTokenAuth
112
112
 
113
113
  # break out provider attribute assignment for easy method extension
114
114
  def assign_provider_attrs(user, auth_hash)
115
- attrs = auth_hash['info'].slice(*user.attribute_names)
115
+ attrs = auth_hash['info'].to_hash
116
+ attrs = attrs.slice(*user.attribute_names)
116
117
  user.assign_attributes(attrs)
117
118
  end
118
119
 
@@ -0,0 +1,27 @@
1
+ module DeviseTokenAuth::Concerns::ConfirmableSupport
2
+ extend ActiveSupport::Concern
3
+
4
+ included do
5
+ # Override standard devise `postpone_email_change?` method
6
+ # for not to use `will_save_change_to_email?` & `email_changed?` methods.
7
+ def postpone_email_change?
8
+ postpone = self.class.reconfirmable &&
9
+ email_value_in_database != email &&
10
+ !@bypass_confirmation_postpone &&
11
+ self.email.present? &&
12
+ (!@skip_reconfirmation_in_callback || !email_value_in_database.nil?)
13
+ @bypass_confirmation_postpone = false
14
+ postpone
15
+ end
16
+ end
17
+
18
+ protected
19
+
20
+ def email_value_in_database
21
+ if Devise.rails51? && respond_to?(:email_in_database)
22
+ email_in_database
23
+ else
24
+ email_was
25
+ end
26
+ end
27
+ end
@@ -44,6 +44,10 @@ module DeviseTokenAuth::Concerns::User
44
44
  def email_changed?; false; end
45
45
  def will_save_change_to_email?; false; end
46
46
 
47
+ if DeviseTokenAuth.send_confirmation_email && devise_modules.include?(:confirmable)
48
+ include DeviseTokenAuth::Concerns::ConfirmableSupport
49
+ end
50
+
47
51
  def password_required?
48
52
  return false unless provider == 'email'
49
53
  super
@@ -133,17 +137,17 @@ module DeviseTokenAuth::Concerns::User
133
137
  def token_can_be_reused?(token, client)
134
138
  # ghetto HashWithIndifferentAccess
135
139
  updated_at = tokens[client]['updated_at'] || tokens[client][:updated_at]
136
- last_token = tokens[client]['last_token'] || tokens[client][:last_token]
140
+ last_token_hash = tokens[client]['last_token'] || tokens[client][:last_token]
137
141
 
138
142
  return true if (
139
143
  # ensure that the last token and its creation time exist
140
- updated_at && last_token &&
144
+ updated_at && last_token_hash &&
141
145
 
142
146
  # ensure that previous token falls within the batch buffer throttle time of the last request
143
147
  updated_at.to_time > Time.zone.now - DeviseTokenAuth.batch_request_buffer_throttle &&
144
148
 
145
149
  # ensure that the token is valid
146
- DeviseTokenAuth::TokenFactory.valid_token_hash?(last_token)
150
+ DeviseTokenAuth::TokenFactory.token_hash_is_token?(last_token_hash, token)
147
151
  )
148
152
  end
149
153
 
@@ -154,7 +158,7 @@ module DeviseTokenAuth::Concerns::User
154
158
  token = create_token(
155
159
  client: client,
156
160
  last_token: tokens.fetch(client, {})['token'],
157
- updated_at: now
161
+ updated_at: now.to_s(:rfc822)
158
162
  )
159
163
 
160
164
  update_auth_header(token.token, token.client)
@@ -190,7 +194,7 @@ module DeviseTokenAuth::Concerns::User
190
194
  end
191
195
 
192
196
  def extend_batch_buffer(token, client)
193
- tokens[client]['updated_at'] = Time.zone.now
197
+ tokens[client]['updated_at'] = Time.zone.now.to_s(:rfc822)
194
198
  update_auth_header(token, client)
195
199
  end
196
200
 
@@ -214,7 +218,7 @@ module DeviseTokenAuth::Concerns::User
214
218
  end
215
219
 
216
220
  def should_remove_tokens_after_password_reset?
217
- if Rails::VERSION::MAJOR <= 5
221
+ if Rails::VERSION::MAJOR <= 5 ||defined?('Mongoid')
218
222
  encrypted_password_changed? &&
219
223
  DeviseTokenAuth.remove_tokens_after_password_reset
220
224
  else
@@ -9,7 +9,7 @@ module DeviseTokenAuth::Concerns::UserOmniauthCallbacks
9
9
  validates_presence_of :uid, unless: :email_provider?
10
10
 
11
11
  # only validate unique emails among email registration users
12
- validates :email, uniqueness: { scope: :provider }, on: :create, if: :email_provider?
12
+ validates :email, uniqueness: { case_sensitive: false, scope: :provider }, on: :create, if: :email_provider?
13
13
 
14
14
  # keep uid in sync with email
15
15
  before_save :sync_uid
@@ -29,7 +29,7 @@ ja:
29
29
  messages:
30
30
  validate_sign_up_params: "リクエストボディに適切なアカウント新規登録データを送信してください。"
31
31
  validate_account_update_params: "リクエストボディに適切なアカウント更新のデータを送信してください。"
32
- not_email: "はメールアドレスではありません"
32
+ not_email: "は有効ではありません"
33
33
  devise:
34
34
  mailer:
35
35
  confirmation_instructions:
@@ -0,0 +1,51 @@
1
+ ko:
2
+ devise_token_auth:
3
+ sessions:
4
+ not_confirmed: "'%{email}'로 주소 인증 메일을 발송했습니다. 계정을 활성화하기 위해서는 반드시 메일의 안내를 따라야 합니다."
5
+ bad_credentials: "계정 정보가 맞지 않습니다. 다시 시도해 주세요."
6
+ not_supported: "POST /sign_in to sign in을 사용해주세요. GET은 지원하지 않습니다."
7
+ user_not_found: "유저를 찾을 수 없습니다."
8
+ invalid: "계정 정보가 맞지 않습니다."
9
+ registrations:
10
+ missing_confirm_success_url: "'confirm_success_url' 파라미터가 없습니다."
11
+ redirect_url_not_allowed: "'%{redirect_url}' 주소로 리다이렉트는 허용하지 않습니다."
12
+ email_already_exists: "'%{email}'을 사용하는 계정이 이미 있습니다."
13
+ account_with_uid_destroyed: " UID가 '%{uid}'인 계정을 삭제했습니다."
14
+ account_to_destroy_not_found: "삭제할 계정을 찾을 수 없습니다."
15
+ user_not_found: "유저를 찾을 수 없습니다."
16
+ omniauth:
17
+ not_allowed_redirect_url: "'%{redirect_url}' 주소로 리다이렉트는 허용하지 않습니다."
18
+ passwords:
19
+ missing_email: "이메일 주소를 입력해야 합니다."
20
+ missing_redirect_url: "redirect URL이 없습니다."
21
+ not_allowed_redirect_url: "'%{redirect_url}' 주소로 리다이렉트는 허용하지 않습니다."
22
+ sended: "'%{email}'로 비밀번호를 재설정하기 위한 안내 메일을 발송했습니다."
23
+ user_not_found: "'%{email}'을 사용하는 유저를 찾을 수 없습니다."
24
+ password_not_required: "이 계정은 비밀번호가 필요하지 않습니다. '%{provider}'으로 로그인을 진행해 주세요."
25
+ missing_passwords: "비밀번호와 비밀번호 확인 필드를 반드시 입력해야 합니다."
26
+ successfully_updated: "비밀번호를 성공적으로 업데이트 했습니다."
27
+ unlocks:
28
+ missing_email: "이메일 주소를 반드시 입력해야 합니다."
29
+ sended: "'%{email}'로 계정 잠금 해제를 위한 안내 메일을 발송했습니다."
30
+ user_not_found: "'%{email}'을 사용하는 유저를 찾을 수 없습니다."
31
+ errors:
32
+ messages:
33
+ validate_sign_up_params: "요청 값에 알맞은 로그인 데이터를 입력하세요."
34
+ validate_account_update_params: "요청 값에 알맞은 업데이트 데이터를 입력하세요."
35
+ not_email: "이메일이 아닙니다."
36
+ devise:
37
+ mailer:
38
+ confirmation_instructions:
39
+ confirm_link_msg: "아래의 링크를 이용해 계정 인증을 할 수 있습니다."
40
+ confirm_account_link: "본인 계정 인증"
41
+ reset_password_instructions:
42
+ request_reset_link_msg: "누군가 당신의 비밀번호를 변경하는 링크를 요청했으며, 다음의 링크에서 비밀번호 변경이 가능합니다."
43
+ password_change_link: "비밀번호 변경"
44
+ ignore_mail_msg: "비밀번호 변경을 요청하지 않으셨다면 이 메일을 무시하십시오."
45
+ no_changes_msg: "위 링크에 접속하여 새로운 비밀번호를 생성하기 전까지 귀하의 비밀번호는 변경되지 않습니다."
46
+ unlock_instructions:
47
+ account_lock_msg: "로그인 실패 횟수 초과로 귀하의 계정이 잠금 처리되었습니다."
48
+ unlock_link_msg: "계정 잠금을 해제하려면 아래 링크를 클릭하세요."
49
+ unlock_link: "계정 잠금 해제"
50
+ hello: "안녕하세요"
51
+ welcome: "환영합니다"
@@ -26,9 +26,10 @@ pl:
26
26
  missing_passwords: "Musisz wypełnić wszystkie pola z etykietą 'Hasło' oraz 'Potwierdzenie hasła'."
27
27
  successfully_updated: "Twoje hasło zostało zaktualizowane."
28
28
  errors:
29
- validate_sign_up_params: "Proszę dostarczyć odpowiednie dane logowania w ciele zapytania."
30
- validate_account_update_params: "Proszę dostarczyć odpowiednie dane aktualizacji konta w ciele zapytania."
31
- not_email: "nie jest prawidłowym adresem e-mail"
29
+ messages:
30
+ validate_sign_up_params: "Proszę dostarczyć odpowiednie dane logowania w ciele zapytania."
31
+ validate_account_update_params: "Proszę dostarczyć odpowiednie dane aktualizacji konta w ciele zapytania."
32
+ not_email: "nie jest prawidłowym adresem e-mail"
32
33
  devise:
33
34
  mailer:
34
35
  confirmation_instructions:
@@ -26,9 +26,10 @@ pt:
26
26
  missing_passwords: "Preencha a senha e a confirmação de senha."
27
27
  successfully_updated: "Senha atualizada com sucesso."
28
28
  errors:
29
- validate_sign_up_params: "Os dados submetidos na requisição de registo são inválidos."
30
- validate_account_update_params: "Os dados submetidos para atualização de conta são inválidos."
31
- not_email: "não é um e-mail"
29
+ messages:
30
+ validate_sign_up_params: "Os dados submetidos na requisição de registo são inválidos."
31
+ validate_account_update_params: "Os dados submetidos para atualização de conta são inválidos."
32
+ not_email: "não é um e-mail"
32
33
  devise:
33
34
  mailer:
34
35
  confirmation_instructions:
@@ -26,6 +26,7 @@ module DeviseTokenAuth
26
26
  :default_callbacks,
27
27
  :headers_names,
28
28
  :bypass_sign_in,
29
+ :send_confirmation_email,
29
30
  :require_client_password_reset_token
30
31
 
31
32
  self.change_headers_on_each_request = true
@@ -47,6 +48,7 @@ module DeviseTokenAuth
47
48
  'uid': 'uid',
48
49
  'token-type': 'token-type' }
49
50
  self.bypass_sign_in = true
51
+ self.send_confirmation_email = false
50
52
  self.require_client_password_reset_token = false
51
53
 
52
54
  def self.setup(&block)
@@ -11,6 +11,9 @@ module DeviseTokenAuth::Url
11
11
  query = [uri.query, params.to_query].reject(&:blank?).join('&')
12
12
  res += "?#{query}"
13
13
  res += "##{uri.fragment}" if uri.fragment
14
+ # repeat any query params after the fragment to deal with Angular eating any pre fragment query params, used
15
+ # in the reset password redirect url
16
+ res += "?#{query}" if uri.fragment
14
17
 
15
18
  res
16
19
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module DeviseTokenAuth
4
- VERSION = '1.1.3'.freeze
4
+ VERSION = '1.1.4'.freeze
5
5
  end
@@ -8,7 +8,7 @@ Arguments:
8
8
  # 'User'
9
9
  MOUNT_PATH # The path at which to mount the authentication routes. Default is
10
10
  # 'auth'. More detail documentation is here:
11
- # https://github.com/lynndylanhurley/devise_token_auth#usage-tldr
11
+ # https://devise-token-auth.gitbook.io/devise-token-auth/usage
12
12
 
13
13
  Example:
14
14
  rails generate devise_token_auth:install User auth
@@ -75,12 +75,12 @@ module DeviseTokenAuth
75
75
  ActiveRecord::Base.connection.select_value('SELECT VERSION()')
76
76
  end
77
77
 
78
- def rails5?
79
- Rails.version.start_with? '5'
78
+ def rails_5_or_newer?
79
+ Rails::VERSION::MAJOR >= 5
80
80
  end
81
81
 
82
82
  def primary_key_type
83
- primary_key_string if rails5?
83
+ primary_key_string if rails_5_or_newer?
84
84
  end
85
85
 
86
86
  def primary_key_string
@@ -29,9 +29,9 @@ module DeviseTokenAuth
29
29
  field :tokens, type: Hash, default: {}
30
30
 
31
31
  # Include default devise modules. Others available are:
32
- # :confirmable, :lockable, :timeoutable and :omniauthable
32
+ # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
33
33
  devise :database_authenticatable, :registerable,
34
- :recoverable, :rememberable, :trackable, :validatable
34
+ :recoverable, :rememberable, :validatable
35
35
  include DeviseTokenAuth::Concerns::User
36
36
 
37
37
  index({ uid: 1, provider: 1}, { name: 'uid_provider_index', unique: true, background: true })
@@ -52,4 +52,9 @@ DeviseTokenAuth.setup do |config|
52
52
  # If, however, you wish to integrate with legacy Devise authentication, you can
53
53
  # do so by enabling this flag. NOTE: This feature is highly experimental!
54
54
  # config.enable_standard_devise_support = false
55
+
56
+ # By default DeviseTokenAuth will not send confirmation email, even when including
57
+ # devise confirmable module. If you want to use devise confirmable module and
58
+ # send email, set it to true. (This is a setting for compatibility)
59
+ # config.send_confirmation_email = true
55
60
  end
@@ -2,8 +2,8 @@
2
2
 
3
3
  class <%= user_class %> < ActiveRecord::Base
4
4
  # Include default devise modules. Others available are:
5
- # :confirmable, :lockable, :timeoutable and :omniauthable
5
+ # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
6
6
  devise :database_authenticatable, :registerable,
7
- :recoverable, :rememberable, :trackable, :validatable
7
+ :recoverable, :rememberable, :validatable
8
8
  include DeviseTokenAuth::Concerns::User
9
9
  end
@@ -43,9 +43,9 @@ class <%= user_class %>
43
43
  field :tokens, type: Hash, default: {}
44
44
 
45
45
  # Include default devise modules. Others available are:
46
- # :confirmable, :lockable, :timeoutable and :omniauthable
46
+ # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
47
47
  devise :database_authenticatable, :registerable,
48
- :recoverable, :rememberable, :trackable, :validatable
48
+ :recoverable, :rememberable, :validatable
49
49
  include DeviseTokenAuth::Concerns::User
50
50
 
51
51
  index({ email: 1 }, { name: 'email_index', unique: true, background: true })
@@ -53,6 +53,10 @@ class DeviseTokenAuth::ConfirmationsControllerTest < ActionController::TestCase
53
53
  assert @resource.confirmed?
54
54
  end
55
55
 
56
+ test 'should save the authentication token' do
57
+ assert @resource.reload.tokens.present?
58
+ end
59
+
56
60
  test 'should redirect to success url' do
57
61
  assert_redirected_to(/^#{@redirect_url}/)
58
62
  end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ class ConfirmableUser < ActiveRecord::Base
4
+ # Include default devise modules.
5
+ devise :database_authenticatable, :registerable,
6
+ :recoverable, :rememberable,
7
+ :validatable, :confirmable
8
+ DeviseTokenAuth.send_confirmation_email = true
9
+ include DeviseTokenAuth::Concerns::User
10
+ DeviseTokenAuth.send_confirmation_email = false
11
+ end
@@ -0,0 +1,52 @@
1
+ # frozen_string_literal: true
2
+
3
+ class ConfirmableUser
4
+ include Mongoid::Document
5
+ include Mongoid::Timestamps
6
+ include Mongoid::Locker
7
+
8
+ field :locker_locked_at, type: Time
9
+ field :locker_locked_until, type: Time
10
+
11
+ locker locked_at_field: :locker_locked_at,
12
+ locked_until_field: :locker_locked_until
13
+
14
+ ## User Info
15
+ field :name, type: String
16
+ field :nickname, type: String
17
+ field :image, type: String
18
+
19
+ ## Database authenticatable
20
+ field :email, type: String, default: ''
21
+ field :encrypted_password, type: String, default: ''
22
+
23
+ ## Recoverable
24
+ field :reset_password_token, type: String
25
+ field :reset_password_sent_at, type: Time
26
+ field :reset_password_redirect_url, type: String
27
+ field :allow_password_change, type: Boolean, default: false
28
+
29
+ ## Rememberable
30
+ field :remember_created_at, type: Time
31
+
32
+ ## Confirmable
33
+ field :confirmation_token, type: String
34
+ field :confirmed_at, type: Time
35
+ field :confirmation_sent_at, type: Time
36
+ field :unconfirmed_email, type: String # Only if using reconfirmable
37
+
38
+ ## Required
39
+ field :provider, type: String
40
+ field :uid, type: String, default: ''
41
+
42
+ ## Tokens
43
+ field :tokens, type: Hash, default: {}
44
+
45
+ # Include default devise modules.
46
+ devise :database_authenticatable, :registerable,
47
+ :recoverable, :rememberable, :trackable,
48
+ :validatable, :confirmable
49
+ DeviseTokenAuth.send_confirmation_email = true
50
+ include DeviseTokenAuth::Concerns::User
51
+ DeviseTokenAuth.send_confirmation_email = false
52
+ end
@@ -1,3 +1,3 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- #Figaro.require("GITHUB_KEY", "GITHUB_SECRET", "FACEBOOK_KEY", "FACEBOOK_SECRET", "GOOGLE_KEY", "GOOGLE_SECRET")
3
+ #Figaro.require("GITHUB_KEY", "GITHUB_SECRET", "FACEBOOK_KEY", "FACEBOOK_SECRET", "GOOGLE_KEY", "GOOGLE_SECRET", "APPLE_CLIENT_ID", "APPLE_TEAM_ID", "APPLE_KEY", "APPLE_PEM")
@@ -4,6 +4,7 @@ Rails.application.config.middleware.use OmniAuth::Builder do |b|
4
4
  provider :github, ENV['GITHUB_KEY'], ENV['GITHUB_SECRET'], scope: 'email,profile'
5
5
  provider :facebook, ENV['FACEBOOK_KEY'], ENV['FACEBOOK_SECRET']
6
6
  provider :google_oauth2, ENV['GOOGLE_KEY'], ENV['GOOGLE_SECRET']
7
+ provider :apple, ENV['APPLE_CLIENT_ID'], '', { scope: 'email name', team_id: ENV['APPLE_TEAM_ID'], key_id: ENV['APPLE_KEY'], pem: ENV['APPLE_PEM'] }
7
8
  provider :developer,
8
9
  fields: [:first_name, :last_name],
9
10
  uid_field: :last_name
@@ -20,6 +20,8 @@ Rails.application.routes.draw do
20
20
 
21
21
  mount_devise_token_auth_for 'LockableUser', at: 'lockable_user_auth'
22
22
 
23
+ mount_devise_token_auth_for 'ConfirmableUser', at: 'confirmable_user_auth'
24
+
23
25
  # test namespacing
24
26
  namespace :api do
25
27
  scope :v1 do
@@ -1,6 +1,7 @@
1
- class DeviseTokenAuthCreateMangs < ActiveRecord::Migration[4.2]
1
+ class DeviseTokenAuthCreateConfirmableUsers < ActiveRecord::Migration[5.2]
2
2
  def change
3
- create_table(:mangs) do |t|
3
+
4
+ create_table(:confirmable_users) do |t|
4
5
  ## Required
5
6
  t.string :provider, :null => false, :default => "email"
6
7
  t.string :uid, :null => false, :default => ""
@@ -11,17 +12,11 @@ class DeviseTokenAuthCreateMangs < ActiveRecord::Migration[4.2]
11
12
  ## Recoverable
12
13
  t.string :reset_password_token
13
14
  t.datetime :reset_password_sent_at
15
+ t.boolean :allow_password_change, :default => false
14
16
 
15
17
  ## Rememberable
16
18
  t.datetime :remember_created_at
17
19
 
18
- ## Trackable
19
- t.integer :sign_in_count, :default => 0, :null => false
20
- t.datetime :current_sign_in_at
21
- t.datetime :last_sign_in_at
22
- t.string :current_sign_in_ip
23
- t.string :last_sign_in_ip
24
-
25
20
  ## Confirmable
26
21
  t.string :confirmation_token
27
22
  t.datetime :confirmed_at
@@ -45,10 +40,10 @@ class DeviseTokenAuthCreateMangs < ActiveRecord::Migration[4.2]
45
40
  t.timestamps
46
41
  end
47
42
 
48
- add_index :mangs, :email, unique: true
49
- add_index :mangs, [:uid, :provider], unique: true
50
- add_index :mangs, :reset_password_token, unique: true
51
- add_index :mangs, :confirmation_token, unique: true
52
- # add_index :mangs, :unlock_token, unique: true
43
+ add_index :confirmable_users, :email, unique: true
44
+ add_index :confirmable_users, [:uid, :provider], unique: true
45
+ add_index :confirmable_users, :reset_password_token, unique: true
46
+ add_index :confirmable_users, :confirmation_token, unique: true
47
+ # add_index :confirmable_users, :unlock_token, unique: true
53
48
  end
54
49
  end
@@ -10,7 +10,32 @@
10
10
  #
11
11
  # It's strongly recommended that you check this file into your version control system.
12
12
 
13
- ActiveRecord::Schema.define(version: 2016_06_29_184441) do
13
+ ActiveRecord::Schema.define(version: 2019_09_24_101113) do
14
+
15
+ create_table "confirmable_users", force: :cascade do |t|
16
+ t.string "provider", default: "email", null: false
17
+ t.string "uid", default: "", null: false
18
+ t.string "encrypted_password", default: "", null: false
19
+ t.string "reset_password_token"
20
+ t.datetime "reset_password_sent_at"
21
+ t.boolean "allow_password_change", default: false
22
+ t.datetime "remember_created_at"
23
+ t.string "confirmation_token"
24
+ t.datetime "confirmed_at"
25
+ t.datetime "confirmation_sent_at"
26
+ t.string "unconfirmed_email"
27
+ t.string "name"
28
+ t.string "nickname"
29
+ t.string "image"
30
+ t.string "email"
31
+ t.text "tokens"
32
+ t.datetime "created_at", null: false
33
+ t.datetime "updated_at", null: false
34
+ t.index ["confirmation_token"], name: "index_confirmable_users_on_confirmation_token", unique: true
35
+ t.index ["email"], name: "index_confirmable_users_on_email", unique: true
36
+ t.index ["reset_password_token"], name: "index_confirmable_users_on_reset_password_token", unique: true
37
+ t.index ["uid", "provider"], name: "index_confirmable_users_on_uid_and_provider", unique: true
38
+ end
14
39
 
15
40
  create_table "lockable_users", force: :cascade do |t|
16
41
  t.string "provider", null: false
@@ -0,0 +1,5 @@
1
+ <p><%= t(:welcome).capitalize + ' ' + @email %>!</p>
2
+
3
+ <p><%= t '.confirm_link_msg' %> </p>
4
+
5
+ <p><%= link_to t('.confirm_account_link'), confirmation_url(@resource, {confirmation_token: @token, config: message['client-config'].to_s, redirect_url: message['redirect-url']}).html_safe %></p>
@@ -0,0 +1,8 @@
1
+ <p><%= t(:hello).capitalize %> <%= @resource.email %>!</p>
2
+
3
+ <p><%= t '.request_reset_link_msg' %></p>
4
+
5
+ <p><%= link_to t('.password_change_link'), edit_password_url(@resource, reset_password_token: @token, config: message['client-config'].to_s, redirect_url: message['redirect-url'].to_s).html_safe %></p>
6
+
7
+ <p><%= t '.ignore_mail_msg' %></p>
8
+ <p><%= t '.no_changes_msg' %></p>
@@ -36,5 +36,6 @@ FactoryBot.define do
36
36
  factory :mang_user, class: 'Mang'
37
37
  factory :only_email_user, class: 'OnlyEmailUser'
38
38
  factory :scoped_user, class: 'ScopedUser'
39
+ factory :confirmable_user, class: 'ConfirmableUser'
39
40
  end
40
41
  end
@@ -4,10 +4,10 @@ require 'test_helper'
4
4
 
5
5
  class DeviseTokenAuth::UrlTest < ActiveSupport::TestCase
6
6
  describe 'DeviseTokenAuth::Url#generate' do
7
- test 'URI fragment should appear at the end of URL' do
7
+ test 'URI fragment should appear at the end of URL with repeat of query params' do
8
8
  params = { client_id: 123 }
9
9
  url = 'http://example.com#fragment'
10
- assert_equal DeviseTokenAuth::Url.send(:generate, url, params), 'http://example.com?client_id=123#fragment'
10
+ assert_equal DeviseTokenAuth::Url.send(:generate, url, params), 'http://example.com?client_id=123#fragment?client_id=123'
11
11
  end
12
12
 
13
13
  describe 'with existing query params' do
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'test_helper'
4
+
5
+ class ConfirmableUserTest < ActiveSupport::TestCase
6
+ describe ConfirmableUser do
7
+ describe 'creation' do
8
+ test 'email should be saved' do
9
+ @resource = create(:confirmable_user)
10
+ assert @resource.email.present?
11
+ end
12
+ end
13
+
14
+ describe 'updating email' do
15
+ test 'new email should be saved to unconfirmed_email' do
16
+ @resource = create(:confirmable_user, email: 'old_address@example.com')
17
+ @resource.update(email: 'new_address@example.com')
18
+ assert @resource.unconfirmed_email == 'new_address@example.com'
19
+ end
20
+
21
+ test 'old email should be kept in email' do
22
+ @resource = create(:confirmable_user, email: 'old_address@example.com')
23
+ @resource.update(email: 'new_address@example.com')
24
+ assert @resource.email == 'old_address@example.com'
25
+ end
26
+
27
+ test 'confirmation_token should be changed' do
28
+ @resource = create(:confirmable_user, email: 'old_address@example.com')
29
+ old_token = @resource.confirmation_token
30
+ @resource.update(email: 'new_address@example.com')
31
+ assert @resource.confirmation_token != old_token
32
+ end
33
+ end
34
+ end
35
+ end
@@ -46,7 +46,7 @@ class ActiveSupport::TestCase
46
46
 
47
47
  def age_token(user, client_id)
48
48
  if user.tokens[client_id]
49
- user.tokens[client_id]['updated_at'] = Time.zone.now - (DeviseTokenAuth.batch_request_buffer_throttle + 10.seconds)
49
+ user.tokens[client_id]['updated_at'] = (Time.zone.now - (DeviseTokenAuth.batch_request_buffer_throttle + 10.seconds)).to_s(:rfc822)
50
50
  user.save!
51
51
  end
52
52
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: devise_token_auth
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.3
4
+ version: 1.1.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Lynn Hurley
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-09-26 00:00:00.000000000 Z
11
+ date: 2020-06-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -30,6 +30,20 @@ dependencies:
30
30
  - - "<"
31
31
  - !ruby/object:Gem::Version
32
32
  version: '6.1'
33
+ - !ruby/object:Gem::Dependency
34
+ name: sprockets
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - '='
38
+ - !ruby/object:Gem::Version
39
+ version: 3.7.2
40
+ type: :runtime
41
+ prerelease: false
42
+ version_requirements: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - '='
45
+ - !ruby/object:Gem::Version
46
+ version: 3.7.2
33
47
  - !ruby/object:Gem::Dependency
34
48
  name: devise
35
49
  requirement: !ruby/object:Gem::Requirement
@@ -84,14 +98,14 @@ dependencies:
84
98
  requirements:
85
99
  - - "~>"
86
100
  - !ruby/object:Gem::Version
87
- version: 1.3.6
101
+ version: '1.4'
88
102
  type: :development
89
103
  prerelease: false
90
104
  version_requirements: !ruby/object:Gem::Requirement
91
105
  requirements:
92
106
  - - "~>"
93
107
  - !ruby/object:Gem::Version
94
- version: 1.3.6
108
+ version: '1.4'
95
109
  - !ruby/object:Gem::Dependency
96
110
  name: pg
97
111
  requirement: !ruby/object:Gem::Requirement
@@ -175,6 +189,7 @@ files:
175
189
  - app/controllers/devise_token_auth/token_validations_controller.rb
176
190
  - app/controllers/devise_token_auth/unlocks_controller.rb
177
191
  - app/models/devise_token_auth/concerns/active_record_support.rb
192
+ - app/models/devise_token_auth/concerns/confirmable_support.rb
178
193
  - app/models/devise_token_auth/concerns/mongoid_support.rb
179
194
  - app/models/devise_token_auth/concerns/tokens_serialization.rb
180
195
  - app/models/devise_token_auth/concerns/user.rb
@@ -192,6 +207,7 @@ files:
192
207
  - config/locales/he.yml
193
208
  - config/locales/it.yml
194
209
  - config/locales/ja.yml
210
+ - config/locales/ko.yml
195
211
  - config/locales/nl.yml
196
212
  - config/locales/pl.yml
197
213
  - config/locales/pt-BR.yml
@@ -248,6 +264,7 @@ files:
248
264
  - test/controllers/overrides/sessions_controller_test.rb
249
265
  - test/controllers/overrides/token_validations_controller_test.rb
250
266
  - test/dummy/README.rdoc
267
+ - test/dummy/app/active_record/confirmable_user.rb
251
268
  - test/dummy/app/active_record/lockable_user.rb
252
269
  - test/dummy/app/active_record/mang.rb
253
270
  - test/dummy/app/active_record/only_email_user.rb
@@ -274,6 +291,7 @@ files:
274
291
  - test/dummy/app/controllers/overrides/token_validations_controller.rb
275
292
  - test/dummy/app/helpers/application_helper.rb
276
293
  - test/dummy/app/models/concerns/favorite_color.rb
294
+ - test/dummy/app/mongoid/confirmable_user.rb
277
295
  - test/dummy/app/mongoid/lockable_user.rb
278
296
  - test/dummy/app/mongoid/mang.rb
279
297
  - test/dummy/app/mongoid/only_email_user.rb
@@ -313,14 +331,11 @@ files:
313
331
  - test/dummy/db/migrate/20150708104536_devise_token_auth_create_unconfirmable_users.rb
314
332
  - test/dummy/db/migrate/20160103235141_devise_token_auth_create_scoped_users.rb
315
333
  - test/dummy/db/migrate/20160629184441_devise_token_auth_create_lockable_users.rb
334
+ - test/dummy/db/migrate/20190924101113_devise_token_auth_create_confirmable_users.rb
316
335
  - test/dummy/db/schema.rb
317
336
  - test/dummy/lib/migration_database_helper.rb
318
- - test/dummy/tmp/generators/app/models/mang.rb
319
- - test/dummy/tmp/generators/app/models/user.rb
320
- - test/dummy/tmp/generators/config/initializers/devise_token_auth.rb
321
- - test/dummy/tmp/generators/config/routes.rb
322
- - test/dummy/tmp/generators/db/migrate/20170630171909_devise_token_auth_create_mangs.rb
323
- - test/dummy/tmp/generators/db/migrate/20170630171909_devise_token_auth_create_users.rb
337
+ - test/dummy/tmp/generators/app/views/devise/mailer/confirmation_instructions.html.erb
338
+ - test/dummy/tmp/generators/app/views/devise/mailer/reset_password_instructions.html.erb
324
339
  - test/factories/users.rb
325
340
  - test/lib/devise_token_auth/blacklist_test.rb
326
341
  - test/lib/devise_token_auth/token_factory_test.rb
@@ -330,6 +345,7 @@ files:
330
345
  - test/lib/generators/devise_token_auth/install_views_generator_test.rb
331
346
  - test/models/concerns/mongoid_support_test.rb
332
347
  - test/models/concerns/tokens_serialization_test.rb
348
+ - test/models/confirmable_user_test.rb
333
349
  - test/models/only_email_user_test.rb
334
350
  - test/models/user_test.rb
335
351
  - test/support/controllers/routes.rb
@@ -360,6 +376,7 @@ summary: Token based authentication for rails. Uses Devise + OmniAuth.
360
376
  test_files:
361
377
  - test/dummy/app/mongoid/only_email_user.rb
362
378
  - test/dummy/app/mongoid/scoped_user.rb
379
+ - test/dummy/app/mongoid/confirmable_user.rb
363
380
  - test/dummy/app/mongoid/mang.rb
364
381
  - test/dummy/app/mongoid/unregisterable_user.rb
365
382
  - test/dummy/app/mongoid/lockable_user.rb
@@ -368,6 +385,7 @@ test_files:
368
385
  - test/dummy/app/models/concerns/favorite_color.rb
369
386
  - test/dummy/app/active_record/only_email_user.rb
370
387
  - test/dummy/app/active_record/scoped_user.rb
388
+ - test/dummy/app/active_record/confirmable_user.rb
371
389
  - test/dummy/app/active_record/mang.rb
372
390
  - test/dummy/app/active_record/unregisterable_user.rb
373
391
  - test/dummy/app/active_record/lockable_user.rb
@@ -425,14 +443,12 @@ test_files:
425
443
  - test/dummy/db/migrate/20160103235141_devise_token_auth_create_scoped_users.rb
426
444
  - test/dummy/db/migrate/20140715061447_devise_token_auth_create_users.rb
427
445
  - test/dummy/db/migrate/20140715061805_devise_token_auth_create_mangs.rb
428
- - test/dummy/tmp/generators/app/models/mang.rb
429
- - test/dummy/tmp/generators/app/models/user.rb
430
- - test/dummy/tmp/generators/config/routes.rb
431
- - test/dummy/tmp/generators/config/initializers/devise_token_auth.rb
432
- - test/dummy/tmp/generators/db/migrate/20170630171909_devise_token_auth_create_mangs.rb
433
- - test/dummy/tmp/generators/db/migrate/20170630171909_devise_token_auth_create_users.rb
446
+ - test/dummy/db/migrate/20190924101113_devise_token_auth_create_confirmable_users.rb
447
+ - test/dummy/tmp/generators/app/views/devise/mailer/confirmation_instructions.html.erb
448
+ - test/dummy/tmp/generators/app/views/devise/mailer/reset_password_instructions.html.erb
434
449
  - test/dummy/README.rdoc
435
450
  - test/models/only_email_user_test.rb
451
+ - test/models/confirmable_user_test.rb
436
452
  - test/models/concerns/mongoid_support_test.rb
437
453
  - test/models/concerns/tokens_serialization_test.rb
438
454
  - test/models/user_test.rb
@@ -1,7 +0,0 @@
1
- class Mang < ActiveRecord::Base
2
- # Include default devise modules.
3
- devise :database_authenticatable, :registerable,
4
- :recoverable, :rememberable, :trackable, :validatable,
5
- :confirmable, :omniauthable
6
- include DeviseTokenAuth::Concerns::User
7
- end
@@ -1,7 +0,0 @@
1
- class User < ActiveRecord::Base
2
- # Include default devise modules.
3
- devise :database_authenticatable, :registerable,
4
- :recoverable, :rememberable, :trackable, :validatable,
5
- :confirmable, :omniauthable
6
- include DeviseTokenAuth::Concerns::User
7
- end
@@ -1,48 +0,0 @@
1
- DeviseTokenAuth.setup do |config|
2
- # By default the authorization headers will change after each request. The
3
- # client is responsible for keeping track of the changing tokens. Change
4
- # this to false to prevent the Authorization header from changing after
5
- # each request.
6
- # config.change_headers_on_each_request = true
7
-
8
- # By default, users will need to re-authenticate after 2 weeks. This setting
9
- # determines how long tokens will remain valid after they are issued.
10
- # config.token_lifespan = 2.weeks
11
-
12
- # Sets the max number of concurrent devices per user, which is 10 by default.
13
- # After this limit is reached, the oldest tokens will be removed.
14
- # config.max_number_of_devices = 10
15
-
16
- # Sometimes it's necessary to make several requests to the API at the same
17
- # time. In this case, each request in the batch will need to share the same
18
- # auth token. This setting determines how far apart the requests can be while
19
- # still using the same auth token.
20
- # config.batch_request_buffer_throttle = 5.seconds
21
-
22
- # This route will be the prefix for all oauth2 redirect callbacks. For
23
- # example, using the default '/omniauth', the github oauth2 provider will
24
- # redirect successful authentications to '/omniauth/github/callback'
25
- # config.omniauth_prefix = "/omniauth"
26
-
27
- # By default sending current password is not needed for the password update.
28
- # Uncomment to enforce current_password param to be checked before all
29
- # attribute updates. Set it to :password if you want it to be checked only if
30
- # password is updated.
31
- # config.check_current_password_before_update = :attributes
32
-
33
- # By default we will use callbacks for single omniauth.
34
- # It depends on fields like email, provider and uid.
35
- # config.default_callbacks = true
36
-
37
- # Makes it possible to change the headers names
38
- # config.headers_names = {:'access-token' => 'access-token',
39
- # :'client' => 'client',
40
- # :'expiry' => 'expiry',
41
- # :'uid' => 'uid',
42
- # :'token-type' => 'token-type' }
43
-
44
- # By default, only Bearer Token authentication is implemented out of the box.
45
- # If, however, you wish to integrate with legacy Devise authentication, you can
46
- # do so by enabling this flag. NOTE: This feature is highly experimental!
47
- # config.enable_standard_devise_support = false
48
- end
@@ -1,9 +0,0 @@
1
- Rails.application.routes.draw do
2
- mount_devise_token_auth_for 'User', at: 'auth'
3
-
4
- mount_devise_token_auth_for 'Mang', at: 'mangs'
5
- as :mang do
6
- # Define routes for Mang within this block.
7
- end
8
- patch '/chong', to: 'bong#index'
9
- end
@@ -1,54 +0,0 @@
1
- class DeviseTokenAuthCreateUsers < ActiveRecord::Migration[4.2]
2
- def change
3
- create_table(:users) do |t|
4
- ## Required
5
- t.string :provider, :null => false, :default => "email"
6
- t.string :uid, :null => false, :default => ""
7
-
8
- ## Database authenticatable
9
- t.string :encrypted_password, :null => false, :default => ""
10
-
11
- ## Recoverable
12
- t.string :reset_password_token
13
- t.datetime :reset_password_sent_at
14
-
15
- ## Rememberable
16
- t.datetime :remember_created_at
17
-
18
- ## Trackable
19
- t.integer :sign_in_count, :default => 0, :null => false
20
- t.datetime :current_sign_in_at
21
- t.datetime :last_sign_in_at
22
- t.string :current_sign_in_ip
23
- t.string :last_sign_in_ip
24
-
25
- ## Confirmable
26
- t.string :confirmation_token
27
- t.datetime :confirmed_at
28
- t.datetime :confirmation_sent_at
29
- t.string :unconfirmed_email # Only if using reconfirmable
30
-
31
- ## Lockable
32
- # t.integer :failed_attempts, :default => 0, :null => false # Only if lock strategy is :failed_attempts
33
- # t.string :unlock_token # Only if unlock strategy is :email or :both
34
- # t.datetime :locked_at
35
-
36
- ## User Info
37
- t.string :name
38
- t.string :nickname
39
- t.string :image
40
- t.string :email
41
-
42
- ## Tokens
43
- t.text :tokens
44
-
45
- t.timestamps
46
- end
47
-
48
- add_index :users, :email, unique: true
49
- add_index :users, [:uid, :provider], unique: true
50
- add_index :users, :reset_password_token, unique: true
51
- add_index :users, :confirmation_token, unique: true
52
- # add_index :users, :unlock_token, unique: true
53
- end
54
- end