Sha256: 1baa42c3192f6beab4db9c40d9cd16d1be3fea9f2ecbef995093b028b469929c

Contents?: true

Size: 1.17 KB

Versions: 2

Compression:

Stored size: 1.17 KB

Contents

require 'json/jwt'
require 'net/http'

module Rack
  class PrxAuth
    class Certificate
      EXPIRES_IN = 43200
      DEFAULT_CERT_LOC = URI('https://id.prx.org/api/v1/certs')

      attr_reader :cert_location

      def initialize(cert_uri = nil)
        @cert_location = cert_uri.nil? ? DEFAULT_CERT_LOC : URI(cert_uri)
        @certificate = nil
      end

      def valid?(token)
        begin
          JSON::JWT.decode(token, public_key)
        rescue JSON::JWT::VerificationFailed
          false
        else
          true
        end
      end

      private

      def public_key
        certificate.public_key
      end

      def certificate
        if @certificate.nil? || needs_refresh?
          @certificate = fetch
        end
        @certificate
      end

      def fetch
        certs = JSON.parse(Net::HTTP.get(cert_location))
        cert_string = certs['certificates'].values[0]
        @refresh_at = Time.now.to_i + EXPIRES_IN
        OpenSSL::X509::Certificate.new(cert_string)
      end

      def needs_refresh?
        expired? || @refresh_at <= Time.now.to_i
      end

      def expired?
        @certificate.not_after < Time.now
      end
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
prx_auth-1.7.1 lib/rack/prx_auth/certificate.rb
prx_auth-1.7.0 lib/rack/prx_auth/certificate.rb