warden-jwt_auth 0.3.5 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 581e544d6b6fccb8635aac2719efefbbb5b760e8
4
- data.tar.gz: e36d38d069f456bccc0b8eece033c7419da005ac
2
+ SHA256:
3
+ metadata.gz: ac884c1ecfe8201fe9973503bcb067186a2683b290828d9b5bac8b3667929f6d
4
+ data.tar.gz: 26f14054831f628f83c083709fd8e044182eb28bcef092110c48c386009576fb
5
5
  SHA512:
6
- metadata.gz: e8b1e212fa604ed3b2af19aa44392c625f6192869750d479be7af50f0c426c5961fa91497d95385d5bfa452b528fadf474283f744880debba8547c7d16329177
7
- data.tar.gz: 67a9837cc9c55f1fd4cf1970d1891e68c3e59a8262e4161835e398b827fc1074b5f8df9ba3121196dec197e51237c024b0f708139e633437e4c0ba547c101385
6
+ metadata.gz: dadca31dc64203c56ca77c98e69a8bfc48813e2bf0a61a52ee8741f7a08df9c71d96aa481ca424e908b3ba1e8f979f36544244e8545bba6b0e83624ab96db1fa
7
+ data.tar.gz: 3c58c89cb5d42c462b071008c548d85649e1d88d7186e4d4cc9c987d72e9dbab9d2ddf4a3ed9eb99e017d8f0f66b76f4ccdb88ec584ef64b3bdc097ec69a06ee
@@ -1,6 +1,6 @@
1
1
  require: rubocop-rspec
2
2
  AllCops:
3
- TargetRubyVersion: 2.3
3
+ TargetRubyVersion: 2.6
4
4
  RSpec/NestedGroups:
5
5
  Max: 3
6
6
  RSpec/MessageSpies:
@@ -13,3 +13,5 @@ Metrics/BlockLength:
13
13
  - "spec/**/*.rb"
14
14
  Metrics/LineLength:
15
15
  Max: 100
16
+ Naming/RescuedExceptionsVariableName:
17
+ PreferredName: exception
@@ -1,9 +1,8 @@
1
- sudo: false
2
1
  language: ruby
3
2
  rvm:
4
- - 2.2.6
5
- - 2.3.3
6
- - 2.4.0
3
+ - 2.5
4
+ - 2.6
5
+ - 2.7
7
6
  before_install:
8
7
  - gem update --system --no-doc
9
8
  - bundle install --gemfile=.overcommit_gems.rb
@@ -4,6 +4,28 @@ All notable changes to this project will be documented in this file.
4
4
  The format is based on [Keep a Changelog](http://keepachangelog.com/)
5
5
  and this project adheres to [Semantic Versioning](http://semver.org/).
6
6
 
7
+ ## [0.5.0]
8
+ ### Fixed
9
+ - Fixed dry-configurable compatibility. ([28](https://github.com/waiting-for-dev/warden-jwt_auth/issues/28))
10
+
11
+ ## [0.4.2] - 2020-03-19
12
+ ### Fixed
13
+ - Lock dry-configurable dependency to fix upstream regression. ([21](https://github.com/waiting-for-dev/warden-jwt_auth/issues/21))
14
+ - Fix ruby 2.7 warnings (@trevorrjohn [23](https://github.com/waiting-for-dev/warden-jwt_auth/pull/23) )
15
+
16
+ ## [0.4.1] - 2020-02-23
17
+ ### Fixed
18
+ - Upgrade dry-configurable dependency to fix upstream bug preventing
19
+ warden-jwt_auth to be loaded ([21](https://github.com/waiting-for-dev/warden-jwt_auth/issues/21)).
20
+
21
+ ## [0.4.0] - 2019-08-01
22
+ ### Added
23
+ - Allow configuration of the signing algorithm ([19](https://github.com/waiting-for-dev/warden-jwt_auth/pull/19)].
24
+
25
+ ## [0.3.6] - 2019-03-29
26
+ ### Fixed
27
+ - Update depencies.
28
+
7
29
  ## [0.3.5] - 2018-01-30
8
30
  ### Fixed
9
31
  - Do not disallow fetching JWT scopes from session
data/README.md CHANGED
@@ -24,7 +24,7 @@ If what you need is a JWT authentication library for [devise](https://github.com
24
24
  ## Installation
25
25
 
26
26
  ```ruby
27
- gem 'warden-jwt_auth', '~> 0.3.5'
27
+ gem 'warden-jwt_auth'
28
28
  ```
29
29
 
30
30
  And then execute:
@@ -59,7 +59,14 @@ end
59
59
 
60
60
  **Important:** You are encouraged to use a dedicated secret key, different than others in use in your application. If several components share the same secret key, chances that a vulnerability in one of them has a wider impact increase. Also, never share your secrets pushing it to a remote repository, you are better off using an environment variable like in the example.
61
61
 
62
- Currently, HS256 algorithm is the one in use.
62
+ Currently, HS256 algorithm is the default.
63
+ Configure the matching secret and algorithm name to use a different one (e.g. RS256) (see [ruby-jwt](https://github.com/jwt/ruby-jwt#algorithms-and-usage) to see which are supported)
64
+ ```ruby
65
+ Warden::JWTAuth.configure do |config|
66
+ config.secret = OpenSSL::PKey::RSA.new(ENV['WARDEN_JWT_SECRET_KEY'])
67
+ config.algorithm = ENV['WARDEN_JWT_ALGORITHM']
68
+ end
69
+ ```
63
70
 
64
71
  ### Warden scopes configuration
65
72
 
@@ -0,0 +1,25 @@
1
+ Please, for a bug report fill in the following template. Before that, make sure to read the whole [README](https://github.com/waiting-for-dev/warden-jwt_auth/blob/master/README.md).
2
+
3
+ Feature requests and questions about `warden-jwt_auth` are also accepted.
4
+
5
+ ## Expected behavior
6
+
7
+ ## Actual behavior
8
+
9
+ ## Steps to Reproduce the Problem
10
+
11
+ 1.
12
+ 2.
13
+ 3.
14
+
15
+ ## Debugging information
16
+
17
+ Provide following information. Please, format pasted output as code. Feel free to remove the secret key value.
18
+
19
+ - Version of `warden-jwt_auth` in use
20
+ - Output of `Warden::JWTAuth.config`
21
+ - If your issue is related with not getting a JWT from the server:
22
+ - Involved request path, method and request headers
23
+ - Response headers for that request
24
+ - If your issue is related with not being able to revoke a JWT:
25
+ - Involved request path, method and request headers
@@ -19,9 +19,33 @@ module Warden
19
19
  module JWTAuth
20
20
  extend Dry::Configurable
21
21
 
22
+ def symbolize_keys(hash)
23
+ hash.each_with_object({}) do |(key, value), memo|
24
+ memo[key.to_sym] = value
25
+ end
26
+ end
27
+
28
+ def upcase_first_items(array)
29
+ array.map do |tuple|
30
+ method, path = tuple
31
+ [method.to_s.upcase, path]
32
+ end
33
+ end
34
+
35
+ def constantize_values(hash)
36
+ hash.each_with_object({}) do |(key, value), memo|
37
+ memo[key] = value.is_a?(String) ? Object.const_get(value) : value
38
+ end
39
+ end
40
+
41
+ module_function :constantize_values, :symbolize_keys, :upcase_first_items
42
+
22
43
  # The secret used to encode the token
23
44
  setting :secret
24
45
 
46
+ # The algorithm used to encode the token
47
+ setting :algorithm, 'HS256'
48
+
25
49
  # Expiration time for tokens
26
50
  setting :expiration_time, 3600
27
51
 
@@ -35,7 +59,7 @@ module Warden
35
59
  # @see Interfaces::UserRepository
36
60
  # @see Interfaces::User
37
61
  setting(:mappings, {}) do |value|
38
- symbolize_keys(value)
62
+ constantize_values(symbolize_keys(value))
39
63
  end
40
64
 
41
65
  # Array of tuples [request_method, request_path_regex] to match request
@@ -72,44 +96,10 @@ module Warden
72
96
  #
73
97
  # @see Interfaces::RevocationStrategy
74
98
  setting(:revocation_strategies, {}) do |value|
75
- symbolize_keys(value)
76
- end
77
-
78
- # :reek:UtilityFunction
79
- def self.symbolize_keys(hash)
80
- Hash[
81
- hash.each_pair do |key, value|
82
- [key.to_sym, value]
83
- end
84
- ]
85
- end
86
-
87
- # :reek:UtilityFunction
88
- def self.upcase_first_items(array)
89
- array.map do |tuple|
90
- method, path = tuple
91
- [method.to_s.upcase, path]
92
- end
99
+ constantize_values(symbolize_keys(value))
93
100
  end
94
101
 
95
102
  Import = Dry::AutoInject(config)
96
-
97
- config.instance_eval do
98
- def mappings
99
- constantize_values(super)
100
- end
101
-
102
- def revocation_strategies
103
- constantize_values(super)
104
- end
105
-
106
- # :reek:UtilityFunction
107
- def constantize_values(hash)
108
- hash.each_with_object({}) do |(key, value), memo|
109
- memo[key] = value.is_a?(String) ? Object.const_get(value) : value
110
- end
111
- end
112
- end
113
103
  end
114
104
  end
115
105
 
@@ -16,6 +16,7 @@ module Warden
16
16
  def self.from_env(env)
17
17
  auth = EnvHelper.authorization_header(env)
18
18
  return nil unless auth
19
+
19
20
  method, token = auth.split
20
21
  method == METHOD ? token : nil
21
22
  end
@@ -24,6 +24,7 @@ module Warden
24
24
  env = auth.env
25
25
  scope = opts[:scope]
26
26
  return unless token_should_be_added?(scope, env)
27
+
27
28
  add_token_to_env(user, scope, env)
28
29
  end
29
30
 
@@ -30,6 +30,7 @@ module Warden
30
30
  path_info = EnvHelper.path_info(env)
31
31
  method = EnvHelper.request_method(env)
32
32
  return unless token && token_should_be_revoked?(path_info, method)
33
+
33
34
  TokenRevoker.new.call(token)
34
35
  end
35
36
 
@@ -39,6 +39,7 @@ module Warden
39
39
  sub = user.jwt_subject
40
40
  payload = { 'sub' => String(sub), 'scp' => scope.to_s }
41
41
  return payload unless user.respond_to?(:jwt_payload)
42
+
42
43
  user.jwt_payload.merge(payload)
43
44
  end
44
45
  end
@@ -4,7 +4,7 @@ module Warden
4
4
  module JWTAuth
5
5
  # Decodes a JWT into a hash payload into a JWT token
6
6
  class TokenDecoder
7
- include JWTAuth::Import['secret']
7
+ include JWTAuth::Import['secret', 'algorithm']
8
8
 
9
9
  # Decodes the payload from a JWT as a hash
10
10
  #
@@ -17,7 +17,7 @@ module Warden
17
17
  JWT.decode(token,
18
18
  secret,
19
19
  true,
20
- algorithm: TokenEncoder::ALG,
20
+ algorithm: algorithm,
21
21
  verify_jti: true)[0]
22
22
  end
23
23
  end
@@ -7,10 +7,7 @@ module Warden
7
7
  # Encodes a payload into a JWT token, adding some configurable
8
8
  # claims
9
9
  class TokenEncoder
10
- include JWTAuth::Import['secret', 'expiration_time']
11
-
12
- # Algorithm used to encode
13
- ALG = 'HS256'
10
+ include JWTAuth::Import['secret', 'algorithm', 'expiration_time']
14
11
 
15
12
  # Encodes a payload into a JWT
16
13
  #
@@ -18,7 +15,7 @@ module Warden
18
15
  # @return [String] JWT
19
16
  def call(payload)
20
17
  payload_to_encode = merge_with_default_claims(payload)
21
- JWT.encode(payload_to_encode, secret, ALG)
18
+ JWT.encode(payload_to_encode, secret, algorithm)
22
19
  end
23
20
 
24
21
  private
@@ -10,7 +10,7 @@ module Warden
10
10
 
11
11
  attr_reader :helper
12
12
 
13
- def initialize(*args)
13
+ def initialize(**args)
14
14
  super
15
15
  @helper = PayloadUserHelper
16
16
  end
@@ -46,6 +46,7 @@ module Warden
46
46
 
47
47
  def check_valid_user(payload, user, scope)
48
48
  raise Errors::NilUser, 'nil user' unless user
49
+
49
50
  strategy = revocation_strategies[scope]
50
51
  raise Errors::RevokedToken, 'revoked token' if strategy.jwt_revoked?(payload, user)
51
52
  end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Warden
4
4
  module JWTAuth
5
- VERSION = '0.3.5'
5
+ VERSION = '0.5.0'
6
6
  end
7
7
  end
@@ -1,35 +1,36 @@
1
- # coding: utf-8
2
- lib = File.expand_path('../lib', __FILE__)
1
+ # frozen_string_literal: true
2
+
3
+ lib = File.expand_path('lib', __dir__)
3
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
5
  require 'warden/jwt_auth/version'
5
6
 
6
7
  Gem::Specification.new do |spec|
7
- spec.name = "warden-jwt_auth"
8
+ spec.name = 'warden-jwt_auth'
8
9
  spec.version = Warden::JWTAuth::VERSION
9
- spec.authors = ["Marc Busqué"]
10
- spec.email = ["marc@lamarciana.com"]
10
+ spec.authors = ['Marc Busqué']
11
+ spec.email = ['marc@lamarciana.com']
11
12
 
12
- spec.summary = %q{JWT authentication for Warden.}
13
- spec.description = %q{JWT authentication for Warden, ORM agnostic and accepting the implementation of token revocation strategies.}
14
- spec.homepage = "https://github.com/waiting-for-dev/warden-jwt_auth"
15
- spec.license = "MIT"
13
+ spec.summary = 'JWT authentication for Warden.'
14
+ spec.description = 'JWT authentication for Warden, ORM agnostic and accepting the implementation of token revocation strategies.'
15
+ spec.homepage = 'https://github.com/waiting-for-dev/warden-jwt_auth'
16
+ spec.license = 'MIT'
16
17
 
17
18
  spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
18
- spec.bindir = "exe"
19
+ spec.bindir = 'exe'
19
20
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
20
- spec.require_paths = ["lib"]
21
+ spec.require_paths = ['lib']
21
22
 
22
- spec.add_dependency 'dry-configurable', '~> 0.5'
23
- spec.add_dependency 'dry-auto_inject', '~> 0.4'
23
+ spec.add_dependency 'dry-auto_inject', '~> 0.6'
24
+ spec.add_dependency 'dry-configurable', '~> 0.9'
24
25
  spec.add_dependency 'jwt', '~> 2.1'
25
26
  spec.add_dependency 'warden', '~> 1.2'
26
27
 
27
- spec.add_development_dependency "bundler", "~> 1.12"
28
- spec.add_development_dependency "rake", "~> 10.0"
29
- spec.add_development_dependency "rspec", "~> 3.0"
30
- spec.add_development_dependency "rack-test", "~> 0.6"
31
- spec.add_development_dependency "pry-byebug", "~> 3.4"
28
+ spec.add_development_dependency 'bundler'
29
+ spec.add_development_dependency 'pry-byebug', '~> 3.7'
30
+ spec.add_development_dependency 'rack-test', '~> 1.1'
31
+ spec.add_development_dependency 'rake', '~> 12.3'
32
+ spec.add_development_dependency 'rspec', '~> 3.8'
32
33
  # Test reporting
33
- spec.add_development_dependency 'simplecov', '~> 0.13'
34
34
  spec.add_development_dependency 'codeclimate-test-reporter', '~> 1.0'
35
+ spec.add_development_dependency 'simplecov', '0.17'
35
36
  end
metadata CHANGED
@@ -1,43 +1,43 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: warden-jwt_auth
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.5
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Marc Busqué
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-01-30 00:00:00.000000000 Z
11
+ date: 2020-07-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: dry-configurable
14
+ name: dry-auto_inject
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '0.5'
19
+ version: '0.6'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '0.5'
26
+ version: '0.6'
27
27
  - !ruby/object:Gem::Dependency
28
- name: dry-auto_inject
28
+ name: dry-configurable
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '0.4'
33
+ version: '0.9'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '0.4'
40
+ version: '0.9'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: jwt
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -70,100 +70,100 @@ dependencies:
70
70
  name: bundler
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - "~>"
73
+ - - ">="
74
74
  - !ruby/object:Gem::Version
75
- version: '1.12'
75
+ version: '0'
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - "~>"
80
+ - - ">="
81
81
  - !ruby/object:Gem::Version
82
- version: '1.12'
82
+ version: '0'
83
83
  - !ruby/object:Gem::Dependency
84
- name: rake
84
+ name: pry-byebug
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
87
  - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: '10.0'
89
+ version: '3.7'
90
90
  type: :development
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
94
  - - "~>"
95
95
  - !ruby/object:Gem::Version
96
- version: '10.0'
96
+ version: '3.7'
97
97
  - !ruby/object:Gem::Dependency
98
- name: rspec
98
+ name: rack-test
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
101
  - - "~>"
102
102
  - !ruby/object:Gem::Version
103
- version: '3.0'
103
+ version: '1.1'
104
104
  type: :development
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
108
  - - "~>"
109
109
  - !ruby/object:Gem::Version
110
- version: '3.0'
110
+ version: '1.1'
111
111
  - !ruby/object:Gem::Dependency
112
- name: rack-test
112
+ name: rake
113
113
  requirement: !ruby/object:Gem::Requirement
114
114
  requirements:
115
115
  - - "~>"
116
116
  - !ruby/object:Gem::Version
117
- version: '0.6'
117
+ version: '12.3'
118
118
  type: :development
119
119
  prerelease: false
120
120
  version_requirements: !ruby/object:Gem::Requirement
121
121
  requirements:
122
122
  - - "~>"
123
123
  - !ruby/object:Gem::Version
124
- version: '0.6'
124
+ version: '12.3'
125
125
  - !ruby/object:Gem::Dependency
126
- name: pry-byebug
126
+ name: rspec
127
127
  requirement: !ruby/object:Gem::Requirement
128
128
  requirements:
129
129
  - - "~>"
130
130
  - !ruby/object:Gem::Version
131
- version: '3.4'
131
+ version: '3.8'
132
132
  type: :development
133
133
  prerelease: false
134
134
  version_requirements: !ruby/object:Gem::Requirement
135
135
  requirements:
136
136
  - - "~>"
137
137
  - !ruby/object:Gem::Version
138
- version: '3.4'
138
+ version: '3.8'
139
139
  - !ruby/object:Gem::Dependency
140
- name: simplecov
140
+ name: codeclimate-test-reporter
141
141
  requirement: !ruby/object:Gem::Requirement
142
142
  requirements:
143
143
  - - "~>"
144
144
  - !ruby/object:Gem::Version
145
- version: '0.13'
145
+ version: '1.0'
146
146
  type: :development
147
147
  prerelease: false
148
148
  version_requirements: !ruby/object:Gem::Requirement
149
149
  requirements:
150
150
  - - "~>"
151
151
  - !ruby/object:Gem::Version
152
- version: '0.13'
152
+ version: '1.0'
153
153
  - !ruby/object:Gem::Dependency
154
- name: codeclimate-test-reporter
154
+ name: simplecov
155
155
  requirement: !ruby/object:Gem::Requirement
156
156
  requirements:
157
- - - "~>"
157
+ - - '='
158
158
  - !ruby/object:Gem::Version
159
- version: '1.0'
159
+ version: '0.17'
160
160
  type: :development
161
161
  prerelease: false
162
162
  version_requirements: !ruby/object:Gem::Requirement
163
163
  requirements:
164
- - - "~>"
164
+ - - '='
165
165
  - !ruby/object:Gem::Version
166
- version: '1.0'
166
+ version: '0.17'
167
167
  description: JWT authentication for Warden, ORM agnostic and accepting the implementation
168
168
  of token revocation strategies.
169
169
  email:
@@ -190,6 +190,7 @@ files:
190
190
  - bin/console
191
191
  - bin/setup
192
192
  - docker-compose.yml
193
+ - issue_template.md
193
194
  - lib/warden/jwt_auth.rb
194
195
  - lib/warden/jwt_auth/env_helper.rb
195
196
  - lib/warden/jwt_auth/errors.rb
@@ -228,7 +229,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
228
229
  version: '0'
229
230
  requirements: []
230
231
  rubyforge_project:
231
- rubygems_version: 2.6.8
232
+ rubygems_version: 2.7.8
232
233
  signing_key:
233
234
  specification_version: 4
234
235
  summary: JWT authentication for Warden.