class OmniAuth::Facebook::SignedRequest

Constants

SUPPORTED_ALGORITHM

Attributes

secret[R]
value[R]

Public Class Methods

new(value, secret) click to toggle source
# File lib/omniauth/facebook/signed_request.rb, line 15
def initialize(value, secret)
  @value = value
  @secret = secret
end
parse(value, secret) click to toggle source
# File lib/omniauth/facebook/signed_request.rb, line 11
def self.parse(value, secret)
  new(value, secret).payload
end

Public Instance Methods

payload() click to toggle source
# File lib/omniauth/facebook/signed_request.rb, line 20
def payload
  @payload ||= parse_signed_request
end

Private Instance Methods

base64_decode_url(value) click to toggle source
# File lib/omniauth/facebook/signed_request.rb, line 46
def base64_decode_url(value)
  value += '=' * (4 - value.size.modulo(4))
  Base64.decode64(value.tr('-_', '+/'))
end
parse_signed_request() click to toggle source
# File lib/omniauth/facebook/signed_request.rb, line 26
def parse_signed_request
  signature, encoded_payload = value.split('.')
  return if signature.nil?

  decoded_hex_signature = base64_decode_url(signature)
  decoded_payload = MultiJson.decode(base64_decode_url(encoded_payload))

  unless decoded_payload['algorithm'] == SUPPORTED_ALGORITHM
    raise UnknownSignatureAlgorithmError, "unknown algorithm: #{decoded_payload['algorithm']}"
  end

  if valid_signature?(decoded_hex_signature, encoded_payload)
    decoded_payload
  end
end
valid_signature?(signature, payload, algorithm = OpenSSL::Digest::SHA256.new) click to toggle source
# File lib/omniauth/facebook/signed_request.rb, line 42
def valid_signature?(signature, payload, algorithm = OpenSSL::Digest::SHA256.new)
  OpenSSL::HMAC.digest(algorithm, secret, payload) == signature
end