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 +7 -0
- data/README.md +3 -0
- data/lib/minimal_jwt/algorithm.rb +7 -0
- data/lib/minimal_jwt/errors/invalid_jwt_error.rb +10 -0
- data/lib/minimal_jwt/errors/invalid_payload_error.rb +10 -0
- data/lib/minimal_jwt/errors/unsupported_signing_algorithm_error.rb +10 -0
- data/lib/minimal_jwt/jwt.rb +102 -0
- data/lib/minimal_jwt/version.rb +3 -0
- data/lib/minimal_jwt.rb +7 -0
- metadata +50 -0
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,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
|
data/lib/minimal_jwt.rb
ADDED
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: []
|