rails_jwt_auth 1.7.3 → 2.0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (35) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +188 -89
  3. data/app/controllers/concerns/rails_jwt_auth/authenticable_helper.rb +15 -7
  4. data/app/controllers/concerns/rails_jwt_auth/params_helper.rb +18 -4
  5. data/app/controllers/concerns/rails_jwt_auth/render_helper.rb +10 -2
  6. data/app/controllers/rails_jwt_auth/confirmations_controller.rb +48 -10
  7. data/app/controllers/rails_jwt_auth/invitations_controller.rb +27 -9
  8. data/app/controllers/rails_jwt_auth/profiles_controller.rb +51 -0
  9. data/app/controllers/rails_jwt_auth/reset_passwords_controller.rb +65 -0
  10. data/app/controllers/rails_jwt_auth/sessions_controller.rb +7 -22
  11. data/app/controllers/rails_jwt_auth/{unlocks_controller.rb → unlock_accounts_controller.rb} +2 -2
  12. data/app/mailers/rails_jwt_auth/mailer.rb +23 -28
  13. data/app/models/concerns/rails_jwt_auth/authenticatable.rb +60 -19
  14. data/app/models/concerns/rails_jwt_auth/confirmable.rb +49 -39
  15. data/app/models/concerns/rails_jwt_auth/invitable.rb +46 -72
  16. data/app/models/concerns/rails_jwt_auth/lockable.rb +38 -46
  17. data/app/models/concerns/rails_jwt_auth/recoverable.rb +27 -26
  18. data/app/models/concerns/rails_jwt_auth/trackable.rb +13 -2
  19. data/app/views/rails_jwt_auth/mailer/confirmation_instructions.html.erb +1 -1
  20. data/app/views/rails_jwt_auth/mailer/{send_invitation.html.erb → invitation_instructions.html.erb} +1 -1
  21. data/app/views/rails_jwt_auth/mailer/password_changed_notification.html.erb +3 -0
  22. data/app/views/rails_jwt_auth/mailer/reset_password_instructions.html.erb +1 -1
  23. data/app/views/rails_jwt_auth/mailer/{send_unlock_instructions.html.erb → unlock_instructions.html.erb} +1 -1
  24. data/config/locales/en.yml +6 -6
  25. data/lib/generators/rails_jwt_auth/install_generator.rb +11 -3
  26. data/lib/generators/templates/initializer.rb +43 -29
  27. data/lib/generators/templates/migration.rb +2 -1
  28. data/lib/rails_jwt_auth/jwt_manager.rb +2 -4
  29. data/lib/rails_jwt_auth/session.rb +128 -0
  30. data/lib/rails_jwt_auth/version.rb +1 -1
  31. data/lib/rails_jwt_auth.rb +46 -47
  32. metadata +11 -9
  33. data/app/controllers/rails_jwt_auth/passwords_controller.rb +0 -32
  34. data/app/views/rails_jwt_auth/mailer/set_password_instructions.html.erb +0 -5
  35. /data/app/views/rails_jwt_auth/mailer/{email_changed.html.erb → email_change_requested_notification.html.erb} +0 -0
@@ -11,115 +11,89 @@ module RailsJwtAuth
11
11
  field :invitation_token, type: String
12
12
  field :invitation_sent_at, type: Time
13
13
  field :invitation_accepted_at, type: Time
14
- field :invitation_created_at, type: Time
15
14
  end
16
15
  end
17
16
  end
18
17
 
19
18
  module ClassMethods
20
19
  # Creates an user and sends an invitation to him.
21
- # If the user is already invited and pending of completing registration
22
- # the invitation is resent by email.
23
- # If the user is already registered, it returns the user with a
24
- # <tt>:taken</tt> on the email field.
25
- #
26
- # @param [Hash] attributes Hash containing user's attributes to be filled.
27
- # Must contain an email key.
28
- #
29
- # @return [user] The user created or found by email.
30
- def invite!(attributes={})
20
+ def invite(attributes={})
31
21
  attrs = ActiveSupport::HashWithIndifferentAccess.new(attributes.to_h)
32
- auth_field = RailsJwtAuth.auth_field_name!
22
+ auth_field = RailsJwtAuth.auth_field_name
33
23
  auth_attribute = attrs.delete(auth_field)
34
24
 
35
- raise ArgumentError unless auth_attribute
36
-
37
25
  record = RailsJwtAuth.model.find_or_initialize_by(auth_field => auth_attribute)
38
26
  record.assign_attributes(attrs)
39
27
 
40
- record.invite!
28
+ record.invite
41
29
  record
42
30
  end
43
31
  end
44
32
 
45
- # Accept an invitation by clearing token and setting invitation_accepted_at
46
- def accept_invitation
47
- self.invitation_accepted_at = Time.current
48
- self.invitation_token = nil
49
- end
50
-
51
- def accept_invitation!
52
- return unless invited?
53
-
54
- if valid_invitation?
55
- accept_invitation
56
- self.confirmed_at = Time.current if respond_to?(:confirmed_at) && confirmed_at.nil?
57
- else
58
- errors.add(:invitation_token, :invalid)
33
+ # Sends an invitation to user
34
+ # If the user has pending invitation, new one is sent
35
+ def invite
36
+ if persisted? && !invitation_token
37
+ errors.add(RailsJwtAuth.auth_field_name, :registered)
38
+ return false
59
39
  end
60
- end
61
40
 
62
- def invite!
63
- self.invitation_created_at = Time.current if new_record?
41
+ @inviting = true
42
+ self.invitation_token = generate_invitation_token
43
+ self.invitation_sent_at = Time.current
64
44
 
65
- unless password || password_digest
66
- passw = SecureRandom.base58(16)
67
- self.password = passw
68
- self.password_confirmation = passw
69
- end
45
+ return false unless save_without_password
70
46
 
71
- valid?
47
+ RailsJwtAuth.send_email(:invitation_instructions, self)
48
+ true
49
+ ensure
50
+ @inviting = false
51
+ end
72
52
 
73
- # users that are registered and were not invited are not reinvitable
74
- if !new_record? && !invited?
75
- errors.add(RailsJwtAuth.auth_field_name!, :taken)
76
- end
53
+ # Finishes invitation process setting user password
54
+ def accept_invitation(params)
55
+ return false unless invitation_token.present?
77
56
 
78
- # users that have already accepted an invitation are not reinvitable
79
- if !new_record? && invited? && invitation_accepted_at.present?
80
- errors.add(RailsJwtAuth.auth_field_name!, :taken)
81
- end
57
+ self.assign_attributes(params)
82
58
 
83
- return self unless errors.empty?
59
+ valid?
60
+ errors.add(:password, :blank) if params[:password].blank?
61
+ errors.add(:invitation_token, :expired) if expired_invitation_token?
84
62
 
85
- generate_invitation_token if invitation_token.nil?
86
- self.invitation_sent_at = Time.current
63
+ return false unless errors.empty?
87
64
 
88
- send_invitation_mail if save(validate: false)
89
- self
65
+ self.invitation_accepted_at = Time.current
66
+ self.invitation_token = nil
67
+ self.invitation_sent_at = nil
68
+ self.confirmed_at = Time.current if respond_to?(:confirmed_at) && confirmed_at.nil?
69
+ save
90
70
  end
91
71
 
92
- def invited?
93
- (persisted? && invitation_token.present?)
72
+ def inviting?
73
+ @inviting || false
94
74
  end
95
75
 
96
- def generate_invitation_token!
97
- generate_invitation_token && save(validate: false)
76
+ def valid_for_invite?
77
+ @inviting = true
78
+ valid_without_password?
79
+ ensure
80
+ @inviting = false
98
81
  end
99
82
 
100
- def valid_invitation?
101
- invited? && invitation_period_valid?
102
- end
83
+ def expired_invitation_token?
84
+ expiration_time = RailsJwtAuth.invitation_expiration_time
85
+ return false if expiration_time.to_i.zero?
103
86
 
104
- def accepted_invitation?
105
- invitation_token.nil? && invitation_accepted_at.present?
87
+ invitation_sent_at && invitation_sent_at < expiration_time.ago
106
88
  end
107
89
 
108
90
  protected
109
91
 
110
92
  def generate_invitation_token
111
- self.invitation_token = SecureRandom.base58(128)
112
- end
113
-
114
- def send_invitation_mail
115
- RailsJwtAuth.email_field_name! # ensure email field is valid
116
- RailsJwtAuth.send_email(:send_invitation, self)
117
- end
118
-
119
- def invitation_period_valid?
120
- time = invitation_sent_at || invitation_created_at
121
- expiration_time = RailsJwtAuth.invitation_expiration_time
122
- time && (expiration_time.to_i.zero? || time >= expiration_time.ago)
93
+ loop do
94
+ token = RailsJwtAuth.friendly_token
95
+ return token unless self.class.where(invitation_token: token).exists?
96
+ end
123
97
  end
124
98
  end
125
99
  end
@@ -13,66 +13,51 @@ module RailsJwtAuth
13
13
  end
14
14
  end
15
15
 
16
- def lock_access!
17
- self.locked_at = Time.now.utc
16
+ def lock_access
17
+ self.locked_at = Time.current
18
+
18
19
  save(validate: false).tap do |result|
19
20
  send_unlock_instructions if result && unlock_strategy_enabled?(:email)
20
21
  end
21
22
  end
22
23
 
23
- def unlock_access!
24
+ def clean_lock
24
25
  self.locked_at = nil
25
- self.failed_attempts = 0
26
- self.first_failed_attempt_at = nil
27
26
  self.unlock_token = nil
28
- save(validate: false)
27
+ reset_attempts
29
28
  end
30
29
 
31
- def reset_attempts!
32
- self.failed_attempts = 0
33
- self.first_failed_attempt_at = nil
34
- save(validate: false)
30
+ def unlock_access
31
+ clean_lock
32
+
33
+ save(validate: false) if changed?
35
34
  end
36
35
 
37
- def authentication?(pass)
38
- return super(pass) unless lock_strategy_enabled?(:failed_attempts)
36
+ def access_locked?
37
+ locked_at && !lock_expired?
38
+ end
39
39
 
40
- reset_attempts! if !access_locked? && attempts_expired?
41
- unlock_access! if lock_expired?
40
+ def failed_attempt
41
+ return if access_locked?
42
42
 
43
- if access_locked?
44
- false
45
- elsif super(pass)
46
- unlock_access!
47
- self
48
- else
49
- failed_attempt!
50
- lock_access! if attempts_exceeded?
51
- false
52
- end
53
- end
43
+ reset_attempts if attempts_expired?
54
44
 
55
- def unauthenticated_error
56
- return super unless lock_strategy_enabled?(:failed_attempts)
45
+ self.failed_attempts ||= 0
46
+ self.failed_attempts += 1
47
+ self.first_failed_attempt_at = Time.current if failed_attempts == 1
57
48
 
58
- if access_locked?
59
- {error: :locked}
60
- else
61
- {error: :invalid_session, remaining_attempts: remaining_attempts}
49
+ save(validate: false).tap do |result|
50
+ lock_access if result && attempts_exceeded?
62
51
  end
63
52
  end
64
53
 
65
54
  protected
66
55
 
67
56
  def send_unlock_instructions
68
- self.unlock_token = SecureRandom.base58(24)
57
+ self.unlock_token = generate_unlock_token
69
58
  save(validate: false)
70
59
 
71
- RailsJwtAuth.send_email(:send_unlock_instructions, self)
72
- end
73
-
74
- def access_locked?
75
- locked_at && !lock_expired?
60
+ RailsJwtAuth.send_email(:unlock_instructions, self)
76
61
  end
77
62
 
78
63
  def lock_expired?
@@ -83,25 +68,32 @@ module RailsJwtAuth
83
68
  end
84
69
  end
85
70
 
86
- def failed_attempt!
87
- self.failed_attempts ||= 0
88
- self.failed_attempts += 1
89
- self.first_failed_attempt_at = Time.now.utc if failed_attempts == 1
90
- save(validate: false)
91
- end
92
-
93
- def attempts_exceeded?
94
- failed_attempts && failed_attempts >= RailsJwtAuth.maximum_attempts
71
+ def reset_attempts
72
+ self.failed_attempts = 0
73
+ self.first_failed_attempt_at = nil
95
74
  end
96
75
 
97
76
  def remaining_attempts
98
77
  RailsJwtAuth.maximum_attempts - failed_attempts.to_i
99
78
  end
100
79
 
80
+ def attempts_exceeded?
81
+ !remaining_attempts.positive?
82
+ end
83
+
101
84
  def attempts_expired?
102
85
  first_failed_attempt_at && first_failed_attempt_at < RailsJwtAuth.reset_attempts_in.ago
103
86
  end
104
87
 
88
+ protected
89
+
90
+ def generate_unlock_token
91
+ loop do
92
+ token = RailsJwtAuth.friendly_token
93
+ return token unless self.class.where(unlock_token: token).exists?
94
+ end
95
+ end
96
+
105
97
  def lock_strategy_enabled?(strategy)
106
98
  RailsJwtAuth.lock_strategy == strategy
107
99
  end
@@ -10,20 +10,11 @@ module RailsJwtAuth
10
10
  field :reset_password_token, type: String
11
11
  field :reset_password_sent_at, type: Time
12
12
  end
13
-
14
- validate :validate_reset_password_token, if: :password_digest_changed?
15
-
16
- before_update do
17
- if password_digest_changed? && reset_password_token
18
- self.reset_password_token = nil
19
- self.auth_tokens = []
20
- end
21
- end
22
13
  end
23
14
  end
24
15
 
25
16
  def send_reset_password_instructions
26
- email_field = RailsJwtAuth.email_field_name! # ensure email field es valid
17
+ email_field = RailsJwtAuth.email_field_name # ensure email field es valid
27
18
 
28
19
  if self.class.ancestors.include?(RailsJwtAuth::Confirmable) && !confirmed?
29
20
  errors.add(email_field, :unconfirmed)
@@ -36,35 +27,45 @@ module RailsJwtAuth
36
27
  return false
37
28
  end
38
29
 
39
- self.reset_password_token = SecureRandom.base58(24)
30
+ self.reset_password_token = generate_reset_password_token
40
31
  self.reset_password_sent_at = Time.current
41
32
  return false unless save
42
33
 
43
34
  RailsJwtAuth.send_email(:reset_password_instructions, self)
44
35
  end
45
36
 
46
- def set_and_send_password_instructions
47
- RailsJwtAuth.email_field_name! # ensure email field es valid
48
- return if password.present?
37
+ def set_reset_password(params)
38
+ self.assign_attributes(params)
49
39
 
50
- self.password = SecureRandom.base58(48)
51
- self.password_confirmation = self.password
52
- self.skip_confirmation! if self.class.ancestors.include?(RailsJwtAuth::Confirmable)
40
+ valid?
41
+ errors.add(:password, :blank) if params[:password].blank?
42
+ errors.add(:reset_password_token, :expired) if expired_reset_password_token?
53
43
 
54
- self.reset_password_token = SecureRandom.base58(24)
55
- self.reset_password_sent_at = Time.current
56
- return false unless save
44
+ return false unless errors.empty?
45
+
46
+ clean_reset_password
47
+ self.auth_tokens = [] # reset all sessions
48
+ save
49
+ end
50
+
51
+ def expired_reset_password_token?
52
+ expiration_time = RailsJwtAuth.reset_password_expiration_time
53
+ return false if expiration_time.to_i.zero?
54
+
55
+ reset_password_sent_at && reset_password_sent_at < expiration_time.ago
56
+ end
57
57
 
58
- RailsJwtAuth.send_email(:set_password_instructions, self)
59
- true
58
+ def clean_reset_password
59
+ self.reset_password_sent_at = nil
60
+ self.reset_password_token = nil
60
61
  end
61
62
 
62
63
  protected
63
64
 
64
- def validate_reset_password_token
65
- if reset_password_sent_at &&
66
- (reset_password_sent_at < (Time.current - RailsJwtAuth.reset_password_expiration_time))
67
- errors.add(:reset_password_token, :expired)
65
+ def generate_reset_password_token
66
+ loop do
67
+ token = RailsJwtAuth.friendly_token
68
+ return token unless self.class.where(reset_password_token: token).exists?
68
69
  end
69
70
  end
70
71
  end
@@ -1,9 +1,18 @@
1
1
  module RailsJwtAuth
2
2
  module Trackable
3
- def update_tracked_fields!(request)
3
+ def track_session_info(request)
4
+ return unless request
5
+
4
6
  self.last_sign_in_at = Time.current
5
7
  self.last_sign_in_ip = request.respond_to?(:remote_ip) ? request.remote_ip : request.ip
6
- save(validate: false)
8
+ end
9
+
10
+ def update_tracked_request_info(request)
11
+ return unless request
12
+
13
+ self.last_request_at = Time.current
14
+ self.last_request_ip = request.respond_to?(:remote_ip) ? request.remote_ip : request.ip
15
+ self.save(validate: false)
7
16
  end
8
17
 
9
18
  def self.included(base)
@@ -11,6 +20,8 @@ module RailsJwtAuth
11
20
  if defined?(Mongoid) && ancestors.include?(Mongoid::Document)
12
21
  field :last_sign_in_at, type: Time
13
22
  field :last_sign_in_ip, type: String
23
+ field :last_request_at, type: Time
24
+ field :last_request_ip, type: String
14
25
  end
15
26
  end
16
27
  end
@@ -2,4 +2,4 @@
2
2
 
3
3
  <p>You can confirm your account email through the link below:</p>
4
4
 
5
- <p><%= link_to 'Confirm my account', @confirmations_url.html_safe %></p>
5
+ <p><%= link_to 'Confirm my account', @confirm_email_url.html_safe %></p>
@@ -3,4 +3,4 @@
3
3
  <p>Someone has sent you an invitation to App.</p>
4
4
  <p>To complete registration setting a password, please click the following link.</p>
5
5
 
6
- <p><%= link_to "Accept invitation", @invitations_url.html_safe %></p>
6
+ <p><%= link_to "Accept invitation", @accept_invitation_url.html_safe %></p>
@@ -0,0 +1,3 @@
1
+ <p>Hello <%= @user[RailsJwtAuth.email_field_name] %>!</p>
2
+
3
+ <p>We're contacting you to notify you that your password has been changed.</p>
@@ -2,7 +2,7 @@
2
2
 
3
3
  <p>Someone has requested a link to change your password. You can do this through the link below.</p>
4
4
 
5
- <p><%= link_to 'Change my password', @reset_passwords_url.html_safe %></p>
5
+ <p><%= link_to 'Change my password', @reset_password_url.html_safe %></p>
6
6
 
7
7
  <p>If you didn't request this, please ignore this email.</p>
8
8
  <p>Your password won't change until you access the link above and create a new one.</p>
@@ -4,4 +4,4 @@
4
4
 
5
5
  <p>Click the link below to unlock your account:</p>
6
6
 
7
- <p><%= link_to 'Unlock my account', @unlock_url.html_safe %></p>
7
+ <p><%= link_to 'Unlock my account', @unlock_account_url.html_safe %></p>
@@ -5,11 +5,11 @@ en:
5
5
  subject: "Confirmation instructions"
6
6
  reset_password_instructions:
7
7
  subject: "Reset password instructions"
8
- set_password_instructions:
9
- subject: "Set password instructions"
10
- send_invitation:
8
+ invitation_instructions:
11
9
  subject: "Someone has sent you an invitation!"
12
- email_changed:
13
- subject: "Email changed"
14
- send_unlock_instructions:
10
+ email_change_requested_notification:
11
+ subject: "Email change"
12
+ password_changed_notification:
13
+ subject: "Password changed"
14
+ unlock_instructions:
15
15
  subject: "Unlock instructions"
@@ -8,10 +8,18 @@ class RailsJwtAuth::InstallGenerator < Rails::Generators::Base
8
8
  def create_routes
9
9
  route "resource :session, controller: 'rails_jwt_auth/sessions', only: [:create, :destroy]"
10
10
  route "resource :registration, controller: 'rails_jwt_auth/registrations', only: [:create]"
11
+ route %q(
12
+ resource :profile, controller: 'rails_jwt_auth/profiles', only: %i[show update] do
13
+ collection do
14
+ put :email
15
+ put :password
16
+ end
17
+ end
18
+ )
11
19
 
12
20
  route "resources :confirmations, controller: 'rails_jwt_auth/confirmations', only: [:create, :update]"
13
- route "resources :passwords, controller: 'rails_jwt_auth/passwords', only: [:create, :update]"
14
- route "resources :invitations, controller: 'rails_jwt_auth/invitations', only: [:create, :update]"
15
- route "resources :unlocks, controller: 'rails_jwt_auth/unlocks', only: %i[update]"
21
+ route "resources :reset_passwords, controller: 'rails_jwt_auth/reset_passwords', only: [:show, :create, :update]"
22
+ route "resources :invitations, controller: 'rails_jwt_auth/invitations', only: [:show, :create, :update]"
23
+ route "resources :unlock_accounts, controller: 'rails_jwt_auth/unlock_accounts', only: %i[update]"
16
24
  end
17
25
  end
@@ -1,65 +1,79 @@
1
1
  RailsJwtAuth.setup do |config|
2
2
  # authentication model class name
3
- #config.model_name = 'User'
3
+ # config.model_name = 'User'
4
4
 
5
5
  # field name used to authentication with password
6
- #config.auth_field_name = 'email'
6
+ # config.auth_field_name = 'email'
7
7
 
8
8
  # define email field name used to send emails
9
- #config.email_field_name = 'email'
9
+ # config.email_field_name = 'email'
10
+
11
+ # Regex used to validate email input on requests like reset password
12
+ # config.email_regex = URI::MailTo::EMAIL_REGEXP
13
+
14
+ # apply downcase to auth field when save user and when init session
15
+ # config.downcase_auth_field = false
10
16
 
11
17
  # expiration time for generated tokens
12
- #config.jwt_expiration_time = 7.days
18
+ # config.jwt_expiration_time = 7.days
13
19
 
14
20
  # the "iss" (issuer) claim identifies the principal that issued the JWT
15
- #config.jwt_issuer = 'RailsJwtAuth'
21
+ # config.jwt_issuer = 'RailsJwtAuth'
16
22
 
17
23
  # number of simultaneously sessions for an user
18
- #config.simultaneous_sessions = 2
24
+ # config.simultaneous_sessions = 2
25
+
26
+ # mailer class name
27
+ # config.mailer_name = 'RailsJwtAuth::Mailer'
19
28
 
20
29
  # mailer sender
21
- #config.mailer_sender = 'initialize-mailer_sender@example.com'
30
+ # config.mailer_sender = 'initialize-mailer_sender@example.com'
31
+
32
+ # activate email notification when email is changed
33
+ # config.send_email_change_requested_notification = true
34
+
35
+ # activate email notification when password is changed
36
+ # config.send_password_changed_notification = true
22
37
 
23
38
  # expiration time for confirmation tokens
24
- #config.confirmation_expiration_time = 1.day
39
+ # config.confirmation_expiration_time = 1.day
25
40
 
26
41
  # expiration time for reset password tokens
27
- #config.reset_password_expiration_time = 1.day
42
+ # config.reset_password_expiration_time = 1.day
28
43
 
29
44
  # time an invitation is valid after sent
30
45
  # config.invitation_expiration_time = 2.days
31
46
 
32
- # url used to create email link with confirmation token
33
- #config.confirmations_url = 'http://frontend.com/confirmation'
34
-
35
- # url used to create email link with reset password token
36
- #config.reset_passwords_url = 'http://frontend.com/reset_password'
37
-
38
- # url used to create email link with set password token
39
- # by set_and_send_password_instructions method
40
- #config.set_passwords_url = 'http://frontend.com/set_password'
41
-
42
- # url used to create email link with activation token parameter to accept invitation
43
- #config.invitations_url = 'http://frontend.com/accept_invitation'
44
-
45
47
  # uses deliver_later to send emails instead of deliver method
46
- #config.deliver_later = false
48
+ # config.deliver_later = false
47
49
 
48
50
  # maximum login attempts before locking an account
49
- #config.maximum_attempts = 3
51
+ # config.maximum_attempts = 3
50
52
 
51
53
  # strategy to lock an account: :none or :failed_attempts
52
- #config.lock_strategy = :failed_attempts
54
+ # config.lock_strategy = :failed_attempts
53
55
 
54
56
  # strategy to use when unlocking accounts: :time, :email or :both
55
- #config.unlock_strategy = :time
57
+ # config.unlock_strategy = :time
56
58
 
57
59
  # interval to unlock an account if unlock_strategy is :time
58
- #config.unlock_in = 60.minutes
60
+ # config.unlock_in = 60.minutes
59
61
 
60
62
  # interval after which to reset failed attempts counter of an account
61
- #config.reset_attempts_in = 60.minutes
63
+ # config.reset_attempts_in = 60.minutes
64
+ #
65
+ # url used to create email link with confirmation token
66
+ # config.confirm_email_url = 'http://frontend.com/confirm-email'
67
+
68
+ # url used to create email link with reset password token
69
+ # config.reset_password_url = 'http://frontend.com/reset-password'
70
+
71
+ # url used to create email link with activation token parameter to accept invitation
72
+ # config.accept_invitation_url = 'http://frontend.com/accept-invitation'
62
73
 
63
74
  # url used to create email link with unlock token
64
- #config.unlock_url = 'http://frontend.com/unlock-account'
75
+ # config.unlock_account_url = 'http://frontend.com/unlock-account'
76
+
77
+ # set false to avoid giving clue about the existing emails with errors
78
+ # config.avoid_email_errors = true
65
79
  end
@@ -18,12 +18,13 @@ class Create<%= RailsJwtAuth.model_name.pluralize %> < ActiveRecord::Migration<%
18
18
  ## Trackable
19
19
  # t.string :last_sign_in_ip
20
20
  # t.datetime :last_sign_in_at
21
+ # t.string :last_request_ip
22
+ # t.datetime :last_request_at
21
23
 
22
24
  ## Invitable
23
25
  # t.string :invitation_token
24
26
  # t.datetime :invitation_sent_at
25
27
  # t.datetime :invitation_accepted_at
26
- # t.datetime :invitation_created_at
27
28
 
28
29
  ## Lockable
29
30
  # t.integer :failed_attempts
@@ -8,6 +8,8 @@ module RailsJwtAuth
8
8
 
9
9
  # Encodes and signs JWT Payload with expiration
10
10
  def self.encode(payload)
11
+ raise InvalidJwtPayload unless payload
12
+
11
13
  payload.reverse_merge!(meta)
12
14
  JWT.encode(payload, secret_key_base)
13
15
  end
@@ -25,9 +27,5 @@ module RailsJwtAuth
25
27
  iss: RailsJwtAuth.jwt_issuer
26
28
  }
27
29
  end
28
-
29
- def self.decode_from_request(request)
30
- decode(request.env['HTTP_AUTHORIZATION']&.split&.last)
31
- end
32
30
  end
33
31
  end