Module JWT
In: lib/jwt.rb
lib/jwt.rb

Methods

Classes and Modules

Class JWT::DecodeError

Public Class methods

[Source]

    # File lib/jwt.rb, line 36
36:   def self.base64url_decode(str)
37:     str += '=' * (4 - str.length.modulo(4))
38:     Base64.decode64(str.gsub("-", "+").gsub("_", "/"))
39:   end

[Source]

    # File lib/jwt.rb, line 36
36:   def self.base64url_decode(str)
37:     str += '=' * (4 - str.length.modulo(4))
38:     Base64.decode64(str.gsub("-", "+").gsub("_", "/"))
39:   end

[Source]

    # File lib/jwt.rb, line 41
41:   def self.base64url_encode(str)
42:     Base64.encode64(str).gsub("+", "-").gsub("/", "_").gsub("\n", "").gsub('=', '')
43:   end

[Source]

    # File lib/jwt.rb, line 41
41:   def self.base64url_encode(str)
42:     Base64.encode64(str).gsub("+", "-").gsub("/", "_").gsub("\n", "").gsub('=', '')
43:   end

[Source]

    # File lib/jwt.rb, line 61
61:   def self.decode(jwt, key=nil, verify=true, &keyfinder)
62:     segments = jwt.split('.')
63:     raise JWT::DecodeError.new("Not enough or too many segments") unless [2,3].include? segments.length
64:     header_segment, payload_segment, crypto_segment = segments
65:     signing_input = [header_segment, payload_segment].join('.')
66:     begin
67:       header = MultiJson.decode(base64url_decode(header_segment))
68:       payload = MultiJson.decode(base64url_decode(payload_segment))
69:       signature = base64url_decode(crypto_segment) if verify
70:     rescue JSON::ParserError
71:       raise JWT::DecodeError.new("Invalid segment encoding")
72:     end
73:     if verify == true
74:       algo = header['alg']
75: 
76:       if keyfinder
77:         key = keyfinder.call(header)
78:       end
79: 
80:       begin
81:         if ["HS256", "HS384", "HS512"].include?(algo)
82:           raise JWT::DecodeError.new("Signature verification failed") unless signature == sign_hmac(algo, signing_input, key)
83:         elsif ["RS256", "RS384", "RS512"].include?(algo)
84:           raise JWT::DecodeError.new("Signature verification failed") unless verify_rsa(algo, key, signing_input, signature)
85:         else
86:           raise JWT::DecodeError.new("Algorithm not supported")
87:         end
88:       rescue OpenSSL::PKey::PKeyError
89:         raise JWT::DecodeError.new("Signature verification failed")
90:       end
91:     end
92:     payload
93:   end

[Source]

    # File lib/jwt.rb, line 61
61:   def self.decode(jwt, key=nil, verify=true, &keyfinder)
62:     segments = jwt.split('.')
63:     raise JWT::DecodeError.new("Not enough or too many segments") unless [2,3].include? segments.length
64:     header_segment, payload_segment, crypto_segment = segments
65:     signing_input = [header_segment, payload_segment].join('.')
66:     begin
67:       header = MultiJson.decode(base64url_decode(header_segment))
68:       payload = MultiJson.decode(base64url_decode(payload_segment))
69:       signature = base64url_decode(crypto_segment) if verify
70:     rescue JSON::ParserError
71:       raise JWT::DecodeError.new("Invalid segment encoding")
72:     end
73:     if verify == true
74:       algo = header['alg']
75: 
76:       if keyfinder
77:         key = keyfinder.call(header)
78:       end
79: 
80:       begin
81:         if ["HS256", "HS384", "HS512"].include?(algo)
82:           raise JWT::DecodeError.new("Signature verification failed") unless signature == sign_hmac(algo, signing_input, key)
83:         elsif ["RS256", "RS384", "RS512"].include?(algo)
84:           raise JWT::DecodeError.new("Signature verification failed") unless verify_rsa(algo, key, signing_input, signature)
85:         else
86:           raise JWT::DecodeError.new("Algorithm not supported")
87:         end
88:       rescue OpenSSL::PKey::PKeyError
89:         raise JWT::DecodeError.new("Signature verification failed")
90:       end
91:     end
92:     payload
93:   end

[Source]

    # File lib/jwt.rb, line 45
45:   def self.encode(payload, key, algorithm='HS256', header_fields={})
46:     algorithm ||= "none"
47:     segments = []
48:     header = {"typ" => "JWT", "alg" => algorithm}.merge(header_fields)
49:     segments << base64url_encode(MultiJson.encode(header))
50:     segments << base64url_encode(MultiJson.encode(payload))
51:     signing_input = segments.join('.')
52:     if algorithm != "none"
53:       signature = sign(algorithm, signing_input, key)
54:       segments << base64url_encode(signature)
55:     else
56:       segments << ""
57:     end
58:     segments.join('.')
59:   end

[Source]

    # File lib/jwt.rb, line 45
45:   def self.encode(payload, key, algorithm='HS256', header_fields={})
46:     algorithm ||= "none"
47:     segments = []
48:     header = {"typ" => "JWT", "alg" => algorithm}.merge(header_fields)
49:     segments << base64url_encode(MultiJson.encode(header))
50:     segments << base64url_encode(MultiJson.encode(payload))
51:     signing_input = segments.join('.')
52:     if algorithm != "none"
53:       signature = sign(algorithm, signing_input, key)
54:       segments << base64url_encode(signature)
55:     else
56:       segments << ""
57:     end
58:     segments.join('.')
59:   end

[Source]

    # File lib/jwt.rb, line 14
14:   def self.sign(algorithm, msg, key)
15:     if ["HS256", "HS384", "HS512"].include?(algorithm)
16:       sign_hmac(algorithm, msg, key)
17:     elsif ["RS256", "RS384", "RS512"].include?(algorithm)
18:       sign_rsa(algorithm, msg, key)
19:     else
20:       raise NotImplementedError.new("Unsupported signing method")
21:     end
22:   end

[Source]

    # File lib/jwt.rb, line 14
14:   def self.sign(algorithm, msg, key)
15:     if ["HS256", "HS384", "HS512"].include?(algorithm)
16:       sign_hmac(algorithm, msg, key)
17:     elsif ["RS256", "RS384", "RS512"].include?(algorithm)
18:       sign_rsa(algorithm, msg, key)
19:     else
20:       raise NotImplementedError.new("Unsupported signing method")
21:     end
22:   end

[Source]

    # File lib/jwt.rb, line 32
32:   def self.sign_hmac(algorithm, msg, key)
33:     OpenSSL::HMAC.digest(OpenSSL::Digest::Digest.new(algorithm.sub('HS', 'sha')), key, msg)
34:   end

[Source]

    # File lib/jwt.rb, line 32
32:   def self.sign_hmac(algorithm, msg, key)
33:     OpenSSL::HMAC.digest(OpenSSL::Digest::Digest.new(algorithm.sub('HS', 'sha')), key, msg)
34:   end

[Source]

    # File lib/jwt.rb, line 24
24:   def self.sign_rsa(algorithm, msg, private_key)
25:     private_key.sign(OpenSSL::Digest::Digest.new(algorithm.sub('RS', 'sha')), msg)
26:   end

[Source]

    # File lib/jwt.rb, line 24
24:   def self.sign_rsa(algorithm, msg, private_key)
25:     private_key.sign(OpenSSL::Digest::Digest.new(algorithm.sub('RS', 'sha')), msg)
26:   end

[Source]

    # File lib/jwt.rb, line 28
28:   def self.verify_rsa(algorithm, public_key, signing_input, signature)
29:     public_key.verify(OpenSSL::Digest::Digest.new(algorithm.sub('RS', 'sha')), signature, signing_input)
30:   end

[Source]

    # File lib/jwt.rb, line 28
28:   def self.verify_rsa(algorithm, public_key, signing_input, signature)
29:     public_key.verify(OpenSSL::Digest::Digest.new(algorithm.sub('RS', 'sha')), signature, signing_input)
30:   end

[Validate]