Decodificando la solicitud firmada de Facebook en Ruby / Sinatra

Debido a que Facebook desprecia el nuevo FBML, estoy buscando una nueva forma de crear una pestaña "revelar" (una pestaña de página que muestra una versión para los fanáticos y otra para los no fanáticos). Facebook ha agregado datos a la firma_request:

Cuando un usuario selecciona su aplicación en el menú de la izquierda, la aplicación recibirá el parámetroigned_request con un parámetro adicional, página, una matriz JSON que contiene el 'id' de la página de Facebook en la que está alojada su pestaña, un booleano (' Me gusta ') que indica si a un usuario le ha gustado o no la página, y un booleano (' admin ') que indica si el usuario es o no un' administrador 'de la página junto con la matriz de información del usuario.

Puedo leer bien el signo de firma firmado, pero luego necesito procesarlo con la decodificación base64url para obtener el JSON correcto. Además, descubrí en mi investigación que el JSON está formateado incorrectamente para Ruby, por lo que debe modificarse antes de decodificarlo. Aquí está el código actual (solo estoy imprimiendo la solicitud firmada en index.erb por ahora):

helpers do
  def base64_url_decode str
    encoded_str = str.gsub('-','+').gsub('_','/')
    encoded_str += '=' while !(encoded_str.size % 4).zero?
    Base64.decode64(encoded_str)
  end

  def decode_data str
    encoded_sig, payload = str.split('.')
    data = ActiveSupport::JSON.decode base64_url_decode(payload)
  end
end

get '/' do
  signed_request = params[:signed_request]
  @signed_request = decode_data(signed_request)
  erb :index
end

Estoy tratando de mantener la aplicación lo más ligera posible y evitar usar una biblioteca completa de Facebook, ya que no será una aplicación completa (solo una pestaña) y no requerirá ningún permiso adicional de los usuarios. Cualquier recomendación sobre mi método para detectar fanáticos también es bienvenida.

Respuestas a la pregunta(3)

Su respuesta a la pregunta