Class: JSON::JWT
- Inherits:
-
ActiveSupport::HashWithIndifferentAccess
- Object
- ActiveSupport::HashWithIndifferentAccess
- JSON::JWT
show all
- Defined in:
- lib/json/jwt.rb
Direct Known Subclasses
JOSE
Defined Under Namespace
Classes: Exception, InvalidFormat, UnexpectedAlgorithm, VerificationFailed
Instance Attribute Summary collapse
Class Method Summary
collapse
Instance Method Summary
collapse
Constructor Details
#initialize(claims = {}) ⇒ JWT
Returns a new instance of JWT.
31
32
33
34
35
36
37
38
|
# File 'lib/json/jwt.rb', line 31
def initialize(claims = {})
self.typ = :JWT
self.alg = :none
[:exp, :nbf, :iat].each do |key|
claims[key] = claims[key].to_i if claims[key]
end
update claims
end
|
Instance Attribute Details
Returns the value of attribute header.
9
10
11
|
# File 'lib/json/jwt.rb', line 9
def
@header
end
|
#signature ⇒ Object
Returns the value of attribute signature.
9
10
11
|
# File 'lib/json/jwt.rb', line 9
def signature
@signature
end
|
Class Method Details
.decode(jwt_string, key_or_secret = nil) ⇒ Object
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
|
# File 'lib/json/jwt.rb', line 81
def decode(jwt_string, key_or_secret = nil)
case jwt_string.count('.') + 1
when JWS::NUM_OF_SEGMENTS , claims, signature = jwt_string.split('.', JWS::NUM_OF_SEGMENTS).collect do |segment|
UrlSafeBase64.decode64 segment.to_s
end
, claims = [, claims].collect do |json|
MultiJson.load(json).with_indifferent_access
end
signature_base_string = jwt_string.split('.')[0, JWS::NUM_OF_SEGMENTS - 1].join('.')
jwt = new claims
jwt. =
jwt.signature = signature
jwt.verify signature_base_string, key_or_secret unless key_or_secret == :skip_verification
jwt
when JWE::NUM_OF_SEGMENTS
jwe = JWE.new jwt_string
jwe. = MultiJson.load(
UrlSafeBase64.decode64 jwt_string.split('.').first
).with_indifferent_access
if key_or_secret == :skip_decryption
jwe
else
jwe.decrypt! key_or_secret
JSON::JWT.decode jwe.plain_text, :skip_verification
end
else
raise InvalidFormat.new("Invalid JWT Format. JWT should include #{JWS::NUM_OF_SEGMENTS} or #{JWE::NUM_OF_SEGMENTS} segments.")
end
rescue MultiJson::DecodeError
raise InvalidFormat.new("Invalid JSON Format")
end
|
17
18
19
20
21
22
23
24
25
26
|
# File 'lib/json/jwt.rb', line 17
def (*keys)
keys.each do ||
define_method do
self.[]
end
define_method "#{}=" do |value|
self.[] = value
end
end
end
|
Instance Method Details
#content_type ⇒ Object
40
41
42
|
# File 'lib/json/jwt.rb', line 40
def content_type
'application/jwt'
end
|
#encrypt(public_key_or_secret, algorithm = :RSA1_5, encryption_method = :'A128CBC-HS256') ⇒ Object
63
64
65
66
67
68
|
# File 'lib/json/jwt.rb', line 63
def encrypt(public_key_or_secret, algorithm = :RSA1_5, encryption_method = :'A128CBC-HS256')
jwe = JWE.new(self)
jwe.alg = algorithm
jwe.enc = encryption_method
jwe.encrypt! public_key_or_secret
end
|
#sign(private_key_or_secret, algorithm = :HS256) ⇒ Object
48
49
50
51
52
|
# File 'lib/json/jwt.rb', line 48
def sign(private_key_or_secret, algorithm = :HS256)
jws = JWS.new(self)
jws.alg = algorithm
jws.sign! private_key_or_secret
end
|
#to_s ⇒ Object
70
71
72
73
74
75
76
77
78
|
# File 'lib/json/jwt.rb', line 70
def to_s
[
.to_json,
self.to_json,
signature
].collect do |segment|
UrlSafeBase64.encode64 segment.to_s
end.join('.')
end
|
#verify(signature_base_string, public_key_or_secret = nil) ⇒ Object
54
55
56
57
58
59
60
61
|
# File 'lib/json/jwt.rb', line 54
def verify(signature_base_string, public_key_or_secret = nil)
if alg.try(:to_sym) == :none
raise UnexpectedAlgorithm if public_key_or_secret
signature == '' or raise VerificationFailed
else
JWS.new(self).verify(signature_base_string, public_key_or_secret)
end
end
|