faraday-jwt 0.0.0 → 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
2
  SHA256:
3
- metadata.gz: 5d387f8e950b87fc7e98e7fc6b2f2ce049a299364bbfcd3f02ce2827f60928ac
4
- data.tar.gz: b7c83196801124dc3f1c0ef985d921b642cd726ec0e3a72ce49d1a0621d2f62d
3
+ metadata.gz: 10706b798dca52baafed6fa07367d18101f394c6514f5efa4ba61e0445258ddc
4
+ data.tar.gz: 4af304d1ef1455d323a26df2213b634254e59abe9606bb04fcf99525dd33d649
5
5
  SHA512:
6
- metadata.gz: 91f19a69285f8311699e64eb98c1bdf647d525640b629f659243d75a12c6076c4b7d97ac547fdd474556901d73c4ea95021d2ba5d6eac331ef1727b6fbc69dc5
7
- data.tar.gz: 0353ef061b50283180e8dd9c63728829fe28ea5bfb6562cd0b3a0f85e8657e64aaf454c9c32e262dfdbcb9ba0fcf88c555eb55e70e4e1afc1bd3f3bb213ee112
6
+ metadata.gz: c6a0c14376301d8a3d6f07f591b4aa57b230a871041b318e8ae9be803e0e5b3dae6b9ce4a8297af057173fabecbe65e819651dc18f62307edbe4258b32c9f145
7
+ data.tar.gz: 5049412c9a8fe61c1a047aacd76c68891d8cadd1c1e84aed95fbf930465d1e9408ccb46d5e3b258645bcd68896e288f7c2e8afece2fdc50fbdb25e90938d784c
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # Faraday::Jwt
1
+ # Faraday::JWT
2
2
 
3
3
  Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/faraday/jwt`. To experiment with that code, run `bin/console` for an interactive prompt.
4
4
 
@@ -16,7 +16,50 @@ If bundler is not being used to manage dependencies, install the gem by executin
16
16
 
17
17
  ## Usage
18
18
 
19
- TODO: Write usage instructions here
19
+ ### Request
20
+
21
+ ```ruby
22
+ conn = Faraday.new(...) do |f|
23
+ f.request :jwt
24
+ ...
25
+ end
26
+
27
+ conn.post('/', { foo: :bar })
28
+ # POST with
29
+ # Content-Type: application/jwt
30
+ # Body: eyJ0eXAiOiJKV1QiLCJhbGciOiJub25lIn0.eyJmb28iOiJiYXIifQ.
31
+ ```
32
+
33
+ or optionally signing
34
+
35
+ ```ruby
36
+ conn = Faraday.new(...) do |f|
37
+ f.request :jwt, signing_key: private_key
38
+ ...
39
+ end
40
+ ```
41
+
42
+ ### Response
43
+
44
+ ```ruby
45
+ conn = Faraday.new(...) do |f|
46
+ f.response :jwt
47
+ ...
48
+ end
49
+
50
+ res = conn.get('jwt')
51
+ res.body
52
+ # => JSON::JWT instance
53
+ ```
54
+
55
+ or optionally verifying
56
+
57
+ ```ruby
58
+ conn = Faraday.new(...) do |f|
59
+ f.response :jwt, verification_key: public_key
60
+ ...
61
+ end
62
+ ```
20
63
 
21
64
  ## Development
22
65
 
@@ -34,4 +77,4 @@ The gem is available as open source under the terms of the [MIT License](https:/
34
77
 
35
78
  ## Code of Conduct
36
79
 
37
- Everyone interacting in the Faraday::Jwt project's codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/[USERNAME]/faraday-jwt/blob/master/CODE_OF_CONDUCT.md).
80
+ Everyone interacting in the Faraday::JWT project's codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/[USERNAME]/faraday-jwt/blob/master/CODE_OF_CONDUCT.md).
data/Rakefile CHANGED
@@ -1,8 +1,20 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "bundler/gem_tasks"
4
- require "rspec/core/rake_task"
3
+ require 'bundler/gem_tasks'
4
+ require 'rspec/core/rake_task'
5
5
 
6
6
  RSpec::Core::RakeTask.new(:spec)
7
7
 
8
+ namespace :coverage do
9
+ desc "Open coverage report"
10
+ task :report do
11
+ require 'simplecov'
12
+ `open "#{File.join SimpleCov.coverage_path, 'index.html'}"`
13
+ end
14
+ end
15
+
16
+ task :spec do
17
+ Rake::Task[:'coverage:report'].invoke unless ENV['GITHUB_ACTIONS']
18
+ end
19
+
8
20
  task default: :spec
data/faraday-jwt.gemspec CHANGED
@@ -4,7 +4,7 @@ require_relative 'lib/faraday/jwt/version'
4
4
 
5
5
  Gem::Specification.new do |spec|
6
6
  spec.name = 'faraday-jwt'
7
- spec.version = Faraday::Jwt::VERSION
7
+ spec.version = Faraday::JWT::VERSION
8
8
  spec.authors = ['nov']
9
9
  spec.email = ['nov@matake.jp']
10
10
 
@@ -30,6 +30,7 @@ Gem::Specification.new do |spec|
30
30
  spec.require_paths = ['lib']
31
31
 
32
32
  spec.add_dependency 'faraday', '~> 2.0'
33
+ spec.add_dependency 'json-jwt', '~> 1.16'
33
34
  spec.add_development_dependency 'rake'
34
35
  spec.add_development_dependency 'rspec'
35
36
  spec.add_development_dependency 'simplecov'
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Faraday
4
+ module JWT
5
+ class Request < Middleware
6
+ def initialize(app = nil, signing_key: nil, signing_alg: :autodetect, content_type: 'application/jwt')
7
+ super app
8
+ @signing_key = signing_key
9
+ @signing_alg = signing_alg
10
+ @content_types = Array(content_type)
11
+ end
12
+
13
+ def on_request(env)
14
+ encode_body!(env) if encodable_content?(env)
15
+ end
16
+
17
+ private
18
+
19
+ def encode_body!(env)
20
+ jwt = JSON::JWT.new env[:body]
21
+ env[:body] = if @signing_key.present?
22
+ jwt.sign @signing_key, @signing_alg
23
+ else
24
+ jwt
25
+ end.to_s
26
+ end
27
+
28
+ def encodable_content?(env)
29
+ !env[:body].respond_to?(:to_str) &&
30
+ encodable_content_type?(env[:request_headers])
31
+ end
32
+
33
+ def encodable_content_type?(headers)
34
+ @content_types.any? do |content_type|
35
+ content_type_of(headers) == content_type
36
+ end
37
+ end
38
+
39
+ def content_type_of(headers)
40
+ type = headers[CONTENT_TYPE].to_s
41
+ type = type.split(';', 2).first if type.index(';')
42
+ type
43
+ end
44
+ end
45
+ end
46
+ end
47
+
48
+ Faraday::Request.register_middleware(jwt: Faraday::JWT::Request)
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Faraday
4
+ module JWT
5
+ class Response < Middleware
6
+ def initialize(app = nil, verification_key: :skip_verification, signing_algs: nil, content_type: 'application/jwt')
7
+ super app
8
+ @verification_key = verification_key
9
+ @signing_algs = signing_algs
10
+ @content_types = Array(content_type)
11
+ end
12
+
13
+ def on_complete(env)
14
+ decode_body!(env) if decodable_content?(env)
15
+ end
16
+
17
+ private
18
+
19
+ def decode_body!(env)
20
+ env[:raw_body] = env[:body]
21
+ env[:body] = JSON::JWT.decode(env[:body], @verification_key, @signing_algs)
22
+ rescue => e
23
+ raise Faraday::ParsingError.new(e, env[:response])
24
+ end
25
+
26
+ def decodable_content?(env)
27
+ env[:body].respond_to?(:to_str) && !env[:body].strip.empty? &&
28
+ decodable_content_type?(env[:response_headers])
29
+ end
30
+
31
+ def decodable_content_type?(headers)
32
+ @content_types.any? do |content_type|
33
+ content_type_of(headers) == content_type
34
+ end
35
+ end
36
+
37
+ def content_type_of(headers)
38
+ type = headers[CONTENT_TYPE].to_s
39
+ type = type.split(';', 2).first if type.index(';')
40
+ type
41
+ end
42
+ end
43
+ end
44
+ end
45
+
46
+ Faraday::Response.register_middleware(jwt: Faraday::JWT::Response)
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Faraday
4
- module Jwt
5
- VERSION = '0.0.0'
4
+ module JWT
5
+ VERSION = '0.1.0'
6
6
  end
7
7
  end
data/lib/faraday/jwt.rb CHANGED
@@ -1,10 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'faraday'
4
+ require 'json/jwt'
3
5
  require_relative 'jwt/version'
6
+ require_relative 'jwt/request'
7
+ require_relative 'jwt/response'
4
8
 
5
9
  module Faraday
6
- module Jwt
7
- class Error < StandardError; end
8
- # Your code goes here...
10
+ module JWT
9
11
  end
10
12
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: faraday-jwt
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.0
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - nov
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-10-10 00:00:00.000000000 Z
11
+ date: 2022-10-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '2.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: json-jwt
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.16'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.16'
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: rake
29
43
  requirement: !ruby/object:Gem::Requirement
@@ -81,6 +95,8 @@ files:
81
95
  - Rakefile
82
96
  - faraday-jwt.gemspec
83
97
  - lib/faraday/jwt.rb
98
+ - lib/faraday/jwt/request.rb
99
+ - lib/faraday/jwt/response.rb
84
100
  - lib/faraday/jwt/version.rb
85
101
  homepage: https://github.com/nov/faraday-jwt
86
102
  licenses: