Class: JSON::JWT

Inherits:
Hash
  • Object
show all
Defined in:
lib/json/jwt.rb

Direct Known Subclasses

JWE, JWS

Defined Under Namespace

Classes: Exception, InvalidFormat, UnexpectedAlgorighm, VerificationFailed

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(claims) ⇒ JWT

Returns a new instance of JWT.



15
16
17
18
19
20
21
22
23
24
# File 'lib/json/jwt.rb', line 15

def initialize(claims)
  @header = {
    :typ => :JWT,
    :alg => :none
  }
  [:exp, :nbf, :iat].each do |key|
    claims[key] = claims[key].to_i if claims[key]
  end
  replace claims
end

Instance Attribute Details

#headerObject

Returns the value of attribute header.



8
9
10
# File 'lib/json/jwt.rb', line 8

def header
  @header
end

#signatureObject

Returns the value of attribute signature.



8
9
10
# File 'lib/json/jwt.rb', line 8

def signature
  @signature
end

Class Method Details

.decode(jwt_string, public_key_or_secret = nil) ⇒ Object



51
52
53
54
55
56
57
58
59
60
61
62
63
# File 'lib/json/jwt.rb', line 51

def decode(jwt_string, public_key_or_secret = nil)
  raise InvalidFormat.new('Invalid JWT Format. JWT should include 2 dots.') unless jwt_string.count('.') == 2
  header, claims, signature = jwt_string.split('.', 3).collect do |segment|
    UrlSafeBase64.decode64 segment.to_s
  end
  signature_base_string = jwt_string.split('.')[0, 2].join('.')
  jwt = new JSON.parse(claims, :symbolize_names => true)
  jwt.header = JSON.parse(header, :symbolize_names => true)
  jwt.verify signature_base_string, signature, public_key_or_secret
  jwt
rescue JSON::ParserError
  raise InvalidFormat.new("Invalid JSON Format")
end

Instance Method Details

#sign(private_key_or_secret, algorithm = :HS256) ⇒ Object



26
27
28
29
# File 'lib/json/jwt.rb', line 26

def sign(private_key_or_secret, algorithm = :HS256)
  header[:alg] = algorithm
  JWS.new(self).sign!(private_key_or_secret)
end

#to_sObject



40
41
42
43
44
45
46
47
48
# File 'lib/json/jwt.rb', line 40

def to_s
  [
    header.to_json,
    self.to_json,
    signature
  ].collect do |segment|
    UrlSafeBase64.encode64 segment.to_s
  end.join('.')
end

#verify(signature_base_string, signature = '', public_key_or_secret = nil) ⇒ Object



31
32
33
34
35
36
37
38
# File 'lib/json/jwt.rb', line 31

def verify(signature_base_string, signature = '', public_key_or_secret = nil)
  if header[:alg].to_s == 'none'
    raise UnexpectedAlgorighm if public_key_or_secret
    signature == '' or raise VerificationFailed
  else
    JWS.new(self).verify(signature_base_string, signature, public_key_or_secret)
  end
end