solidus_jwt 0.0.2 → 0.1.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
- SHA1:
3
- metadata.gz: 20a8812041640dfdc3cc4e17aa167507f99fd01b
4
- data.tar.gz: 8005596f40d291047b2c940abd721b9bb57776b7
2
+ SHA256:
3
+ metadata.gz: 0cf6dd72fda604868c1589819000a6d1607a8078fa642ce2a17cb071695b26f1
4
+ data.tar.gz: ca122c197a880c21398f6bcf28a2e8dd7709f90613e0fe41c4f24ea166802e09
5
5
  SHA512:
6
- metadata.gz: c120947ba2b1adf7b57d0128bcc32c35ffd13758f91c52a705221b138e4851bb9e7f58841216a1e2edfe85b68096efdea495493b63003ebc9f8b234da20eaa33
7
- data.tar.gz: ea576aff33c96f219989f760fdbaed27393a76270ed99090a091138fdf5856b0622e7bcb0f0e428688ff4756286011951166abe24bc9ff4a6233ab2b76c0da73
6
+ metadata.gz: c1a2929d69915b28aec1df8c2a4fa450191ae0c465c57e5b7992938a88c9fb6363ae71282930b4dcea644add482d54c3406eb471a93a0c74a520ad8e11e9e98e
7
+ data.tar.gz: b7938c410ed7e14bc8098aa7314490beaff2bfc29b86249c72c9a2411f48b3a2b71441b6c17a159fff864caaf1923e348ba5b01c5acfcc570be3c60c1e75a571
data/README.md CHANGED
@@ -1,6 +1,9 @@
1
1
  SolidusJwt
2
2
  ==========
3
3
 
4
+ [![CircleCI](https://circleci.com/gh/skukx/solidus_jwt.svg?style=svg)](https://circleci.com/gh/skukx/solidus_jwt)
5
+ [![Gem Version](https://badge.fury.io/rb/solidus_jwt.svg)](https://badge.fury.io/rb/solidus_jwt)
6
+
4
7
  This gem gives [Solidus](https://github.com/solidusio/solidus) stores the ability to authenticate API requests with
5
8
  JSON Web Tokens.
6
9
 
@@ -64,10 +67,20 @@ end
64
67
 
65
68
  user = Spree::User.new email: 'email@example.com', id: 1
66
69
  token = user.generate_jwt_token(expires_in: 1.hour.to_i) # Expiration is time in seconds
67
- # eyJhbGciOiJIUzI1NiJ9.eyJleHAiOjE1NDA1MzIzNjcsImlhdCI6IjIwMTgtMTAtMjYgMDQ6Mzk6MjcgVVRDIiwiaWQiOjEsImVtYWlsIjoiZW1haWxAZXhhbXBsZS5jb20ifQ.LWqf_cfsMwB995AqN9wj5IseJqEZYaIHHIhf8Ej7WIc
70
+ # eyJhbGciOiJIUzI1NiJ9.eyJpZCI6MSwiZW1haWwiOiJlbWFpbEBleGFtcGxlLmNvbSIsInN1YiI6MSwiZXhwIjoxNTcyNTg2NTA3LCJpYXQiOjE1NzI1ODI5MDcsImlzcyI6InNvbGlkdXMifQ.UEmPLClCmOii_5-Qa6fB_ToGavIJYY6PAyfhARitMwI
68
71
 
69
72
  SolidusJwt.decode(token)
70
- # [{"exp"=>1540532367, "iat"=>"2018-10-26 04:39:27 UTC", "id"=>1, "email"=>"email@example.com"}, {"alg"=>"HS256"}]
73
+ # [
74
+ # {
75
+ # "id"=>1,
76
+ # "email"=>"email@example.com",
77
+ # "sub"=>1,
78
+ # "exp"=>1572586507,
79
+ # "iat"=>1572582907,
80
+ # "iss"=>"solidus"
81
+ # },
82
+ # {"alg"=>"HS256"}
83
+ # ]
71
84
  ```
72
85
 
73
86
  ### Distributing a Token Using 'solidus_auth_devise':
@@ -1,7 +1,13 @@
1
+ ##
2
+ # Prepend for Spree::Api::BaseController methods
3
+ #
1
4
  module Spree::Api::BaseController::JsonWebTokens
2
5
  def load_user
3
6
  return super unless json_web_token.present?
7
+
8
+ # rubocop:disable Naming/MemoizedInstanceVariableName
4
9
  @current_api_user ||= Spree.user_class.find_by(id: json_web_token['id'])
10
+ # rubocop:enable Naming/MemoizedInstanceVariableName
5
11
  end
6
12
 
7
13
  def json_web_token
@@ -10,10 +16,7 @@ module Spree::Api::BaseController::JsonWebTokens
10
16
  # Allow spree to try and authenticate if we still allow it. Otherwise
11
17
  # raise an error
12
18
  return if SolidusJwt::Config.allow_spree_api_key
13
- raise
14
- end
15
19
 
16
- def invalid_jwt_format?
17
- api_key.split('.').size != 3
20
+ raise
18
21
  end
19
22
  end
@@ -1,7 +1,17 @@
1
- Spree::Api::BaseController.class_eval do
2
- prepend Spree::Api::BaseController::JsonWebTokens
1
+ module Spree
2
+ module Api
3
+ module BaseControllerDecorator
4
+ extend ActiveSupport::Concern
3
5
 
4
- rescue_from JWT::DecodeError do
5
- render "spree/api/errors/invalid_api_key", status: 401
6
+ included do
7
+ prepend Spree::Api::BaseController::JsonWebTokens
8
+
9
+ rescue_from JWT::DecodeError do
10
+ render "spree/api/errors/invalid_api_key", status: 401
11
+ end
12
+ end
13
+
14
+ Spree::Api::BaseController.include self
15
+ end
6
16
  end
7
17
  end
@@ -1,16 +1,30 @@
1
- Spree.user_class.class_eval do
2
- ##
3
- # Generate a json web token
4
- # @see https://github.com/jwt/ruby-jwt
5
- # @return [String]
6
- #
7
- def generate_jwt_token(expires_in: nil)
8
- SolidusJwt.encode(payload: as_jwt_payload, expires_in: expires_in)
9
- end
1
+ module Spree
2
+ module UserDecorator
3
+ ##
4
+ # Generate a json web token
5
+ # @see https://github.com/jwt/ruby-jwt
6
+ # @return [String]
7
+ #
8
+ def generate_jwt(expires_in: nil)
9
+ SolidusJwt.encode(payload: as_jwt_payload, expires_in: expires_in)
10
+ end
11
+ alias generate_jwt_token generate_jwt
12
+
13
+ ##
14
+ # Serializes user attributes to hash and applies
15
+ # the sub jwt claim.
16
+ #
17
+ # @return [Hash] The payload for json web token
18
+ #
19
+ def as_jwt_payload
20
+ options = SolidusJwt::Config.jwt_options
21
+ claims = { sub: id }
10
22
 
11
- private
23
+ as_json(options)
24
+ .merge(claims)
25
+ .as_json
26
+ end
12
27
 
13
- def as_jwt_payload
14
- as_json(only: %i[email id])
28
+ Spree.user_class.prepend self
15
29
  end
16
30
  end
@@ -9,7 +9,7 @@ module SolidusJwt
9
9
  #
10
10
  def decode(token)
11
11
  JWT.decode(token, SolidusJwt::Config.jwt_secret, true,
12
- algorithm: SolidusJwt::Config.jwt_algorithm)
12
+ algorithm: SolidusJwt::Config.jwt_algorithm)
13
13
  end
14
14
  end
15
15
  end
@@ -10,15 +10,17 @@ module SolidusJwt
10
10
  # @return [String]
11
11
  #
12
12
  def encode(payload:, expires_in: nil)
13
- # @see https://github.com/jwt/ruby-jwt#support-for-reserved-claim-names
13
+ jwt_payload = payload.dup.with_indifferent_access
14
+
14
15
  current_time = Time.current.to_i
15
- extras = {}
16
- extras['exp'] = current_time + expires_in if expires_in.present?
17
- extras['iat'] = current_time
18
16
 
19
- payload = extras.merge(payload).as_json
20
- JWT.encode(payload, SolidusJwt::Config.jwt_secret,
21
- SolidusJwt::Config.jwt_algorithm)
17
+ # @see https://github.com/jwt/ruby-jwt#support-for-reserved-claim-names
18
+ jwt_payload[:exp] ||= current_time + expires_in if expires_in.present?
19
+ jwt_payload[:iat] ||= current_time
20
+ jwt_payload[:iss] ||= 'solidus'
21
+
22
+ JWT.encode(jwt_payload, SolidusJwt::Config.jwt_secret,
23
+ SolidusJwt::Config.jwt_algorithm)
22
24
  end
23
25
  end
24
26
  end
@@ -10,7 +10,9 @@ module SolidusJwt
10
10
  end
11
11
 
12
12
  def self.activate
13
- Dir.glob(File.join(File.dirname(__FILE__), '../../app/**/*_decorator*.rb')) do |c|
13
+ decorator_pattern = File.join(__dir__, '../../app/**/*_decorator*.rb')
14
+
15
+ Dir.glob(decorator_pattern) do |c|
14
16
  Rails.configuration.cache_classes ? require(c) : load(c)
15
17
  end
16
18
  end
@@ -1,7 +1,7 @@
1
1
  module SolidusJwt
2
2
  MAJOR = 0
3
- MINOR = 0
4
- PATCH = 2
3
+ MINOR = 1
4
+ PATCH = 0
5
5
  PRERELEASE = nil
6
6
 
7
7
  def self.version
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: solidus_jwt
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Taylor Scott
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-06-18 00:00:00.000000000 Z
11
+ date: 2019-11-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: solidus_core
@@ -107,7 +107,7 @@ dependencies:
107
107
  - !ruby/object:Gem::Version
108
108
  version: '0'
109
109
  - !ruby/object:Gem::Dependency
110
- name: poltergeist
110
+ name: coffee-rails
111
111
  requirement: !ruby/object:Gem::Requirement
112
112
  requirements:
113
113
  - - ">="
@@ -121,7 +121,7 @@ dependencies:
121
121
  - !ruby/object:Gem::Version
122
122
  version: '0'
123
123
  - !ruby/object:Gem::Dependency
124
- name: coffee-rails
124
+ name: database_cleaner
125
125
  requirement: !ruby/object:Gem::Requirement
126
126
  requirements:
127
127
  - - ">="
@@ -135,7 +135,7 @@ dependencies:
135
135
  - !ruby/object:Gem::Version
136
136
  version: '0'
137
137
  - !ruby/object:Gem::Dependency
138
- name: sass-rails
138
+ name: factory_bot
139
139
  requirement: !ruby/object:Gem::Requirement
140
140
  requirements:
141
141
  - - ">="
@@ -149,7 +149,7 @@ dependencies:
149
149
  - !ruby/object:Gem::Version
150
150
  version: '0'
151
151
  - !ruby/object:Gem::Dependency
152
- name: database_cleaner
152
+ name: ffaker
153
153
  requirement: !ruby/object:Gem::Requirement
154
154
  requirements:
155
155
  - - ">="
@@ -163,7 +163,7 @@ dependencies:
163
163
  - !ruby/object:Gem::Version
164
164
  version: '0'
165
165
  - !ruby/object:Gem::Dependency
166
- name: factory_bot
166
+ name: gem-release
167
167
  requirement: !ruby/object:Gem::Requirement
168
168
  requirements:
169
169
  - - ">="
@@ -177,7 +177,7 @@ dependencies:
177
177
  - !ruby/object:Gem::Version
178
178
  version: '0'
179
179
  - !ruby/object:Gem::Dependency
180
- name: ffaker
180
+ name: poltergeist
181
181
  requirement: !ruby/object:Gem::Requirement
182
182
  requirements:
183
183
  - - ">="
@@ -218,6 +218,48 @@ dependencies:
218
218
  - - ">="
219
219
  - !ruby/object:Gem::Version
220
220
  version: '0'
221
+ - !ruby/object:Gem::Dependency
222
+ name: rubocop-rspec
223
+ requirement: !ruby/object:Gem::Requirement
224
+ requirements:
225
+ - - ">="
226
+ - !ruby/object:Gem::Version
227
+ version: '0'
228
+ type: :development
229
+ prerelease: false
230
+ version_requirements: !ruby/object:Gem::Requirement
231
+ requirements:
232
+ - - ">="
233
+ - !ruby/object:Gem::Version
234
+ version: '0'
235
+ - !ruby/object:Gem::Dependency
236
+ name: sass-rails
237
+ requirement: !ruby/object:Gem::Requirement
238
+ requirements:
239
+ - - ">="
240
+ - !ruby/object:Gem::Version
241
+ version: '0'
242
+ type: :development
243
+ prerelease: false
244
+ version_requirements: !ruby/object:Gem::Requirement
245
+ requirements:
246
+ - - ">="
247
+ - !ruby/object:Gem::Version
248
+ version: '0'
249
+ - !ruby/object:Gem::Dependency
250
+ name: selenium-webdriver
251
+ requirement: !ruby/object:Gem::Requirement
252
+ requirements:
253
+ - - ">="
254
+ - !ruby/object:Gem::Version
255
+ version: '0'
256
+ type: :development
257
+ prerelease: false
258
+ version_requirements: !ruby/object:Gem::Requirement
259
+ requirements:
260
+ - - ">="
261
+ - !ruby/object:Gem::Version
262
+ version: '0'
221
263
  - !ruby/object:Gem::Dependency
222
264
  name: simplecov
223
265
  requirement: !ruby/object:Gem::Requirement
@@ -236,16 +278,16 @@ dependencies:
236
278
  name: sqlite3
237
279
  requirement: !ruby/object:Gem::Requirement
238
280
  requirements:
239
- - - "~>"
281
+ - - ">="
240
282
  - !ruby/object:Gem::Version
241
- version: 1.3.6
283
+ version: '0'
242
284
  type: :development
243
285
  prerelease: false
244
286
  version_requirements: !ruby/object:Gem::Requirement
245
287
  requirements:
246
- - - "~>"
288
+ - - ">="
247
289
  - !ruby/object:Gem::Version
248
- version: 1.3.6
290
+ version: '0'
249
291
  description: Add Json Web Tokens to Solidus API
250
292
  email: t.skukx@gmail.com
251
293
  executables: []
@@ -293,8 +335,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
293
335
  - !ruby/object:Gem::Version
294
336
  version: '0'
295
337
  requirements: []
296
- rubyforge_project:
297
- rubygems_version: 2.6.13
338
+ rubygems_version: 3.0.3
298
339
  signing_key:
299
340
  specification_version: 4
300
341
  summary: Add Json Web Tokens to Solidus API