2010-12-10

Flash的跨域访问


最近做了个新浪微博的小应用,遇到了不少头疼的问题,主要出在Flash的跨域访问问题上。

应用地址:这里

要做这个应用,没有自己的服务器,所以在网上找:

应用是显示在微软的smallbusiness上,该空间是静态的,有自助建站功能,页面不需要我去设计了。

flash存放在新浪的SAE上,新浪SAE提供php空间,作为新浪app的运行和开发平台。

微博的数据由新浪微博API获得。

应用的数据存储在SAE的mySQL数据库中。

开发过程中出现了这样一些问题:

原本想将flash挂在smallbusiness上的,发现不能访问微博API的数据,存在跨域问题。在网上寻找解决办法,最多的是说在服务器上建立crossdomain.xml文件。该文件是存放在被访问的域名下,而微博API域名下我也没办法去放置这样一个文件。。所以用了另一个方法解决:在SAE上用php做数据中转。于是封装了几个用到的api,在SAE应用域名下建立了自己的crossdomain.xml,这样flash就能获取微博的数据了。

flash读写SAE上数据库的解决办法也是跟上面说的一样。

flash的微博应用本身有个获取授权码的问题,因为没办法callback,一般情况下是需要弹出授权页面,由用户自己手动获得授权码并输入到flash中。而flash弹出的窗口是不被浏览器信任的,很容易被拦截。所以为了绕过这个过程,也为了避免弹出窗口被屏蔽,使用了php页面授权,再加载flash的方式。其中就会在很多个授权页面中进行跳转,详见OAuth授权

授权的过程中,key是保存在cookie中的,这又出现一个问题,我在IE下浏览总出现key丢失的情况,原因是cookie不受信任,IE安全性设置过高,不受信任的cookie没有保存,授权就没办法完成了。于是将key直接放在页面参数中传递,授权可以通过。

问题接着来,获得授权后的key需要保存,不使用cookie,就使用flash的本地数据的保存方式,这就需要在php授权之前有个验证是否存在保存过的key的一个步骤。

以上这些所有的授权步骤都在smallbusiness的一个页面中完成,用户完全看不到页面跳转的过程,因为使用了一个iframe(目前不知道其他什么办法,iframe似乎也不是很受欢迎),载入的是存在SAE上的php页面。

这其中又出现了一个flash的安全问题,跨域的flash跳转页面当非“_blank”的时候又是不被信任,需要设置allowscriptaccess为always。

至此,在一个静态页面中,flash完成了授权页面的跳转,访问了微博API数据,读写了SAE上的数据库,最终呈现出来。

No comments: