客户端Facebook Canvas / X-Frame-Options Deny的顶级重定向

时间:2016-07-09 05:40:01

标签: facebook spring-security facebook-canvas x-frame-options spring-social-facebook

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

当用户第一次访问Canvas页面(apps.facebook.com/mycanvasapp)时,Facebook正在使用' signed_request'进行HTTP POST。在我的应用网址的正文。

当用户第一次访问该应用时,Facebook会发送空的' oauth_token'在POST体内;因此我的应用程序返回带有Java Script代码的HTTP 200代码,以向用户提供授权对话框。

  top.location.href =' HTTPS://www.facebook.com/v2.5/dialog/oauth CLIENT_ID = 12345&安培; REDIRECT_URI = HTTPS:?//myapp.com/canvas/' ;;

这是在客户端/浏览器端进行顶级重定向,因为iframe中不允许HTTP服务器重定向。

但是,我确实在浏览器/ Chrome日志中出现以下错误,无法向用户显示授权窗口。

  

拒绝展示' https://myapp.com/canvas/'因为它在一个框架中   设置' X-Frame-Options'到' DENY'。

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

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

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

 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>

调整&#39; X-Frame-Options&#39;标题字段似乎没什么帮助。

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

使用Facebook Java Script SDK库有一些建议。但是当我的应用程序包含在Facebook Canvas页面中时,在访问Canvas页面时Facebook会将HTTP Post发送到我的服务器,因此想知道如何在此过程开始之前加载HTML / Java脚本以加载Facebook Java Script SDK库。

PS:我在我的app中使用org.springframework.social.facebook.web.CanvasSignInController Spring预构建的控制器。

1 个答案:

答案 0 :(得分:1)

我通过禁用/禁止来自我的服务器的POST响应的安全标头解决了这个问题,

  

X-Content-Type-Options:nosniff X-Xss-Protection:1;模式=块   Cache-Control:no-cache,no-store,max-age = 0,must-revalidate   严格运输安全: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 -

关键是要排除X-Frame-Options&amp;标题中的严格传输 - 安全性,现在解决了我的问题。