[Facebooker-talk] Form method=get signature failure
Paul Covell
pac at alum.mit.edu
Fri Sep 26 07:54:15 EDT 2008
Hi, this topic was originally posted here:
http://forums.pragprog.com/forums/59/topics/917
Quick summary: forms created method=GET fail with a signature
validation error:
Facebooker::Session::IncorrectSignature
(Facebooker::Session::IncorrectSignature):
/vendor/plugins/facebooker/lib/facebooker/rails/controller.rb:
146:in `verify_signature'
/vendor/plugins/facebooker/lib/facebooker/rails/controller.rb:
120:in `verified_facebook_params'
/vendor/plugins/facebooker/lib/facebooker/rails/controller.rb:
35:in `facebook_params'
/vendor/plugins/facebooker/lib/facebooker/rails/controller.rb:
63:in `valid_session_key_in_session?'
/vendor/plugins/facebooker/lib/facebooker/rails/controller.rb:
41:in `session_already_secured?'
//////
This can be reproduced with a small test application:
rails test
cd test
script/plugin install git://github.com/mmangino/facebooker.git
ruby script/generate controller home index search
views/home/index.fbml.erb:
<h1>Home</h1>
<% form_tag(url_for(:action => :search), {:method=>:get}) do %>
<p><%= text_field_tag(:keyword, params[:keyword]) %></p>
<p><fb:submit>Go</fb:submit></p>
<% end %>
app/controller/application.rb—added immediately below helper :all
ensure_application_is_installed_by_facebook_user
ensure_authenticated_to_facebook
And then I set up my development server and tunnel as I do with normal
development. The error is the same. Also, if I remove the :method
=> :get, the error does not occur.
//////
I have done some additional digging tonight on the problem, and here
is what I've learned:
1. The verify_signature is working correctly (as expected) and
calculating on all values passed to it --- the calculation is actually
rendering a result inconsistent with the fb_sig passed to it.
2. The hidden parameters from the form that appear in the URL are
being faithfully transmitted through Facebook to Facebooker and
showing up properly in verify_signature
3. A copy + paste of the "raw string" generated by a working GET and
a failing GET are identical except the timestamp and the session
expiration time (of course). You can test a working GET by removing
the parameters from the URL letting facebook regenerate them. This
way everything else is identical.
==> I can only conclude that the fb_sig sent by facebook is being
calculated based on a different order of parameters or excluding some
parameters, but I don't know how to go about finding which ones
(except brute force yuck). I can't find any of the FB pages that
offer any useful advice on this.
Quick reference:
Forms and Hidden Inputs: http://wiki.developers.facebook.com/index.php/UsageNotes/Forms
How Facebook Authenticates: http://wiki.developers.facebook.com/index.php/How_Facebook_Authenticates_Your_Application
Verifying the Signature: http://wiki.developers.facebook.com/index.php/Verifying_The_Signature
-Paul
More information about the Facebooker-talk
mailing list