客户端顶级重定向 Facebook Canvas / X-Frame-Options 拒绝

Top level redirect at client side Facebook Canvas / X-Frame-Options Deny

我正在尝试使用 Java/Spring 社交 Facebook 库构建 Facebook Canvas 应用程序。

当用户第一次访问 Canvas 页面(apps.facebook.com/mycanvasapp)时,facebook 正在 POST 中使用 'signed_request' body 到我的应用 url.

由于用户是第一次访问应用程序,facebook 在 POST body 中发送空 'oauth_token';因此,我的应用 returns HTTP 200 代码具有以下 Java 脚本代码,用于向用户显示授权对话框。

top.location.href='https://www.facebook.com/v2.5/dialog/oauth?client_id=12345&redirect_uri=https://myapp.com/canvas/';

这是为了在 client/browser 端进行顶级重定向,因为 iframe 中不允许 HTTP 服务器重定向。

但是,我确实在 browser/Chrome 日志中遇到以下错误,并且未能向用户提供授权 window。

Refused to display 'https://myapp.com/canvas/' in a frame because it set 'X-Frame-Options' to 'DENY'.

在其他 post 中提出了类似的问题 - Web App in Facebook Canvas / X-Frame-Options Deny Case 它建议执行浏览器端顶级重定向而不是 HTTP 服务器重定向。

我在 Java 脚本中仅使用 'top.location.href' 进行顶级浏览器重定向,但仍然遇到同样的问题。

当我在 curl/command 行中重播请求时,这是我的应用程序返回的响应,对我来说似乎没问题。

 HTTP/1.1 200 OK
 Connection: keep-alive
 Server: Apache-Coyote/1.1
 X-Content-Type-Options: nosniff
 X-Xss-Protection: 1; mode=block
 Cache-Control: no-cache, no-store, max-age=0, must-revalidate
 Pragma: no-cache
 Expires: 0
 Strict-Transport-Security: max-age=31536000 ; includeSubDomains
 X-Frame-Options: DENY
 Access-Control-Allow-Origin: *
 Access-Control-Allow-Methods: POST, GET, PUT, OPTIONS, DELETE
 Access-Control-Max-Age: 3600
 Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept, X-Auth-Token
 Content-Language: en-US
 Transfer-Encoding: chunked
 Date: Sat, 09 Jul 2016 04:40:17 GMT
 Via: 1.1 vegur
<script>top.location.href='https://www.facebook.com/v2.5/dialog/oauth?client_id=12345&redirect_uri=https://myapp.com/canvas/';</script>

调整 'X-Frame-Options' header 字段似乎帮助不大。

我错过了什么?有人可以提出一个可行的解决方案吗?

有一些关于使用 Facebook Java 脚本 SDK 库的建议。但是由于我的应用程序包含在 Facebook Canvas 页面中,在访问 Canvas 页面时,Facebook 会对我的服务器执行 HTTP Post,所以想知道如何加载 HTML/Java 脚本来加载 Facebook Java 在此过程开始之前编写 SDK 库脚本。

PS:我在我的应用程序中使用 org.springframework.social.facebook.web.CanvasSignInController Spring pre-built 控制器。

我通过 disabling/suppressing 解决了这个问题 headers 来自我的服务器的 POST 响应,

X-Content-Type-Options: nosniff X-Xss-Protection: 1; mode=block Cache-Control: no-cache, no-store, max-age=0, must-revalidate Strict-Transport-Security: max-age=31536000 ; includeSubDomains X-Frame-Options: DENY Access-Control-Allow-Origin: * Access-Control-Allow-Methods: POST, GET, PUT, OPTIONS, DELETE Access-Control-Max-Age: 3600 Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept, X-

关键是排除headers中的X-Frame-Options & Strict-Transport-Security,现在解决了我的问题。