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)
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 = JSON.parse(base64url_decode(header_segment))
68:       payload = JSON.parse(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 ["HS256", "HS384", "HS512"].include?(algo)
77:         raise JWT::DecodeError.new("Signature verification failed") unless signature == sign_hmac(algo, signing_input, key)
78:       elsif ["RS256", "RS384", "RS512"].include?(algo)
79:         raise JWT::DecodeError.new("Signature verification failed") unless verify_rsa(algo, key, signing_input, signature)
80:       else
81:         raise JWT::DecodeError.new("Algorithm not supported")
82:       end
83:     end
84:     payload
85:   end

[Source]

    # File lib/jwt.rb, line 61
61:   def self.decode(jwt, key=nil, verify=true)
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 = JSON.parse(base64url_decode(header_segment))
68:       payload = JSON.parse(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 ["HS256", "HS384", "HS512"].include?(algo)
77:         raise JWT::DecodeError.new("Signature verification failed") unless signature == sign_hmac(algo, signing_input, key)
78:       elsif ["RS256", "RS384", "RS512"].include?(algo)
79:         raise JWT::DecodeError.new("Signature verification failed") unless verify_rsa(algo, key, signing_input, signature)
80:       else
81:         raise JWT::DecodeError.new("Algorithm not supported")
82:       end
83:     end
84:     payload
85:   end

[Source]

    # File lib/jwt.rb, line 45
45:   def self.encode(payload, key, algorithm='HS256')
46:     algorithm ||= "none"
47:     segments = []
48:     header = {"typ" => "JWT", "alg" => algorithm}
49:     segments << base64url_encode(header.to_json)
50:     segments << base64url_encode(payload.to_json)
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')
46:     algorithm ||= "none"
47:     segments = []
48:     header = {"typ" => "JWT", "alg" => algorithm}
49:     segments << base64url_encode(header.to_json)
50:     segments << base64url_encode(payload.to_json)
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]