api_authentication_gem 0.1.4 → 0.4.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.
@@ -0,0 +1,21 @@
1
+ module ApiAuthenticationGem
2
+ class Lockout < ::ActiveRecord::Base
3
+ self.table_name = "api_auth_lockouts"
4
+
5
+ validates :identifier, presence: true, uniqueness: true
6
+
7
+ def locked?
8
+ locked_until.present? && locked_until > Time.now
9
+ end
10
+
11
+ def minutes_remaining
12
+ return 0 unless locked?
13
+
14
+ ((locked_until - Time.now) / 60).ceil
15
+ end
16
+
17
+ def reset!
18
+ update!(failed_attempts: 0, locked_until: nil)
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,22 @@
1
+ module ApiAuthenticationGem
2
+ class MagicLink < ::ActiveRecord::Base
3
+ self.table_name = "api_auth_magic_links"
4
+
5
+ validates :identifier, :token, :expires_at, presence: true
6
+ validates :token, uniqueness: true
7
+
8
+ scope :active, -> { where(used_at: nil).where("expires_at > ?", Time.now) }
9
+
10
+ def expired?
11
+ expires_at <= Time.now
12
+ end
13
+
14
+ def used?
15
+ !used_at.nil?
16
+ end
17
+
18
+ def consume!
19
+ update!(used_at: Time.now)
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,23 @@
1
+ module ApiAuthenticationGem
2
+ class PasswordReset < ::ActiveRecord::Base
3
+ self.table_name = "api_auth_password_resets"
4
+
5
+ validates :identifier, :token, :expires_at, presence: true
6
+ validates :token, uniqueness: true
7
+
8
+ # Only tokens that haven't been used and haven't expired
9
+ scope :active, -> { where(used_at: nil).where("expires_at > ?", Time.now) }
10
+
11
+ def expired?
12
+ expires_at <= Time.now
13
+ end
14
+
15
+ def used?
16
+ !used_at.nil?
17
+ end
18
+
19
+ def consume!
20
+ update!(used_at: Time.now)
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,18 @@
1
+ module ApiAuthenticationGem
2
+ class RefreshToken < ::ActiveRecord::Base
3
+ self.table_name = "api_auth_refresh_tokens"
4
+
5
+ validates :user_id, :token, :expires_at, presence: true
6
+ validates :token, uniqueness: true
7
+
8
+ scope :active, -> { where(revoked_at: nil).where("expires_at > ?", Time.now) }
9
+
10
+ def active?
11
+ revoked_at.nil? && expires_at > Time.now
12
+ end
13
+
14
+ def revoke!
15
+ update!(revoked_at: Time.now)
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,19 @@
1
+ module ApiAuthenticationGem
2
+ class RevokedToken < ::ActiveRecord::Base
3
+ self.table_name = "api_auth_revoked_tokens"
4
+
5
+ validates :jti, :expires_at, presence: true
6
+ validates :jti, uniqueness: true
7
+
8
+ def self.revoked?(jti)
9
+ return false if jti.nil?
10
+
11
+ where(jti: jti).exists?
12
+ end
13
+
14
+ # Prune entries whose tokens have already expired — safe to call from a cron job.
15
+ def self.cleanup!
16
+ where("expires_at < ?", Time.now).delete_all
17
+ end
18
+ end
19
+ end
@@ -1,3 +1,3 @@
1
1
  module ApiAuthenticationGem
2
- VERSION = "0.1.4"
2
+ VERSION = "0.4.0".freeze
3
3
  end
@@ -1,6 +1,15 @@
1
+ require "active_record"
1
2
  require "api_authentication_gem/version"
3
+ require "api_authentication_gem/errors"
2
4
  require "api_authentication_gem/configuration"
5
+ require "api_authentication_gem/models/refresh_token"
6
+ require "api_authentication_gem/models/revoked_token"
7
+ require "api_authentication_gem/models/password_reset"
8
+ require "api_authentication_gem/models/lockout"
9
+ require "api_authentication_gem/models/magic_link"
10
+ require "api_authentication_gem/models/auth_session"
3
11
  require "api_authentication_gem/auth"
12
+ require "api_authentication_gem/concerns/authenticatable"
4
13
 
5
14
  module ApiAuthenticationGem
6
15
  def self.configuration
@@ -9,5 +18,10 @@ module ApiAuthenticationGem
9
18
 
10
19
  def self.configure
11
20
  yield(configuration)
21
+ configuration.validate!
22
+ end
23
+
24
+ def self.reset_configuration!
25
+ @configuration = nil
12
26
  end
13
27
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: api_authentication_gem
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Adarsh Mishra
@@ -9,36 +9,78 @@ bindir: bin
9
9
  cert_chain: []
10
10
  date: 1980-01-02 00:00:00.000000000 Z
11
11
  dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: activerecord
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - ">="
17
+ - !ruby/object:Gem::Version
18
+ version: '6.0'
19
+ type: :runtime
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - ">="
24
+ - !ruby/object:Gem::Version
25
+ version: '6.0'
26
+ - !ruby/object:Gem::Dependency
27
+ name: activesupport
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: '6.0'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: '6.0'
12
40
  - !ruby/object:Gem::Dependency
13
41
  name: bcrypt
14
42
  requirement: !ruby/object:Gem::Requirement
15
43
  requirements:
16
44
  - - ">="
17
45
  - !ruby/object:Gem::Version
18
- version: '0'
46
+ version: '3.1'
19
47
  type: :runtime
20
48
  prerelease: false
21
49
  version_requirements: !ruby/object:Gem::Requirement
22
50
  requirements:
23
51
  - - ">="
24
52
  - !ruby/object:Gem::Version
25
- version: '0'
53
+ version: '3.1'
26
54
  - !ruby/object:Gem::Dependency
27
55
  name: jwt
28
56
  requirement: !ruby/object:Gem::Requirement
29
57
  requirements:
30
58
  - - ">="
31
59
  - !ruby/object:Gem::Version
32
- version: '0'
60
+ version: '2.0'
33
61
  type: :runtime
34
62
  prerelease: false
35
63
  version_requirements: !ruby/object:Gem::Requirement
36
64
  requirements:
37
65
  - - ">="
38
66
  - !ruby/object:Gem::Version
39
- version: '0'
67
+ version: '2.0'
40
68
  - !ruby/object:Gem::Dependency
41
69
  name: rspec
70
+ requirement: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: '3.0'
75
+ type: :development
76
+ prerelease: false
77
+ version_requirements: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ version: '3.0'
82
+ - !ruby/object:Gem::Dependency
83
+ name: rspec_junit_formatter
42
84
  requirement: !ruby/object:Gem::Requirement
43
85
  requirements:
44
86
  - - ">="
@@ -52,7 +94,49 @@ dependencies:
52
94
  - !ruby/object:Gem::Version
53
95
  version: '0'
54
96
  - !ruby/object:Gem::Dependency
55
- name: rspec-rails
97
+ name: rubocop
98
+ requirement: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - "~>"
101
+ - !ruby/object:Gem::Version
102
+ version: '1.65'
103
+ type: :development
104
+ prerelease: false
105
+ version_requirements: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - "~>"
108
+ - !ruby/object:Gem::Version
109
+ version: '1.65'
110
+ - !ruby/object:Gem::Dependency
111
+ name: rubocop-performance
112
+ requirement: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - "~>"
115
+ - !ruby/object:Gem::Version
116
+ version: '1.21'
117
+ type: :development
118
+ prerelease: false
119
+ version_requirements: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - "~>"
122
+ - !ruby/object:Gem::Version
123
+ version: '1.21'
124
+ - !ruby/object:Gem::Dependency
125
+ name: rubocop-rspec
126
+ requirement: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - "~>"
129
+ - !ruby/object:Gem::Version
130
+ version: '3.0'
131
+ type: :development
132
+ prerelease: false
133
+ version_requirements: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - "~>"
136
+ - !ruby/object:Gem::Version
137
+ version: '3.0'
138
+ - !ruby/object:Gem::Dependency
139
+ name: sqlite3
56
140
  requirement: !ruby/object:Gem::Requirement
57
141
  requirements:
58
142
  - - ">="
@@ -65,18 +149,28 @@ dependencies:
65
149
  - - ">="
66
150
  - !ruby/object:Gem::Version
67
151
  version: '0'
68
- description: 'Reusable gem for authentication with user-defined models. For detailed
69
- usage, visit: https://github.com/Adarsh-07-Mishra/api_authentication_gem/blob/main/README.md'
152
+ description: Drop-in JWT signup/login for Rails API apps. Configurable user model,
153
+ token expiry, password validation, and a ready-made controller concern. See https://github.com/Adarsh-07-Mishra/api_authentication_gem
154
+ for full docs.
70
155
  email:
71
- - aadimishra24@gmail.com
156
+ - aadimishra277@gmail.com
72
157
  executables: []
73
158
  extensions: []
74
159
  extra_rdoc_files: []
75
160
  files:
161
+ - LICENSE.txt
76
162
  - README.md
77
163
  - lib/api_authentication_gem.rb
78
164
  - lib/api_authentication_gem/auth.rb
165
+ - lib/api_authentication_gem/concerns/authenticatable.rb
79
166
  - lib/api_authentication_gem/configuration.rb
167
+ - lib/api_authentication_gem/errors.rb
168
+ - lib/api_authentication_gem/models/auth_session.rb
169
+ - lib/api_authentication_gem/models/lockout.rb
170
+ - lib/api_authentication_gem/models/magic_link.rb
171
+ - lib/api_authentication_gem/models/password_reset.rb
172
+ - lib/api_authentication_gem/models/refresh_token.rb
173
+ - lib/api_authentication_gem/models/revoked_token.rb
80
174
  - lib/api_authentication_gem/version.rb
81
175
  homepage: https://github.com/Adarsh-07-Mishra/api_authentication_gem
82
176
  licenses:
@@ -89,14 +183,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
89
183
  requirements:
90
184
  - - ">="
91
185
  - !ruby/object:Gem::Version
92
- version: '0'
186
+ version: 3.1.0
93
187
  required_rubygems_version: !ruby/object:Gem::Requirement
94
188
  requirements:
95
189
  - - ">="
96
190
  - !ruby/object:Gem::Version
97
191
  version: '0'
98
192
  requirements: []
99
- rubygems_version: 3.6.8
193
+ rubygems_version: 3.6.7
100
194
  specification_version: 4
101
- summary: Provides JWT-based signup and login for APIs
195
+ summary: Production-ready JWT authentication for Rails APIs
102
196
  test_files: []