客户端顶级重定向 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,现在解决了我的问题。
我正在尝试使用 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,现在解决了我的问题。