Module | JWT |
In: |
lib/jwt.rb
lib/jwt.rb |
# 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
# 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
# File lib/jwt.rb, line 41 41: def self.base64url_encode(str) 42: Base64.encode64(str).gsub("+", "-").gsub("/", "_").gsub("\n", "").gsub('=', '') 43: end
# File lib/jwt.rb, line 41 41: def self.base64url_encode(str) 42: Base64.encode64(str).gsub("+", "-").gsub("/", "_").gsub("\n", "").gsub('=', '') 43: end
# 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
# 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
# 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
# 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
# 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
# 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
# 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
# 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
# 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
# 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
# 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