auth_rails 1.0.2 → 1.1.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a80fe0179e20db84cc1966bd18331d98b3172c4cd5c3b652949ef7bc7a508b0a
4
- data.tar.gz: 6cc51206c4381735dd92f118c8268df20998739cad769bcd2e01211dabb20e76
3
+ metadata.gz: 15e71bc7d2e92cc25d3433db5adbd5608f70c5fbf9de27a234106d95d54d9957
4
+ data.tar.gz: cfab483acafa215d5530e8ec90904cdceadb55bb53074b69ad73c2ef756ab7ca
5
5
  SHA512:
6
- metadata.gz: e7d2ccb1bbd06e8cf115267a998cd0490ac8e9583e5a351ca61c486d0ceafd26fda66eee7995a84e01dd4dd82ed29fa29c4af865cbf2f232b445a48bd6d0bc86
7
- data.tar.gz: 7a2057151c16ea45d74eb88f9a501a232f5e714a713a22dc125b56fbb6f9710c0b02dd39d9364af8ab7a54e002b8cc511d95389d0d1467050470b970f2814ab1
6
+ metadata.gz: 92bbbfb5274f625b03f8879d9b5cf3f6e61d577a8c30e53bda9cd374e74b46fc821717c7bac9f116502d64f5f1fb55571cd424d0583de3a4b260726c0d4c5ffc
7
+ data.tar.gz: c4479a4db819b2ba649fed888c074185c751ffbccb71ba4278c9747c01adb9cb3bcf8e0db5eb47c3db60d7b015cb37bb64c4d4c63cb77bab869a4a0ef45d9da2
data/README.md CHANGED
@@ -165,6 +165,50 @@ module Api
165
165
  end
166
166
  ```
167
167
 
168
+ - In case your identifier is not email
169
+
170
+ ```rb
171
+ Rails.application.config.to_prepare do
172
+ AuthRails.configure do |config|
173
+ config.resource_class = User # required
174
+ config.identifier_name = :username # must be string or symbol, default is email
175
+ end
176
+ end
177
+ ```
178
+
179
+ - If you have a custom method to validate password
180
+
181
+ ```rb
182
+ Rails.application.config.to_prepare do
183
+ AuthRails.configure do |config|
184
+ config.resource_class = User # required
185
+ config.identifier_name = :username # must be string or symbol, default is email
186
+ config.authenticate = ->(resource, password) { resource.password == password } # must be a proc, validate password
187
+ end
188
+ end
189
+ ```
190
+
191
+ - Sometimes, you have a complex logic to get the user
192
+
193
+ ```rb
194
+ Rails.application.config.to_prepare do
195
+ AuthRails.configure do |config|
196
+ config.resource_class = User # required
197
+ config.identifier_name = :username # this one is sub in jwt
198
+ config.dig_params = ->(params) { params[:identifier] } # must be a proc, how to get identifier from params
199
+
200
+ # how to get user from identifier
201
+ # identifier default is params[<identifier_name>]
202
+ # or extract from dig_params
203
+ config.retrieve_resource = lambda { |identifier|
204
+ User.where(email: identifier)
205
+ .or(User.where(username: identifier))
206
+ .first
207
+ }
208
+ end
209
+ end
210
+ ```
211
+
168
212
  # Strategy list
169
213
 
170
214
  - allowed_token
@@ -4,9 +4,9 @@ module AuthRails
4
4
  module Api
5
5
  class AuthController < ApiController
6
6
  def create
7
- resource = AuthRails.resource_class.find_by(email: params[:email])
7
+ resource = AuthRails.retrieve_resource(params: params)
8
8
 
9
- raise AuthRails.error_class, :unauthenticated if resource.blank? || !resource.authenticate(params[:password])
9
+ raise AuthRails.error_class, :unauthenticated if resource.blank? || !AuthRails.authenticate(resource: resource, password: params[:password])
10
10
 
11
11
  respond_to_create(generate_token(resource))
12
12
  end
@@ -43,7 +43,7 @@ module AuthRails
43
43
 
44
44
  def payload(resource)
45
45
  {
46
- sub: resource.email
46
+ sub: resource.send(AuthRails.identifier_name)
47
47
  }
48
48
  end
49
49
 
@@ -10,7 +10,7 @@ module AuthRails
10
10
  secret_key: Configuration::Jwt::AccessToken.secret_key
11
11
  )
12
12
 
13
- CurrentAuth.user = AuthRails.resource_class.find_by(email: payload[:sub])
13
+ CurrentAuth.user = AuthRails.resource_class.find_by(AuthRails.identifier_name => payload[:sub])
14
14
 
15
15
  raise AuthRails.error_class, :unauthenticated unless CurrentAuth.user
16
16
  end
data/auth_rails.gemspec CHANGED
@@ -28,6 +28,7 @@ Gem::Specification.new do |spec|
28
28
  .git
29
29
  .circleci
30
30
  appveyor
31
+ examples/
31
32
  Gemfile
32
33
  .rubocop.yml
33
34
  .vscode/settings.json
data/biome.json ADDED
@@ -0,0 +1,24 @@
1
+ {
2
+ "$schema": "https://biomejs.dev/schemas/1.4.1/schema.json",
3
+ "organizeImports": {
4
+ "enabled": true
5
+ },
6
+ "linter": {
7
+ "enabled": true,
8
+ "rules": {
9
+ "recommended": true,
10
+ "complexity": {
11
+ "useArrowFunction": "off"
12
+ },
13
+ "style": {
14
+ "noParameterAssign": "off"
15
+ }
16
+ }
17
+ },
18
+ "javascript": {
19
+ "formatter": {
20
+ "indentStyle": "space",
21
+ "quoteStyle": "single"
22
+ }
23
+ }
24
+ }
@@ -0,0 +1,90 @@
1
+ import { defineConfig } from 'vitepress';
2
+
3
+ export default defineConfig({
4
+ title: 'AuthRails',
5
+ description: 'Simple authentication for Rails',
6
+ srcDir: './src',
7
+ base: '/auth_rails/',
8
+ themeConfig: {
9
+ nav: [
10
+ {
11
+ text: 'Guide',
12
+ link: '/introduction/what-is-it',
13
+ },
14
+ ],
15
+ sidebar: [
16
+ {
17
+ text: 'Introduction',
18
+ items: [
19
+ {
20
+ text: 'What is AuthRails?',
21
+ link: '/introduction/what-is-it',
22
+ },
23
+ {
24
+ text: 'Getting Started',
25
+ link: '/introduction/getting-started',
26
+ },
27
+ ],
28
+ },
29
+ {
30
+ text: 'CLI',
31
+ items: [
32
+ {
33
+ text: 'Configuration',
34
+ link: '/cli/configuration',
35
+ },
36
+ {
37
+ text: 'Migration',
38
+ link: '/cli/migration',
39
+ },
40
+ ],
41
+ },
42
+ {
43
+ text: 'Customization',
44
+ items: [
45
+ {
46
+ text: 'Custom Strategy',
47
+ link: '/customization/custom-strategy',
48
+ },
49
+ {
50
+ text: 'Custom Response Data',
51
+ link: '/customization/custom-response',
52
+ },
53
+ {
54
+ text: 'Custom Password Validation',
55
+ link: '/customization/custom-password-validation',
56
+ },
57
+ {
58
+ text: 'Custom Identifier Column',
59
+ link: '/customization/custom-identifier',
60
+ },
61
+ {
62
+ text: 'Complex Retrieve Resource',
63
+ link: '/customization/complex-retrieve-resource',
64
+ },
65
+ ],
66
+ },
67
+ {
68
+ text: 'API Reference',
69
+ link: '/api-reference',
70
+ },
71
+ ],
72
+ outline: {
73
+ level: [2, 3],
74
+ label: 'On this page',
75
+ },
76
+ lastUpdated: {
77
+ text: 'Last updated',
78
+ formatOptions: {
79
+ dateStyle: 'full',
80
+ timeStyle: 'medium',
81
+ },
82
+ },
83
+ socialLinks: [
84
+ {
85
+ icon: 'github',
86
+ link: 'https://github.com/zgid123/auth_rails',
87
+ },
88
+ ],
89
+ },
90
+ });
@@ -0,0 +1,362 @@
1
+ # API Reference
2
+
3
+ All features of AuthRails.
4
+
5
+ ## Configuration
6
+
7
+ ### dig_params
8
+
9
+ - Type: `Proc`
10
+ - Default: `nil`
11
+ - Required: `false`
12
+
13
+ Method to extract `identifier` for [`retrieve_resource`](/api-reference.html#retrieve-resource).
14
+
15
+ ```rb
16
+ # frozen_string_literal: true
17
+
18
+ Rails.application.config.to_prepare do
19
+ AuthRails.configure do |config|
20
+ config.resource_class = User
21
+ config.identifier_name = :username
22
+ config.dig_params = ->(params) { params[:identifier] }
23
+
24
+ config.retrieve_resource = lambda { |identifier|
25
+ User.where(email: identifier)
26
+ .or(User.where(username: identifier))
27
+ .first
28
+ }
29
+ end
30
+ end
31
+ ```
32
+
33
+ `identifier_name` will be used for JWT's payload's `sub` if you have `dig_params` configuration.
34
+
35
+ ### error_class
36
+
37
+ - Type: `Class`
38
+ - Default: `nil`
39
+ - Required: `false`
40
+
41
+ Custom error class for AuthRails.
42
+
43
+ Whenever AuthRails raises error, it will raise your error.
44
+
45
+ ```rb
46
+ # frozen_string_literal: true
47
+
48
+ Rails.application.config.to_prepare do
49
+ AuthRails.configure do |config|
50
+ config.resource_class = User
51
+ config.error_class = YourError
52
+ end
53
+ end
54
+ ```
55
+
56
+ ### authenticate
57
+
58
+ - Type: `Proc`
59
+ - Default: `nil`
60
+ - Required: `false`
61
+
62
+ Custom method to validate your user password. If not provided, you must add `has_secure_password` to your model. Or create a method called `authenticate` to do the validation for your model. Or else it will raise error.
63
+
64
+ ```rb
65
+ # frozen_string_literal: true
66
+
67
+ Rails.application.config.to_prepare do
68
+ AuthRails.configure do |config|
69
+ config.resource_class = User
70
+ config.authenticate = ->(resource, password) { resource.password == password }
71
+ end
72
+ end
73
+ ```
74
+
75
+ ### resource_class
76
+
77
+ - Type: `Class`
78
+ - Default: `nil`
79
+ - Required: `true`
80
+
81
+ Your own class to do sign in. Usually it is `User`.
82
+
83
+ ```rb
84
+ # frozen_string_literal: true
85
+
86
+ Rails.application.config.to_prepare do
87
+ AuthRails.configure do |config|
88
+ config.resource_class = User
89
+ end
90
+ end
91
+ ```
92
+
93
+ ### identifier_name
94
+
95
+ - Type: `String` | `Symbol`
96
+ - Default: `:email`
97
+ - Required: `false`
98
+
99
+ Your resource class identifier.
100
+
101
+ ```rb
102
+ # frozen_string_literal: true
103
+
104
+ Rails.application.config.to_prepare do
105
+ AuthRails.configure do |config|
106
+ config.resource_class = User
107
+ config.identifier_name = :username
108
+ end
109
+ end
110
+ ```
111
+
112
+ ### retrieve_resource
113
+
114
+ - Type: `Proc`
115
+ - Default: `nil`
116
+ - Required: `false`
117
+
118
+ Method to custom how to get resource when your project requires a complex logic.
119
+
120
+ ```rb
121
+ # frozen_string_literal: true
122
+
123
+ Rails.application.config.to_prepare do
124
+ AuthRails.configure do |config|
125
+ config.resource_class = User
126
+ config.identifier_name = :username
127
+ config.dig_params = ->(params) { params[:identifier] }
128
+
129
+ config.retrieve_resource = lambda { |identifier|
130
+ User.where(email: identifier)
131
+ .or(User.where(username: identifier))
132
+ .first
133
+ }
134
+ end
135
+ end
136
+ ```
137
+
138
+ #### config.identifier_name
139
+
140
+ This is used for JWT's payload's `sub`.
141
+
142
+ #### config.dig_params
143
+
144
+ This extracts `identifier` from parameters for the provided method.
145
+
146
+ ## JWT Configuration
147
+
148
+ ### jwt.strategy
149
+
150
+ - Type: `Class`
151
+ - Default: `AuthRails::Strategies::BaseStrategy`
152
+ - Required: `false`
153
+
154
+ Specify which strategy to handle `refresh_token`.
155
+
156
+ ```rb
157
+ # frozen_string_literal: true
158
+
159
+ class YourOwnStrategy < AuthRails::Strategies::BaseStrategy
160
+ end
161
+
162
+ AuthRails.configure do |config|
163
+ config.jwt do |jwt|
164
+ jwt.strategy = YourOwnStrategy
165
+ end
166
+ end
167
+ ```
168
+
169
+ ## JWT Access Token Configuration
170
+
171
+ ### access_token.exp
172
+
173
+ - Type: `ActiveSupport::TimeWithZone`
174
+ - Default: `nil`
175
+ - Required: `false`
176
+
177
+ Expiry time for `access_token`.
178
+
179
+ ```rb
180
+ # frozen_string_literal: true
181
+
182
+ AuthRails.configure do |config|
183
+ config.jwt do |jwt|
184
+ jwt.strategy = AuthRails::Strategies::AllowedTokenStrategy
185
+
186
+ jwt.access_token do |access_token|
187
+ access_token.exp = 1.hour.since
188
+ end
189
+ end
190
+ end
191
+ ```
192
+
193
+ ### access_token.algorithm
194
+
195
+ - Type: `string`
196
+ - Default: `HS256`
197
+ - Required: `false`
198
+
199
+ Algorithm for JWT generator.
200
+
201
+ ```rb
202
+ # frozen_string_literal: true
203
+
204
+ AuthRails.configure do |config|
205
+ config.jwt do |jwt|
206
+ jwt.strategy = AuthRails::Strategies::AllowedTokenStrategy
207
+
208
+ jwt.access_token do |access_token|
209
+ access_token.exp = 1.hour.since
210
+ access_token.algorithm = 'HS384'
211
+ end
212
+ end
213
+ end
214
+ ```
215
+
216
+ ### access_token.secret_key
217
+
218
+ - Type: `string`
219
+ - Default: `nil`
220
+ - Required: `false`
221
+
222
+ Secret token for JWT generator.
223
+
224
+ ```rb
225
+ # frozen_string_literal: true
226
+
227
+ AuthRails.configure do |config|
228
+ config.jwt do |jwt|
229
+ jwt.strategy = AuthRails::Strategies::AllowedTokenStrategy
230
+
231
+ jwt.access_token do |access_token|
232
+ access_token.exp = 1.hour.since
233
+ access_token.algorithm = 'HS384'
234
+ access_token.secret_key = 'My Secret Key'
235
+ end
236
+ end
237
+ end
238
+ ```
239
+
240
+ ## JWT Refresh Token Configuration
241
+
242
+ ### refresh_token.exp
243
+
244
+ - Type: `ActiveSupport::TimeWithZone`
245
+ - Default: `nil`
246
+ - Required: `false`
247
+
248
+ Expiry time for `refresh_token`.
249
+
250
+ ```rb
251
+ # frozen_string_literal: true
252
+
253
+ AuthRails.configure do |config|
254
+ config.jwt do |jwt|
255
+ jwt.strategy = AuthRails::Strategies::AllowedTokenStrategy
256
+
257
+ jwt.refresh_token do |refresh_token|
258
+ refresh_token.exp = 1.hour.since
259
+ end
260
+ end
261
+ end
262
+ ```
263
+
264
+ ### refresh_token.algorithm
265
+
266
+ - Type: `string`
267
+ - Default: `nil`
268
+ - Required: `false`
269
+
270
+ Algorithm for JWT generator.
271
+
272
+ ```rb
273
+ # frozen_string_literal: true
274
+
275
+ AuthRails.configure do |config|
276
+ config.jwt do |jwt|
277
+ jwt.strategy = AuthRails::Strategies::AllowedTokenStrategy
278
+
279
+ jwt.refresh_token do |refresh_token|
280
+ refresh_token.exp = 1.hour.since
281
+ refresh_token.algorithm = 'HS384'
282
+ end
283
+ end
284
+ end
285
+ ```
286
+
287
+ ### refresh_token.secret_key
288
+
289
+ - Type: `string`
290
+ - Default: `nil`
291
+ - Required: `false`
292
+
293
+ Secret token for JWT generator.
294
+
295
+ ```rb
296
+ # frozen_string_literal: true
297
+
298
+ AuthRails.configure do |config|
299
+ config.jwt do |jwt|
300
+ jwt.strategy = AuthRails::Strategies::AllowedTokenStrategy
301
+
302
+ jwt.refresh_token do |refresh_token|
303
+ refresh_token.exp = 1.hour.since
304
+ refresh_token.algorithm = 'HS384'
305
+ refresh_token.secret_key = 'My Secret Key'
306
+ end
307
+ end
308
+ end
309
+ ```
310
+
311
+ ### refresh_token.http_only
312
+
313
+ - Type: `boolean`
314
+ - Default: `false`
315
+ - Required: `false`
316
+
317
+ If true, before respond the `refresh_token`, AuthRails will set `refresh_token` as `httpOnly` cookie.
318
+
319
+ Cookie key will be `ref_tok`.
320
+
321
+ ```rb
322
+ # frozen_string_literal: true
323
+
324
+ AuthRails.configure do |config|
325
+ config.jwt do |jwt|
326
+ jwt.strategy = AuthRails::Strategies::AllowedTokenStrategy
327
+
328
+ jwt.refresh_token do |refresh_token|
329
+ refresh_token.http_only = true
330
+ refresh_token.exp = 1.hour.since
331
+ refresh_token.algorithm = 'HS384'
332
+ refresh_token.secret_key = 'My Secret Key'
333
+ end
334
+ end
335
+ end
336
+ ```
337
+
338
+ ### refresh_token.cookie_key
339
+
340
+ - Type: `String` | `Symbol`
341
+ - Default: `false`
342
+ - Required: `false`
343
+
344
+ Set cookie key for AuthRails when [`refresh_token.http_only`](/api-reference.html#refresh-token-http-only) is enabled.
345
+
346
+ ```rb
347
+ # frozen_string_literal: true
348
+
349
+ AuthRails.configure do |config|
350
+ config.jwt do |jwt|
351
+ jwt.strategy = AuthRails::Strategies::AllowedTokenStrategy
352
+
353
+ jwt.refresh_token do |refresh_token|
354
+ refresh_token.http_only = true
355
+ refresh_token.exp = 1.hour.since
356
+ refresh_token.algorithm = 'HS384'
357
+ refresh_token.cookie_key = :my_ref_tok
358
+ refresh_token.secret_key = 'My Secret Key'
359
+ end
360
+ end
361
+ end
362
+ ```