Wednesday, May 30, 2012

facebook error "Error validating verification code"


very strange error. i use gide http://developers.facebook.com/docs/authentication/ . so i create request to fb and pass redirect_uri. i use test site on localhost. so if i pass




redirect_uri=http://localhost/test_blog/index.php




it works fine, but if i pass




redirect_uri=http://localhost/test_blog/index.php?r=site/oauth2




it don't want work. i try to use




redirect_uri= . urlencode('http://localhost/test_blog/index.php?r=site/oauth2)




but not work. i try to explaine. i success get code, but when i access https://graph.facebook.com/me?access_token i get error 'Error validating verification code'. i checked evering, error is in ?r=site/oauth2 but i need passing some params can somebody help me? i read post http://forum.developers.facebook.net/viewtopic.php?id=70855 but nothing work for me


Source: Tips4all

8 comments:

  1. There are presently (as of March 2011) undocumented requirements regarding what makes a valid redirect_uri.

    First, both redirect_uri paramaters to authorize and access_token must match.

    Apparently Facebook (or rather OAuth2) is using the redirect_uri as a internal key to encode the code returned for the access_token request. It's kinda clever since it verifies back to your site. It explains why the access_token request which wouldn't otherwise need a redirect_uri parameter requires one.

    Second, you cannot use many special characters in the redirect_uri.

    A lot of discussion rages whether parameters can be passed at all. They can, you're limited which characters are valid but no one has published a list that I know. Traditional methods like url/html encoding will fail because percent(%) is not valid. Slash (/) is not valid either so a nested redirection url will always fail. The ONLY way to overcome the special char limitation is to encode the value of the parameter to base64. If you're using ASP.NET, look up Convert.ToBase64.

    Lastly, and this is more of a side-note. There are a lot of programmers passing along misinformation that a simple solution is to pass type=client_cred. This may limit your access to some of the permissions you requested in your authorization. It is inadvisable.

    ReplyDelete
  2. Had the same problem all day when testing with redirect_uri=http://localhost:8000 (encoded to http%3A%2F%2Flocalhost%3A8000)... Solution was simply to make sure to put the trailing slash (/) on the end of the uri. So redirect_uri=http://localhost:8000/ (encoded to http%3A%2F%2Flocalhost%3A8000%2F). Again, make sure the redirect_uri is identical for both requests.

    ReplyDelete
  3. From what I can see, the problem here is that the redirect_uri must end with '/' and not contain '?' or other special characters. I think that is why you are getting 'Error validating verification code'. This error only appears if you are using file_get_contents(), and not when using the facebook php library.
    This is the solution for php, don't know if this error appears in other SDK's.

    ReplyDelete
  4. Part of the information given by Aaron Wheeler is incorrect.

    It is true that the 'redirect_uri' parameter must be identical in both requests, however it is perfectly possible to URL encode a regular URL and use that as the value for the 'redirect_url' parameter, so long as you're careful to further URL encode any inline URLs.

    For instance, you wish facebook to redirect to the following URL:

    http://www.mysite.com/Users/oAuthComplete?my_param_1=/Party/pants


    Attempting to redirect the user to

    'https://www.facebook.com/dialog/oauth?client_id=12345&redirect_uri='
    . urlencode('http://www.mysite.com/Users/oAuthComplete?my_param_1=/Party/pants');


    Will fail as /Party/Pants creates an invalid URL

    However, redirecting to

    'https://www.facebook.com/dialog/oauth?client_id=12345&redirect_uri='
    .urlencode('http://www.mysite.com/Users/oAuthComplete?my_param_1='
    .urlencode('/Party/pants'));


    Will work as expected.

    If you are using the returned the redrect_uri value in the second, authenticate application request, be sure to url encode again - the value is automatically URL decoded when populating the $_GET superglobal. - This is what tripped me up.

    'https://graph.facebook.com/oauth/access_token?client_id=12345&&client_secret=SECRET&code=1234567'
    .urlencode('http://www.mysite.com/Users/oAuthComplete?my_param_1='
    .urlencode($_GET['my_param_1']));


    P.s. In your actual code, I'd recommend using sprintf() rather than chaining string together like in my example, for better readability.

    ReplyDelete
  5. I'm not sure if it will help, but i would suggest to encode only values in the url. Not the whole thing. eg:

    redirect_uri='http://localhost/test_blog/index.php?r='.urlencode('site/oauth2');

    ReplyDelete
  6. I was having the pb and finally fix it adding the type=client_cred parameter in the url.

    ReplyDelete
  7. I just had the same problem.

    Admittedly, I am a super n00b so excuse me if this solution doesnt make any sense in actual practice.

    I simply set a short fuse cookie (1-2 min) with a test variable in the page with my FB Connect button. When FB came back with information to my data parsing/handling script I checked for this cookie where I was redirecting it and if found, directed the user to the proper URL using header:location.

    Of course some browsers/users etc disable cookies. This obviously wont work there (maybe use a session var and destroy it in the fb data handler?) I am sure there is a better way to do it but at the moment, this bandaid works.

    ReplyDelete
  8. I noticed you are using Yii which I;m using as well and had the same problem for half the day. As mentioned, the problem is the special characters in your url i.e. r=site/oath2

    You can fix it by enabling pretty urls in your config so that your url becomes index.php/site/oath2

    It seems to work without the trailing slash though.

    ReplyDelete