has_jwt_token 0.1.0 → 0.2.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3889be0fdd07a34e02b65d48948ab746f26482698767ac83ba8c680bd13272cf
4
- data.tar.gz: d528aa140d822a2c73c3263d8e7d950cff7e84e6203bb2b48a22f3be654d07f5
3
+ metadata.gz: 1bd6891ae551f486aecfa6de00f54b1318bd0383c7a19db1d590a371181f1db2
4
+ data.tar.gz: f1855497a20c4f4713bf58ae2d79480973342ef86fe71d641102888cfbac41db
5
5
  SHA512:
6
- metadata.gz: c8e1d855921667fe5b374c0b74666ea4fbbe66471f7d59ddef9b40f82a7bd7f1f11d9c01f403ce72e10389c8217a1752044688b71e926984745bb7338444f7a4
7
- data.tar.gz: 6f0f3801e6cceac529f238dc316a4876791e13a0e2b1c7a6d29bae1fc33a95a19336eaa94e3f90d4044ceaa586c03c53b44531787986fac2ea86a17687ae213d
6
+ metadata.gz: d0ec13c04d6175004eca4dfb51e9f19f620fa022c09c1322b883fcf6e47b49473972a0a82bf27ed8c7c583fdd7d67fb8afe3c57020ffed555edf8b7f1e0464b5
7
+ data.tar.gz: ad1c861ab14616785139c30025097e4665d4d2f172914b30b617d67bc7ef758e5fc94f7b62f906df8dfa76c245256858fd4ec0cd00c19529793f6b5cffd33395
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- has_jwt_token (0.1.0)
4
+ has_jwt_token (0.2.0)
5
5
  bcrypt
6
6
  jwt
7
7
  rails (>= 5.0, < 7.0)
data/README.md CHANGED
@@ -31,7 +31,10 @@ class User
31
31
 
32
32
  has_jwt_token do |jwt|
33
33
  jwt.algorithm 'HS256'
34
- jwt.payload_attribute :name
34
+ jwt.payload :name # model attribute #name
35
+ jwt.payload :custom_proc_class_method, -> { dummy_class_method }
36
+ jwt.payload :custom_proc_istance_method, ->(model) { model.dummy_instance_method }
37
+ jwt.payload :custom_plain_value, 321
35
38
  jwt.secret 'secret'
36
39
 
37
40
  jwt.expiration_time -> { Time.now.to_i + 60 }
@@ -43,8 +46,17 @@ class User
43
46
  jwt.subject :dummy_app
44
47
  end
45
48
  end
49
+
50
+ user = User.last
51
+
52
+ user.authenicate(password) # => user with @token
53
+ user.auhtenticate_with_jwt(token) # => user with @token
46
54
  ```
47
55
 
56
+ ## Roadmap
57
+ * Add blacklisted tokens managment
58
+ * Remove Rails depedency
59
+
48
60
  ## Development
49
61
 
50
62
  After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
@@ -4,10 +4,12 @@ require 'has_jwt_token/jwt_configuration'
4
4
 
5
5
  module HasJwtToken
6
6
  module HasJwtModelConfiguration
7
- def has_jwt_token
8
- @has_jwt_token ||= JwtConfiguration.new(self)
7
+ def has_jwt_token(model = nil)
8
+ @has_jwt_token ||= JwtConfiguration.new
9
9
  yield(@has_jwt_token) if block_given?
10
- @has_jwt_token
10
+ @has_jwt_token.tap do |config|
11
+ config.model = model if model
12
+ end
11
13
  end
12
14
  end
13
15
  end
@@ -12,13 +12,12 @@ module HasJwtToken
12
12
  subject: :sub
13
13
  }.freeze
14
14
 
15
- attr_accessor :defined_claims
16
- attr_reader :model
17
- attr_writer :payload_attribute
15
+ attr_accessor :model
16
+ attr_reader :defined_claims
18
17
 
19
- def initialize(model)
20
- @model = model
21
- @payload_attribute = []
18
+ def initialize
19
+ @payload = {}
20
+ @header = {}
22
21
  @defined_claims = []
23
22
  end
24
23
 
@@ -28,29 +27,55 @@ module HasJwtToken
28
27
  @algorithm = value
29
28
  end
30
29
 
31
- def payload_attribute(value = nil)
32
- return @payload_attribute unless value
30
+ def secret(value = nil)
31
+ return @secret unless value
33
32
 
34
- payload_attribute << value
33
+ @secret = value
35
34
  end
36
35
 
37
- CLAIMS.each do |claim_name, _|
36
+ CLAIMS.each_key do |claim_name|
38
37
  define_method(claim_name) do |value = nil|
39
- if value
40
- defined_claims << claim_name unless defined_claims.include?(claim_name)
41
- instance_variable_set("@#{claim_name}".to_sym, value)
42
- return value
38
+ unless value
39
+ claim_value = instance_variable_get("@#{claim_name}".to_sym)
40
+ return claim_value.is_a?(Proc) ? claim_value.call : claim_value
43
41
  end
44
42
 
45
- claim_value = instance_variable_get("@#{claim_name}".to_sym)
46
- claim_value.is_a?(Proc) ? claim_value.call : claim_value
43
+ @defined_claims |= [claim_name]
44
+ instance_variable_set("@#{claim_name}".to_sym, value)
47
45
  end
48
46
  end
49
47
 
50
- def secret(value = nil)
51
- return @secret unless value
48
+ def model_payload
49
+ @payload.transform_values do |val|
50
+ next val if !val.is_a?(Proc) || !model
52
51
 
53
- @secret = value
52
+ begin
53
+ val.call(model)
54
+ rescue ArgumentError
55
+ val.call
56
+ end
57
+ end
58
+ end
59
+
60
+ def payload(name = nil, value = nil)
61
+ @payload[name] = value || ->(model) { model.respond_to?(name) && model.public_send(name) } if name
62
+ end
63
+
64
+ def claims_payload
65
+ defined_claims.each_with_object({}) do |claim_name, memo|
66
+ claim_key = CLAIMS[claim_name]
67
+ memo[claim_key] = public_send(claim_name)
68
+ end
69
+ end
70
+
71
+ def header(name = nil, value = nil)
72
+ @header[name] = value if name
73
+ end
74
+
75
+ def header_fields
76
+ @header.transform_values do |val|
77
+ val.is_a?(Proc) ? val.call : val
78
+ end
54
79
  end
55
80
  end
56
81
  end
@@ -4,16 +4,17 @@ require 'jwt'
4
4
 
5
5
  module HasJwtToken
6
6
  class JwtProxy
7
- attr_reader :algorithm, :payload, :secret
7
+ attr_reader :algorithm, :payload, :secret, :header_fields
8
8
 
9
- def initialize(algorithm: nil, payload: nil, secret: nil)
9
+ def initialize(algorithm: '', payload: {}, secret: '', header_fields: {})
10
10
  @algorithm = algorithm
11
11
  @payload = payload
12
12
  @secret = secret
13
+ @header_fields = header_fields
13
14
  end
14
15
 
15
16
  def encode
16
- JWT.encode(payload, secret, algorithm)
17
+ JWT.encode(payload, secret, algorithm, header_fields)
17
18
  end
18
19
 
19
20
  def decode(token)
@@ -4,8 +4,7 @@ require 'has_jwt_token/jwt_proxy'
4
4
 
5
5
  module HasJwtToken
6
6
  module JwtTokenable
7
- delegate :algorithm, :secret, :payload_attribute,
8
- :defined_claims, to: :has_jwt_token
7
+ delegate :algorithm, :secret, :claims_payload, :header_fields, to: :has_jwt_token
9
8
 
10
9
  def encode
11
10
  with_jwt_configuration(&:encode)
@@ -19,27 +18,14 @@ module HasJwtToken
19
18
  with_jwt_configuration { |jwt| jwt.decode!(token) }
20
19
  end
21
20
 
22
- private
23
-
24
21
  def has_jwt_token
25
- self.class.has_jwt_token
26
- end
27
-
28
- def payload
29
- @payload ||= model_payload.merge(claims_payload)
22
+ self.class.has_jwt_token(self)
30
23
  end
31
24
 
32
- def model_payload
33
- payload_attribute.each_with_object({}) do |attribute, memo|
34
- memo[attribute] = public_send(attribute)
35
- end
36
- end
25
+ private
37
26
 
38
- def claims_payload
39
- defined_claims.each_with_object({}) do |claim_name, memo|
40
- claim_key = HasJwtToken::JwtConfiguration::CLAIMS[claim_name]
41
- memo[claim_key] = has_jwt_token.public_send(claim_name)
42
- end
27
+ def payload
28
+ @payload ||= has_jwt_token.model_payload.merge(claims_payload)
43
29
  end
44
30
 
45
31
  def with_jwt_configuration
@@ -50,7 +36,8 @@ module HasJwtToken
50
36
  @jwt_proxy ||= JwtProxy.new(
51
37
  algorithm: algorithm,
52
38
  payload: payload,
53
- secret: secret
39
+ secret: secret,
40
+ header_fields: header_fields
54
41
  )
55
42
  end
56
43
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module HasJwtToken
4
- VERSION = '0.1.0'
4
+ VERSION = '0.2.0'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: has_jwt_token
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jokūbas Pučinskas
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-10-25 00:00:00.000000000 Z
11
+ date: 2020-10-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bcrypt