转自:http://www.javaeye.com/topic/177929
Facebook的authentication
Facebook的认证过程其实不复杂, 但是如果java程序捧着官方提供的java包捣腾,恐怕还要费些功夫,官方那个只提供了桌面应用的认证程序,而web应用的认证过程则大厢径庭。
应用程序在注册时会获得该应用的api_key和secret,这实际上是访问该应用的用户名和密码了,只有开发人员可以看到。事实上以后的每次调用facebook api都会带上这api_key,但这显然还不够,登录用户必须拥自己特定的信息:sessionKey,每次调用带上这个key才能将用户的信息关联(类似于tomcat的jsessionid),因此认证的主要目的就是拿到sessionKey。
外部web应用的认证过程:这种应用只通过web services与facebook集成,这种应用唯一要做的是获得取得调用web services的权限,上图的流程很清楚了。如果用java开发,一般先用一个filter或其它interceptor拦截,如果发现没有登录 facebook应用自动导到facebook的login页面(在request的参数里将登录完后回来的页面传进去),登录后跳回到原来的页面,就可以在filter中通过request里的authtoken获取sessionKey了,这种应用一般将认证后的sessionKey放到HttpSession就可以了(以后不用重复认证)。
fbml应用的认证过程:事实上内部应用的authentication远比外部应用简单,但是官方竟然没提供文档。由于facebook的用户必须登录才能使用,实际上在使用 facebook应用时用户已经登录并拥有了sessionKey和user_id等参数,因此在中间人(facebook server)中转到应用的url时,它在request里会把sessionKey和userId等参数传进去,因此在拿到这些参数后客户端可以直接进行任何web services的调用。