minimal_jwt 1.0.1

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: ad7bf5f55dbee50ee2fc6bfbaee9523f104f7dcb6818a859e50c4115959dbc16
4
+ data.tar.gz: 0d8a43623d0bd41129b47a684bc0ccca83cef08c5c288a561b6fdd70990745c1
5
+ SHA512:
6
+ metadata.gz: 24981349845797583c7bfc8da38b912ac8d0a718804d5c8de23dad41edeab1667b123c97f10859a7f6da0ebfd4cd468806889981f34a28409bd70acd246b3a90
7
+ data.tar.gz: 87239f370252348588a367f67acab7e15b2c17f373fa8763f9e46b4aea5463b931df014239c9548825261e778a2f230a9f03d7972744dba793598020be5b0ad6
data/README.md ADDED
@@ -0,0 +1,3 @@
1
+ # minimal_jwt
2
+
3
+ A lightweight library for encoding & decoding JSON Web Tokens (JWTs).
@@ -0,0 +1,7 @@
1
+ module MinimalJwt
2
+ class Algorithm
3
+ HS256 = :HS256
4
+ RS256 = :RS256
5
+ ES256 = :ES256
6
+ end
7
+ end
@@ -0,0 +1,10 @@
1
+ module MinimalJwt
2
+ class InvalidJwtError < StandardError
3
+ attr_reader :message
4
+
5
+ def initialize(message = '')
6
+ super
7
+ @message = message
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ module MinimalJwt
2
+ class InvalidPayloadError < StandardError
3
+ attr_reader :message
4
+
5
+ def initialize(message = '')
6
+ super
7
+ @message = message
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ module MinimalJwt
2
+ class UnsupportedSigningAlgorithmError < StandardError
3
+ attr_reader :message
4
+
5
+ def initialize(message = '')
6
+ super
7
+ @message = message
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,102 @@
1
+ require 'base64'
2
+ require 'json'
3
+ require 'openssl'
4
+
5
+ module MinimalJwt
6
+ class JWT
7
+ attr_accessor :token
8
+
9
+ def initialize(token:)
10
+ @token = token
11
+ header, payload, signature = @token.split('.')
12
+ @header = header
13
+ @payload = payload
14
+ @signature = signature
15
+ end
16
+
17
+ def valid?
18
+ return false if @token.nil?
19
+ return false if @header.nil? || @payload.nil? || @signature.nil?
20
+
21
+ begin
22
+ base64_decode(@header)
23
+ base64_decode(@payload)
24
+ base64_decode(@signature)
25
+ true
26
+ rescue StandardError
27
+ false
28
+ end
29
+ end
30
+
31
+ def header
32
+ raise InvalidJwtError unless valid?
33
+
34
+ JSON.parse(base64_decode(@header))
35
+ end
36
+
37
+ def payload
38
+ raise InvalidJwtError unless valid?
39
+
40
+ JSON.parse(base64_decode(@payload))
41
+ end
42
+
43
+ def signature_verified?
44
+ return false unless valid?
45
+
46
+ data_to_verify = "#{@header}.#{@payload}"
47
+ calculated_encoded_signature = base64_encode(signature(Algorithm::HS256, secret, data_to_verify))
48
+ calculated_encoded_signature == @signature
49
+ end
50
+
51
+ def self.encode(algorithm: Algorithm::HS256, payload:)
52
+ raise InvalidPayloadError.new('Payload should be a hash') unless payload.is_a?(Hash)
53
+
54
+ header = {
55
+ alg: algorithm,
56
+ typ: :JWT
57
+ }
58
+ encoded_header = base64_encode(header.to_json)
59
+ encoded_payload = base64_encode(payload.to_json)
60
+ data_to_sign = "#{encoded_header}.#{encoded_payload}"
61
+
62
+ encoded_signature = base64_encode(signature(algorithm, secret, data_to_sign))
63
+
64
+ JWT.new(token: "#{data_to_sign}.#{encoded_signature}")
65
+ end
66
+
67
+ private
68
+
69
+ def self.signature(algorithm, secret, data_to_sign)
70
+ case algorithm
71
+ when Algorithm::HS256
72
+ OpenSSL::HMAC.digest('sha256', secret, data_to_sign)
73
+ else
74
+ raise UnsupportedSigningAlgorithmError.new("Sorry! Signing with #{algorithm.to_s} is not supported yet")
75
+ end
76
+ end
77
+
78
+ def self.base64_encode(content)
79
+ Base64.urlsafe_encode64(content).tr('=', '')
80
+ end
81
+
82
+ def self.secret
83
+ ENV['MINIMAL_JWT_SIGNATURE_SECRET'] || ''
84
+ end
85
+
86
+ def signature(algorithm, secret, data_to_sign)
87
+ self.class.signature(algorithm, secret, data_to_sign)
88
+ end
89
+
90
+ def base64_encode(content)
91
+ self.class.base64_encode(content)
92
+ end
93
+
94
+ def secret
95
+ self.class.secret
96
+ end
97
+
98
+ def base64_decode(content)
99
+ Base64.urlsafe_decode64(content).tr('=', '')
100
+ end
101
+ end
102
+ end
@@ -0,0 +1,3 @@
1
+ module MinimalJwt
2
+ VERSION = "1.0.1"
3
+ end
@@ -0,0 +1,7 @@
1
+ require 'minimal_jwt/jwt'
2
+ require 'minimal_jwt/algorithm'
3
+ require 'minimal_jwt/errors/invalid_jwt_error'
4
+ require 'minimal_jwt/errors/invalid_payload_error'
5
+ require 'minimal_jwt/errors/unsupported_signing_algorithm_error'
6
+
7
+ include MinimalJwt
metadata ADDED
@@ -0,0 +1,50 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: minimal_jwt
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Nikshep A V
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2023-10-29 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: A minimal lightweight JWT library
14
+ email: nikshep.av@gmail.com
15
+ executables: []
16
+ extensions: []
17
+ extra_rdoc_files: []
18
+ files:
19
+ - README.md
20
+ - lib/minimal_jwt.rb
21
+ - lib/minimal_jwt/algorithm.rb
22
+ - lib/minimal_jwt/errors/invalid_jwt_error.rb
23
+ - lib/minimal_jwt/errors/invalid_payload_error.rb
24
+ - lib/minimal_jwt/errors/unsupported_signing_algorithm_error.rb
25
+ - lib/minimal_jwt/jwt.rb
26
+ - lib/minimal_jwt/version.rb
27
+ homepage:
28
+ licenses: []
29
+ metadata:
30
+ source_code_uri: https://github.com/navrikk/minimal_jwt
31
+ post_install_message:
32
+ rdoc_options: []
33
+ require_paths:
34
+ - lib
35
+ required_ruby_version: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: 3.0.0
40
+ required_rubygems_version: !ruby/object:Gem::Requirement
41
+ requirements:
42
+ - - ">="
43
+ - !ruby/object:Gem::Version
44
+ version: '0'
45
+ requirements: []
46
+ rubygems_version: 3.3.7
47
+ signing_key:
48
+ specification_version: 4
49
+ summary: Minimal JWT
50
+ test_files: []