我正在尝试使用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预构建的控制器。
答案 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;标题中的严格传输 - 安全性,现在解决了我的问题。