lib/decode_this.rb in decode_this-0.1.6 vs lib/decode_this.rb in decode_this-0.1.7

- old
+ new

@@ -1,3 +1,70 @@ # frozen_string_literal: true require 'decode_this/version' -require 'decode_this/decoder' +require 'decode_this/safe_decoding' +require 'yaml' +require 'jwt' + +module DecodeThis + def self.decode(header_value) + token = token_from_header(header_value) + + safe_decode { JWT.decode(token, public_key, true, algorithm: config['algorithm']).first } + end + + def self.config + raise ConfigFileNotFoundError.new("Cannot found configuration file in #{@config_path}") unless @config_path + + @config ||= YAML.load(File.open(@config_path))[@env] + end + + def self.config_path=(config_path) + @config_path = File.expand_path(config_path) + end + + def self.config_path + @config_path + end + + def self.logger + @logger + end + + def self.logger=(logger) + @logger = logger + end + + def self.env=(env) + @env = env.to_s + end + + def self.env + @env + end + + private + + def self.safe_decode(&block) + SafeDecoding.call(logger, &block) + end + + def self.token_from_header(header_value) + return unless header_value + + token = header_value.match(/^#{config['authorization_scheme']} (.+)/) + token[1] if token + end + + def self.public_key + OpenSSL::PKey::RSA.new(pem).public_key + end + + def self.pem + keys_absolute_path = File.expand_path(config['key_path']) + + if !File.readable?(keys_absolute_path) + raise DecodeThis::KeyFileNotFoundError.new("Cannot found file in #{config['key_path']}") + end + + File.read(config['key_path']) + end +end