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