Facebook Auth API文档中没说清楚的事情 (2011-02-28更新)

facebook api的文档写的不清不楚,很多都要靠自己碰壁之后猜测和琢磨问题的原因。

下面是几个文档中没说清楚的地方:

  • The URL:Facebook api首先要使用app的一些id什么的,通过一个link来让用户授权这个app。如果用户授权后,facebook会callback到一个事前自己制定的一个URL,在这里,这个callback URL是“The URL”。因为在下一步想要生成Access Token的时候,设置的redirect uri必须必须是“The URL”。否则就会报类似这样的错误:
{
"error": {
"type": "OAuthException",
"message": "Error validating verification code."
}
}
  • The Host:Facebook要求callback必须是应用程序中设置的domain的子domain或者子domain中的一个link,否则facebook是不会callback的。这点文档上倒是写的清楚了,不过无法指定localhost,这样就没法在本地调试程序了。
  • More About The URL:callback URL其实可以挂参数,但是生成code和生成access token的这个URL必须完全一样——包括挂的参数。否则也会报第一条里的那个错误。而挂参数也很扯淡,推荐不要考虑挂参数。扯淡的地方有几点,首先有些字符不支持,无论是不是编码,比如@,比如参数值的第一个字符不能是d(别问我为啥。。。可能是我的环境有点问题吧)。我的猜测是,facebook的code里面其实包含了callback url(包括参数)的特征值信息(hash),每次去用这个code生成access token的时候,facebook会先验证code里的hash值和这次传递的callback的hash值是否匹配,如果不匹配就暴第一条里的那个错误。所以facebook也不知道是code错了还是callback url不对。多半是callback url不一致。因为code错了可能是下面的异常信息:
  • Code is Invalidate: 没错,code是会过期的。这点facebook的文档里好像也没写清楚,只是说access token会过期,而且在生成token的时候给出了多少s后过期。但是code啥时候过期没说。至少有一个触发条件——用户手动的注销,然后再登录。根据笔者的测试,如果用户不做手动的注销动作,大概一两天code就会过期,过期后再使用code生成access code,会得到下面的错误:
{
"error": {
"type": "OAuthException",
"message": "Code was invalid or expired."
}
}
当然,如果再次生成一次code,之前生成的code就自动失效,使用那个code也会得到上面的异常。根据文档上的说明,code和根据这个code生成的access code是同时过期的。有效时间就是生成token的时候得到的那个时间。
  • Redirect?:facebook只能通过redirect才能生成code。如果在浏览器里,这个动作浏览器会处理,自己只要设好redirect uri就行了。如果想在后台自动刷新code(code会失效的嘛),就需要在程序内部模拟redirect。有没有谁知道咋做,在gae的环境下
  • 自己看文档没看全,facebook有一个叫做offline_access的权限,可以生成永远不会过期的code。
posted @ 2011-02-26 23:33  深夜两点  阅读(2384)  评论(7编辑  收藏  举报