auth_rails 1.0.2 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +44 -0
- data/app/controllers/auth_rails/api/auth_controller.rb +3 -3
- data/app/controllers/concerns/auth_rails/authentication.rb +1 -1
- data/auth_rails.gemspec +1 -0
- data/lib/auth_rails/class_methods.rb +44 -0
- data/lib/auth_rails/config.rb +6 -2
- data/lib/auth_rails/strategies/allowed_token_strategy.rb +1 -1
- data/lib/auth_rails/strategies/base_strategy.rb +1 -1
- data/lib/auth_rails/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c69df81c88cacdf202e2c49cf329423ded23e509fc2dc67fd60d07fda1fbe12e
|
4
|
+
data.tar.gz: abbad690e4211d181950af7bf542e2df367b79c0c79c049f32c5192188106f4f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b97b6c42ed2386b526ce58bbc9e8fd2982e7b60357adebfb0c547f3b3cbf6d07f6cbca8e4cf13871a42f69935ae09daf2dc7528563dd024dcc95dc95e8611f5a
|
7
|
+
data.tar.gz: 758425cb02330e2efd68fedc8730e4b8879136098f0ecfb1d9543812e8220fdbc51f8ec1eaa15c19a09d17e29788c4968969121e08c9a6cf922a2ea4b60e005e
|
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.
|
7
|
+
resource = AuthRails.retrieve_resource(params: params)
|
8
8
|
|
9
|
-
raise AuthRails.error_class, :unauthenticated if resource.blank? || !
|
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.
|
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(
|
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
@@ -14,6 +14,10 @@ module AuthRails
|
|
14
14
|
@resource_class ||= Config.resource_class
|
15
15
|
end
|
16
16
|
|
17
|
+
def identifier_name
|
18
|
+
@identifier_name ||= Config.identifier_name.to_sym || :email
|
19
|
+
end
|
20
|
+
|
17
21
|
def error_class
|
18
22
|
@error_class ||= Config.error_class || Error
|
19
23
|
end
|
@@ -21,5 +25,45 @@ module AuthRails
|
|
21
25
|
def jwt_strategy
|
22
26
|
@jwt_strategy ||= Configuration::Jwt.strategy || Strategies::BaseStrategy
|
23
27
|
end
|
28
|
+
|
29
|
+
def authenticate(resource:, password:)
|
30
|
+
if Config.authenticate.present?
|
31
|
+
raise_if_not_proc(Config.authenticate, 'Config.authenticate')
|
32
|
+
|
33
|
+
Config.authenticate.call(resource, password)
|
34
|
+
else
|
35
|
+
raise 'Don\'t know how to authenticate resource with password' unless resource.respond_to?(:authenticate)
|
36
|
+
|
37
|
+
resource.authenticate(password)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def dig_params(params:)
|
42
|
+
if Config.dig_params.present?
|
43
|
+
raise_if_not_proc(Config.dig_params, 'Config.dig_params')
|
44
|
+
|
45
|
+
Config.dig_params.call(params)
|
46
|
+
else
|
47
|
+
params[AuthRails.identifier_name]
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def retrieve_resource(params:)
|
52
|
+
identifier = dig_params(params: params)
|
53
|
+
|
54
|
+
if Config.retrieve_resource.present?
|
55
|
+
raise_if_not_proc(Config.retrieve_resource, 'Config.retrieve_resource')
|
56
|
+
|
57
|
+
return Config.retrieve_resource.call(identifier)
|
58
|
+
end
|
59
|
+
|
60
|
+
AuthRails.resource_class.find_by(AuthRails.identifier_name => identifier)
|
61
|
+
end
|
62
|
+
|
63
|
+
private
|
64
|
+
|
65
|
+
def raise_if_not_proc(source, name)
|
66
|
+
raise "#{name} must be a Proc" unless source.is_a?(Proc)
|
67
|
+
end
|
24
68
|
end
|
25
69
|
end
|
data/lib/auth_rails/config.rb
CHANGED
@@ -3,8 +3,12 @@
|
|
3
3
|
module AuthRails
|
4
4
|
class Config
|
5
5
|
class << self
|
6
|
-
attr_accessor :
|
7
|
-
:
|
6
|
+
attr_accessor :dig_params,
|
7
|
+
:error_class,
|
8
|
+
:authenticate,
|
9
|
+
:resource_class,
|
10
|
+
:identifier_name,
|
11
|
+
:retrieve_resource
|
8
12
|
|
9
13
|
def jwt
|
10
14
|
yield Configuration::Jwt
|
@@ -11,7 +11,7 @@ module AuthRails
|
|
11
11
|
.joins(:allowed_tokens)
|
12
12
|
.where(allowed_tokens: symbolized_payload.slice(:jti, :aud))
|
13
13
|
.where('allowed_tokens.exp > ?', Time.current)
|
14
|
-
.find_by(
|
14
|
+
.find_by(AuthRails.identifier_name => symbolized_payload[:sub])
|
15
15
|
end
|
16
16
|
|
17
17
|
def gen_token(resource:, payload:, exp: nil, secret_key: nil, algorithm: nil)
|
@@ -8,7 +8,7 @@ module AuthRails
|
|
8
8
|
symbolized_payload = payload.symbolize_keys
|
9
9
|
|
10
10
|
AuthRails.resource_class
|
11
|
-
.find_by(
|
11
|
+
.find_by(AuthRails.identifier_name => symbolized_payload[:sub])
|
12
12
|
end
|
13
13
|
|
14
14
|
def gen_token(payload:, exp: nil, secret_key: nil, algorithm: nil, jti: nil, **)
|
data/lib/auth_rails/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: auth_rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Alpha
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-01-
|
11
|
+
date: 2024-01-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: jwt
|