Sha256: 34a21fba7453d3f0f6f5c1ac63adadb6133cd56ab490f44c7ddb7917158f275a

Contents?: true

Size: 1.28 KB

Versions: 33

Compression:

Stored size: 1.28 KB

Contents

require 'base64'
require 'openssl'

module FbGraph
  class Auth
    class SignedRequest
      OAUTH_DIALOG_ENDPOINT = 'https://www.facebook.com/dialog/oauth'

      def self.verify(client, signed_request)
        signature, payload = signed_request.split('.')
        raise VerificationFailed.new(401, 'No Signature') if signature.blank?
        raise VerificationFailed.new(401, 'No Payload') if payload.blank?
        signature = base64_url_decode signature
        data = decode_json base64_url_decode(payload)
        raise VerificationFailed.new(401, 'Unexpected Signature Algorithm') unless data[:algorithm] == 'HMAC-SHA256'
        _signature_ = sign(client.secret, payload)
        raise VerificationFailed.new(401, 'Signature Invalid') unless signature == _signature_
        data
      end

      private

      def self.sign(key, data)
        klass = OpenSSL::Digest::SHA256.new
        OpenSSL::HMAC.digest(klass, key, data)
      end

      def self.decode_json(json)
        JSON.parse(json).with_indifferent_access
      rescue => e
        raise VerificationFailed.new(400, 'Invalid JSON')
      end

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

Version data entries

33 entries across 33 versions & 1 rubygems

Version Path
fb_graph-1.9.5 lib/fb_graph/auth/signed_request.rb
fb_graph-1.9.4 lib/fb_graph/auth/signed_request.rb
fb_graph-1.9.3 lib/fb_graph/auth/signed_request.rb
fb_graph-1.9.2 lib/fb_graph/auth/signed_request.rb
fb_graph-1.9.1 lib/fb_graph/auth/signed_request.rb
fb_graph-1.9.0 lib/fb_graph/auth/signed_request.rb
fb_graph-1.8.6 lib/fb_graph/auth/signed_request.rb
fb_graph-1.8.5 lib/fb_graph/auth/signed_request.rb
fb_graph-1.8.4 lib/fb_graph/auth/signed_request.rb
fb_graph-1.8.3 lib/fb_graph/auth/signed_request.rb
fb_graph-1.8.2 lib/fb_graph/auth/signed_request.rb
fb_graph-1.8.1 lib/fb_graph/auth/signed_request.rb
fb_graph-1.8.0 lib/fb_graph/auth/signed_request.rb
fb_graph-1.8.0.alpha2 lib/fb_graph/auth/signed_request.rb
fb_graph-1.7.5 lib/fb_graph/auth/signed_request.rb
fb_graph-1.8.0.alpha lib/fb_graph/auth/signed_request.rb
fb_graph-1.7.4 lib/fb_graph/auth/signed_request.rb
fb_graph-1.7.3 lib/fb_graph/auth/signed_request.rb
fb_graph-1.7.2 lib/fb_graph/auth/signed_request.rb
fb_graph-1.7.1 lib/fb_graph/auth/signed_request.rb