rails_jwt_auth 0.17.1 → 0.18.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +83 -1
- data/Rakefile +4 -3
- data/app/controllers/concerns/rails_jwt_auth/params_helper.rb +8 -0
- data/app/controllers/rails_jwt_auth/invitations_controller.rb +27 -0
- data/app/mailers/rails_jwt_auth/mailer.rb +16 -0
- data/app/models/concerns/rails_jwt_auth/authenticatable.rb +16 -14
- data/app/models/concerns/rails_jwt_auth/confirmable.rb +25 -23
- data/app/models/concerns/rails_jwt_auth/invitable.rb +113 -0
- data/app/models/concerns/rails_jwt_auth/recoverable.rb +14 -12
- data/app/models/concerns/rails_jwt_auth/trackable.rb +5 -3
- data/app/views/rails_jwt_auth/mailer/send_invitation.html.erb +6 -0
- data/config/locales/en.yml +4 -0
- data/lib/generators/rails_jwt_auth/install_generator.rb +2 -0
- data/lib/generators/templates/initializer.rb +8 -0
- data/lib/rails_jwt_auth.rb +6 -0
- data/lib/rails_jwt_auth/version.rb +1 -1
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f62382c4d00178ccea3aa3a95e9fce5a2ce51909
|
4
|
+
data.tar.gz: 88608b4d059215392fb2c2c5b9a22478ca3ce915
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6c9483c6c630e56a44880cd19e5efa76f6ab055ac64a577802dea27d8ccac3c6c926b5f3299cb2217911a1849695aae3e8abdb2c5820205597719e1ab6c21661
|
7
|
+
data.tar.gz: a179d9f7eb6d28b360c5ecaba632f4124b755cb95d5bc6698aee80db6e401144a47ac74a63e5be1a5445c017bb218a0af3794a2685db1b4331f852934bfcceed
|
data/README.md
CHANGED
@@ -1,4 +1,6 @@
|
|
1
1
|
# RailsJwtAuth
|
2
|
+
[](https://badge.fury.io/rb/rails_jwt_auth)
|
3
|
+

|
2
4
|
|
3
5
|
Rails-API authentication solution based on Warden and JWT and inspired by Devise.
|
4
6
|
|
@@ -48,6 +50,8 @@ You can edit configuration options into `config/initializers/auth_token_auth.rb`
|
|
48
50
|
| reset_password_expiration_time | 1.day | Confirmation token expiration time |
|
49
51
|
| set_password_url | password_path | Url used to create email link with set password token |
|
50
52
|
| deliver_later | false | Uses `deliver_later` method to send emails |
|
53
|
+
| invitation_expiration_time | 2.days | Time an invitation is valid and can be accepted |
|
54
|
+
| invitation_url | invitation_path | URL used to create email link with invitation token |
|
51
55
|
|
52
56
|
## Authenticatable
|
53
57
|
|
@@ -211,6 +215,46 @@ class User
|
|
211
215
|
end
|
212
216
|
```
|
213
217
|
|
218
|
+
## Invitable
|
219
|
+
|
220
|
+
This module allows you to invite an user to your application sending an invitation mail with a unique link and complete registration by setting user's password.
|
221
|
+
|
222
|
+
### ActiveRecord
|
223
|
+
|
224
|
+
Include `RailsJwtAuth::Invitable` module in your User model:
|
225
|
+
|
226
|
+
```ruby
|
227
|
+
# app/models/user.rb
|
228
|
+
class User < ApplicationRecord
|
229
|
+
include RailsJwtAuth::Authenticatable
|
230
|
+
include RailsJwtAuth::Invitable
|
231
|
+
end
|
232
|
+
```
|
233
|
+
|
234
|
+
And create the corresponding migration
|
235
|
+
|
236
|
+
```ruby
|
237
|
+
# Example migration
|
238
|
+
change_table :users do |t|
|
239
|
+
t.string :invitation_token
|
240
|
+
t.datetime :invitation_sent_at
|
241
|
+
t.datetime :invitation_accepted_at
|
242
|
+
t.datetime :invitation_created_at
|
243
|
+
end
|
244
|
+
```
|
245
|
+
|
246
|
+
### Mongoid
|
247
|
+
|
248
|
+
Include `RailsJwtAuth::Invitable` module in your User model:
|
249
|
+
|
250
|
+
```ruby
|
251
|
+
# app/models/user.rb
|
252
|
+
class User < ApplicationRecord
|
253
|
+
include RailsJwtAuth::Authenticatable
|
254
|
+
include RailsJwtAuth::Invitable
|
255
|
+
end
|
256
|
+
```
|
257
|
+
|
214
258
|
## Controller helpers
|
215
259
|
|
216
260
|
RailsJwtAuth will create some helpers to use inside your controllers.
|
@@ -368,6 +412,44 @@ Password api is defined by RailsJwtAuth::PasswordsController.
|
|
368
412
|
}
|
369
413
|
```
|
370
414
|
|
415
|
+
### Invitations
|
416
|
+
|
417
|
+
Invitations api is provided by RailsJwtAuth::InvitationsController.
|
418
|
+
|
419
|
+
1. Create an invitation and send email:
|
420
|
+
|
421
|
+
```js
|
422
|
+
{
|
423
|
+
url: host/invitation,
|
424
|
+
method: POST,
|
425
|
+
data: {
|
426
|
+
invitation: {
|
427
|
+
email: "user@example.com",
|
428
|
+
// More fields of your user
|
429
|
+
}
|
430
|
+
}
|
431
|
+
}
|
432
|
+
```
|
433
|
+
|
434
|
+
2. Accept an invitation:
|
435
|
+
|
436
|
+
```js
|
437
|
+
{
|
438
|
+
url: host/invitation,
|
439
|
+
method: PUT,
|
440
|
+
data: {
|
441
|
+
accept_invitation: {
|
442
|
+
invitation_token: "token",
|
443
|
+
password: '1234',
|
444
|
+
password_confirmation: '1234',
|
445
|
+
// More fields of your user...
|
446
|
+
}
|
447
|
+
}
|
448
|
+
}
|
449
|
+
```
|
450
|
+
|
451
|
+
Note: To add more fields, see "Custom strong parameters" below.
|
452
|
+
|
371
453
|
## Custom controllers
|
372
454
|
|
373
455
|
You can overwrite RailsJwtAuth controllers to edit actions, responses,
|
@@ -420,7 +502,7 @@ end
|
|
420
502
|
|
421
503
|
## Register users with random password
|
422
504
|
|
423
|
-
This is a controller example that allows admins to register users with random password and send email to reset it.
|
505
|
+
This is a controller example that allows admins to register users with random password and send email to reset it.
|
424
506
|
If registration is sucess it will send email to `set_password_url` with reset password token.
|
425
507
|
|
426
508
|
```ruby
|
data/Rakefile
CHANGED
@@ -17,10 +17,11 @@ end
|
|
17
17
|
APP_RAKEFILE = File.expand_path("../spec/dummy/Rakefile", __FILE__)
|
18
18
|
load 'rails/tasks/engine.rake'
|
19
19
|
|
20
|
-
|
21
20
|
load 'rails/tasks/statistics.rake'
|
22
21
|
|
23
|
-
|
24
|
-
|
25
22
|
require 'bundler/gem_tasks'
|
23
|
+
require "rspec/core/rake_task"
|
24
|
+
|
25
|
+
RSpec::Core::RakeTask.new(:spec)
|
26
26
|
|
27
|
+
task :default => :spec
|
@@ -23,5 +23,13 @@ module RailsJwtAuth
|
|
23
23
|
def password_update_params
|
24
24
|
params.require(:password).permit(:password, :password_confirmation)
|
25
25
|
end
|
26
|
+
|
27
|
+
def invitation_create_params
|
28
|
+
params.require(:invitation).permit(:email)
|
29
|
+
end
|
30
|
+
|
31
|
+
def invitation_update_params
|
32
|
+
params.require(:accept_invitation).permit(:invitation_token, :password, :password_confirmation)
|
33
|
+
end
|
26
34
|
end
|
27
35
|
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module RailsJwtAuth
|
2
|
+
class InvitationsController < ApplicationController
|
3
|
+
include ParamsHelper
|
4
|
+
include RenderHelper
|
5
|
+
|
6
|
+
def create
|
7
|
+
attr_hash = invitation_create_params
|
8
|
+
user = RailsJwtAuth.model.invite!(attr_hash)
|
9
|
+
user.errors.empty? ? render_204 : render_422(user.errors)
|
10
|
+
end
|
11
|
+
|
12
|
+
def update
|
13
|
+
attr_hash = invitation_update_params
|
14
|
+
token = attr_hash.delete(:invitation_token)
|
15
|
+
user = RailsJwtAuth.model.where(invitation_token: token).first
|
16
|
+
user.assign_attributes attr_hash
|
17
|
+
user.accept_invitation!
|
18
|
+
|
19
|
+
if user.errors.empty? && user.save
|
20
|
+
return render_204
|
21
|
+
else
|
22
|
+
user.update_attribute :invitation_token, token
|
23
|
+
return render_422(user.errors)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -52,5 +52,21 @@ if defined?(ActionMailer)
|
|
52
52
|
subject = I18n.t('rails_jwt_auth.mailer.set_password_instructions.subject')
|
53
53
|
mail(to: @user.email, subject: subject)
|
54
54
|
end
|
55
|
+
|
56
|
+
def send_invitation(user)
|
57
|
+
@user = user
|
58
|
+
|
59
|
+
if RailsJwtAuth.invitation_url
|
60
|
+
url, params = RailsJwtAuth.invitation_url.split '?'
|
61
|
+
params = params ? params.split('&') : []
|
62
|
+
params.push("invitation_token=#{@user.invitation_token}")
|
63
|
+
@accept_invitation_url = "#{url}?#{params.join('&')}"
|
64
|
+
else
|
65
|
+
@accept_invitation_url = invitation_url(invitation_token: @user.invitation_token)
|
66
|
+
end
|
67
|
+
|
68
|
+
subject = I18n.t('rails_jwt_auth.mailer.send_invitation.subject')
|
69
|
+
mail(to: @user.email, subject: subject)
|
70
|
+
end
|
55
71
|
end
|
56
72
|
end
|
@@ -49,24 +49,26 @@ module RailsJwtAuth
|
|
49
49
|
end
|
50
50
|
|
51
51
|
def self.included(base)
|
52
|
-
|
53
|
-
base.send(:field, RailsJwtAuth.auth_field_name, type: String)
|
54
|
-
base.send(:field, :password_digest, type: String)
|
55
|
-
base.send(:field, :auth_tokens, type: Array)
|
56
|
-
elsif defined?(ActiveRecord) && base.ancestors.include?(ActiveRecord::Base)
|
57
|
-
base.send(:serialize, :auth_tokens, Array)
|
58
|
-
end
|
52
|
+
base.extend(ClassMethods)
|
59
53
|
|
60
|
-
base.
|
61
|
-
|
54
|
+
base.class_eval do
|
55
|
+
if defined?(Mongoid) && ancestors.include?(Mongoid::Document)
|
56
|
+
field RailsJwtAuth.auth_field_name, type: String
|
57
|
+
field :password_digest, type: String
|
58
|
+
field :auth_tokens, type: Array
|
59
|
+
elsif defined?(ActiveRecord) && ancestors.include?(ActiveRecord::Base)
|
60
|
+
serialize :auth_tokens, Array
|
61
|
+
end
|
62
62
|
|
63
|
-
|
63
|
+
validates RailsJwtAuth.auth_field_name, presence: true, uniqueness: true
|
64
|
+
validates RailsJwtAuth.auth_field_name, email: true if RailsJwtAuth.auth_field_email
|
64
65
|
|
65
|
-
|
66
|
-
self.email = email.downcase if self.email
|
67
|
-
end
|
66
|
+
has_secure_password
|
68
67
|
|
69
|
-
|
68
|
+
before_validation do
|
69
|
+
self.email = email.downcase if email
|
70
|
+
end
|
71
|
+
end
|
70
72
|
end
|
71
73
|
end
|
72
74
|
end
|
@@ -37,34 +37,36 @@ module RailsJwtAuth
|
|
37
37
|
end
|
38
38
|
|
39
39
|
def self.included(base)
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
40
|
+
base.class_eval do
|
41
|
+
if ancestors.include? Mongoid::Document
|
42
|
+
# include GlobalID::Identification to use deliver_later method
|
43
|
+
# http://edgeguides.rubyonrails.org/active_job_basics.html#globalid
|
44
|
+
include GlobalID::Identification if RailsJwtAuth.deliver_later
|
45
|
+
|
46
|
+
field :email, type: String
|
47
|
+
field :unconfirmed_email, type: String
|
48
|
+
field :confirmation_token, type: String
|
49
|
+
field :confirmation_sent_at, type: Time
|
50
|
+
field :confirmed_at, type: Time
|
51
|
+
end
|
51
52
|
|
52
|
-
|
53
|
+
validate :validate_confirmation, if: :confirmed_at_changed?
|
53
54
|
|
54
|
-
|
55
|
-
|
56
|
-
|
55
|
+
after_create do
|
56
|
+
send_confirmation_instructions unless confirmed_at || confirmation_sent_at
|
57
|
+
end
|
57
58
|
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
59
|
+
before_update do
|
60
|
+
if email_changed? && email_was && !confirmed_at_changed?
|
61
|
+
self.unconfirmed_email = email
|
62
|
+
self.email = email_was
|
62
63
|
|
63
|
-
|
64
|
-
|
64
|
+
self.confirmation_token = SecureRandom.base58(24)
|
65
|
+
self.confirmation_sent_at = Time.now
|
65
66
|
|
66
|
-
|
67
|
-
|
67
|
+
mailer = Mailer.confirmation_instructions(self)
|
68
|
+
RailsJwtAuth.deliver_later ? mailer.deliver_later : mailer.deliver
|
69
|
+
end
|
68
70
|
end
|
69
71
|
end
|
70
72
|
end
|
@@ -0,0 +1,113 @@
|
|
1
|
+
module RailsJwtAuth
|
2
|
+
module Invitable
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
def self.included(base)
|
6
|
+
base.extend ClassMethods
|
7
|
+
base.class_eval do
|
8
|
+
if ancestors.include? Mongoid::Document
|
9
|
+
# include GlobalID::Identification to use deliver_later method
|
10
|
+
# http://edgeguides.rubyonrails.org/active_job_basics.html#globalid
|
11
|
+
include GlobalID::Identification if RailsJwtAuth.deliver_later
|
12
|
+
|
13
|
+
field :invitation_token, type: String
|
14
|
+
field :invitation_sent_at, type: Time
|
15
|
+
field :invitation_accepted_at, type: Time
|
16
|
+
field :invitation_created_at, type: Time
|
17
|
+
|
18
|
+
index({invitation_token: 1}, {unique: true})
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
module ClassMethods
|
24
|
+
# Creates an user and sends an invitation to him.
|
25
|
+
# If the user is already invited and pending of completing registration
|
26
|
+
# the invitation is resent by email.
|
27
|
+
# If the user is already registered, it returns the user with a
|
28
|
+
# <tt>:taken</tt> on the email field.
|
29
|
+
#
|
30
|
+
# @param [Hash] attributes Hash containing user's attributes to be filled.
|
31
|
+
# Must contain an email key.
|
32
|
+
#
|
33
|
+
#
|
34
|
+
# @return [user] The user created or found by email.
|
35
|
+
|
36
|
+
def invite!(attributes={})
|
37
|
+
attrs = ActiveSupport::HashWithIndifferentAccess.new(attributes.to_h)
|
38
|
+
auth_field = RailsJwtAuth.auth_field_name
|
39
|
+
auth_attribute = attrs.delete(auth_field)
|
40
|
+
|
41
|
+
raise ArgumentError unless auth_attribute
|
42
|
+
|
43
|
+
record = RailsJwtAuth.model.find_or_initialize_by(auth_field => auth_attribute)
|
44
|
+
record.assign_attributes(attrs)
|
45
|
+
record.invitation_created_at = Time.now.utc if record.new_record?
|
46
|
+
|
47
|
+
unless record.password || record.password_digest
|
48
|
+
password = SecureRandom.base58(16)
|
49
|
+
record.password = password
|
50
|
+
record.password_confirmation = password
|
51
|
+
end
|
52
|
+
|
53
|
+
record.valid?
|
54
|
+
|
55
|
+
if !record.new_record? && !record.invited?
|
56
|
+
record.errors.add(RailsJwtAuth.auth_field_name, :taken)
|
57
|
+
end
|
58
|
+
|
59
|
+
record.invite! if record.errors.empty?
|
60
|
+
record
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
# Accept an invitation by clearing token and setting invitation_accepted_at
|
65
|
+
def accept_invitation
|
66
|
+
self.invitation_accepted_at = Time.now.utc
|
67
|
+
self.invitation_token = nil
|
68
|
+
end
|
69
|
+
|
70
|
+
def accept_invitation!
|
71
|
+
return unless invited?
|
72
|
+
if valid_invitation?
|
73
|
+
accept_invitation
|
74
|
+
# Override confirmable
|
75
|
+
self.confirmed_at = invitation_accepted_at if respond_to? :confirmed_at
|
76
|
+
else
|
77
|
+
errors.add(:invitation_token, :invalid)
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
def invite!
|
82
|
+
generate_invitation_token if invitation_token.nil?
|
83
|
+
self.invitation_created_at = Time.now.utc
|
84
|
+
|
85
|
+
deliver_invitation if save(validate: false)
|
86
|
+
end
|
87
|
+
|
88
|
+
def invited?
|
89
|
+
(persisted? && invitation_token.present?)
|
90
|
+
end
|
91
|
+
|
92
|
+
protected
|
93
|
+
|
94
|
+
def deliver_invitation
|
95
|
+
mailer = Mailer.send_invitation(self)
|
96
|
+
RailsJwtAuth.deliver_later ? mailer.deliver_later : mailer.deliver
|
97
|
+
end
|
98
|
+
|
99
|
+
def generate_invitation_token
|
100
|
+
self.invitation_token = SecureRandom.base58(128)
|
101
|
+
end
|
102
|
+
|
103
|
+
def valid_invitation?
|
104
|
+
invited? && invitation_period_valid?
|
105
|
+
end
|
106
|
+
|
107
|
+
def invitation_period_valid?
|
108
|
+
time = invitation_sent_at || invitation_created_at
|
109
|
+
expiration_time = RailsJwtAuth.invitation_expiration_time
|
110
|
+
time && (expiration_time.to_i.zero? || time.utc >= expiration_time.ago)
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
@@ -31,20 +31,22 @@ module RailsJwtAuth
|
|
31
31
|
end
|
32
32
|
|
33
33
|
def self.included(base)
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
34
|
+
base.class_eval do
|
35
|
+
if base.ancestors.include? Mongoid::Document
|
36
|
+
# include GlobalID::Identification to use deliver_later method
|
37
|
+
# http://edgeguides.rubyonrails.org/active_job_basics.html#globalid
|
38
|
+
include GlobalID::Identification if RailsJwtAuth.deliver_later
|
39
|
+
|
40
|
+
field :reset_password_token, type: String
|
41
|
+
field :reset_password_sent_at, type: Time
|
42
|
+
end
|
42
43
|
|
43
|
-
|
44
|
+
validate :validate_reset_password_token, if: :password_digest_changed?
|
44
45
|
|
45
|
-
|
46
|
-
|
47
|
-
|
46
|
+
before_update do
|
47
|
+
if password_digest_changed? && reset_password_token
|
48
|
+
self.reset_password_token = nil
|
49
|
+
end
|
48
50
|
end
|
49
51
|
end
|
50
52
|
end
|
@@ -7,9 +7,11 @@ module RailsJwtAuth
|
|
7
7
|
end
|
8
8
|
|
9
9
|
def self.included(base)
|
10
|
-
|
11
|
-
|
12
|
-
|
10
|
+
base.class_eval do
|
11
|
+
if defined?(Mongoid) && ancestors.include?(Mongoid::Document)
|
12
|
+
field :last_sign_in_at, type: Time
|
13
|
+
field :last_sign_in_ip, type: String
|
14
|
+
end
|
13
15
|
end
|
14
16
|
end
|
15
17
|
end
|
data/config/locales/en.yml
CHANGED
@@ -7,6 +7,9 @@ en:
|
|
7
7
|
subject: "Reset password instructions"
|
8
8
|
set_password_instructions:
|
9
9
|
subject: "Set password instructions"
|
10
|
+
send_invitation:
|
11
|
+
subject: "Someone has sent you an invitation!"
|
12
|
+
|
10
13
|
errors:
|
11
14
|
unconfirmed: "unconfirmed email"
|
12
15
|
already_confirmed: "was already confirmed, please try signing in"
|
@@ -15,6 +18,7 @@ en:
|
|
15
18
|
invalid: "invalid"
|
16
19
|
blank: "blank"
|
17
20
|
not_found: "not found"
|
21
|
+
missing: "is missing"
|
18
22
|
email:
|
19
23
|
invalid: "is not an email"
|
20
24
|
current_password:
|
@@ -11,5 +11,7 @@ class RailsJwtAuth::InstallGenerator < Rails::Generators::Base
|
|
11
11
|
|
12
12
|
route "resource :confirmation, controller: 'rails_jwt_auth/confirmations', only: [:create, :update]"
|
13
13
|
route "resource :password, controller: 'rails_jwt_auth/passwords', only: [:create, :update]"
|
14
|
+
|
15
|
+
route "resource :invitation, controller: 'rails_jwt_auth/invitations', only: [:create, :update]"
|
14
16
|
end
|
15
17
|
end
|
@@ -40,4 +40,12 @@ RailsJwtAuth.setup do |config|
|
|
40
40
|
|
41
41
|
# uses deliver_later to send emails instead of deliver method
|
42
42
|
#config.deliver_later = false
|
43
|
+
|
44
|
+
# Invitable configuration
|
45
|
+
#
|
46
|
+
# Time an invitation is valid after sent
|
47
|
+
# config.invitation_expiration_time = 2.days
|
48
|
+
#
|
49
|
+
# URL used to create email link to activate invitation
|
50
|
+
# config.accept_invitation_url = 'http://frontend.com/accept_invitation'
|
43
51
|
end
|
data/lib/rails_jwt_auth.rb
CHANGED
@@ -46,6 +46,12 @@ module RailsJwtAuth
|
|
46
46
|
mattr_accessor :deliver_later
|
47
47
|
@@deliver_later = false
|
48
48
|
|
49
|
+
mattr_accessor :invitation_expiration_time
|
50
|
+
@@invitation_expiration_time = 2.days
|
51
|
+
|
52
|
+
mattr_accessor :invitation_url
|
53
|
+
@@invitation_url = nil
|
54
|
+
|
49
55
|
def self.model
|
50
56
|
@@model_name.constantize
|
51
57
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rails_jwt_auth
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.18.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- rjurado
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-12-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -81,6 +81,7 @@ files:
|
|
81
81
|
- app/controllers/concerns/rails_jwt_auth/render_helper.rb
|
82
82
|
- app/controllers/concerns/rails_jwt_auth/warden_helper.rb
|
83
83
|
- app/controllers/rails_jwt_auth/confirmations_controller.rb
|
84
|
+
- app/controllers/rails_jwt_auth/invitations_controller.rb
|
84
85
|
- app/controllers/rails_jwt_auth/passwords_controller.rb
|
85
86
|
- app/controllers/rails_jwt_auth/registrations_controller.rb
|
86
87
|
- app/controllers/rails_jwt_auth/sessions_controller.rb
|
@@ -88,11 +89,13 @@ files:
|
|
88
89
|
- app/mailers/rails_jwt_auth/mailer.rb
|
89
90
|
- app/models/concerns/rails_jwt_auth/authenticatable.rb
|
90
91
|
- app/models/concerns/rails_jwt_auth/confirmable.rb
|
92
|
+
- app/models/concerns/rails_jwt_auth/invitable.rb
|
91
93
|
- app/models/concerns/rails_jwt_auth/recoverable.rb
|
92
94
|
- app/models/concerns/rails_jwt_auth/trackable.rb
|
93
95
|
- app/validators/email_validator.rb
|
94
96
|
- app/views/rails_jwt_auth/mailer/confirmation_instructions.html.erb
|
95
97
|
- app/views/rails_jwt_auth/mailer/reset_password_instructions.html.erb
|
98
|
+
- app/views/rails_jwt_auth/mailer/send_invitation.html.erb
|
96
99
|
- app/views/rails_jwt_auth/mailer/set_password_instructions.html.erb
|
97
100
|
- config/locales/en.yml
|
98
101
|
- lib/generators/rails_jwt_auth/install_generator.rb
|