Sha256: d8d35ebee439ee6ddae0d71d1d4e0d3efc0ba32b4645579a76794fcda45b968e

Contents?: true

Size: 904 Bytes

Versions: 2

Compression:

Stored size: 904 Bytes

Contents

module PlataformaSocial
  class Facebook    
    def self.parse_signed_request signed_request, max_age = 3600
      secret = PlataformaSocial.facebook_app_secret
      encoded_sig, encoded_envelope = signed_request.split('.', 2)
      envelope = JSON.parse(base64_url_decode(encoded_envelope))
      algorithm = envelope['algorithm']

      raise 'Invalid request. (Unsupported algorithm.)' \
        if algorithm != 'HMAC-SHA256'

      raise 'Invalid request. (Too old.)' \
        if envelope['issued_at'] < Time.now.to_i - max_age

      raise 'Invalid request. (Invalid signature.)' \
        if base64_url_decode(encoded_sig) != OpenSSL::HMAC.hexdigest('sha256', secret, encoded_envelope).split.pack('H*')

      envelope
    end

    private
      
      def self.base64_url_decode(str)
        str += '=' * (4 - str.length.modulo(4))
        Base64.decode64(str.tr('-_','+/'))
      end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
plataforma_social-0.0.3 lib/plataforma_social/facebook.rb
plataforma_social-0.0.2 lib/plataforma_social/facebook.rb