我正在开发一个网站,应该是响应,以便人们可以从他们的手机访问它。该网站有一些安全的部分,可以登录使用谷歌,Facebook,…等(OAuth)。

服务器后端是用ASP开发的。Net Web API 2,前端主要是AngularJS加上一些Razor。

对于身份验证部分,在包括Android在内的所有浏览器中,一切都很好,但谷歌身份验证在iPhone上不起作用,它给我这个错误消息

Refused to display 'https://accounts.google.com/o/openid2/auth
?openid.ns=http://specs.openid.ne…tp://axschema.org/namePerson
/last&openid.ax.required=email,name,first,last'
in a frame because it set 'X-Frame-Options' to 'SAMEORIGIN'.

现在就我而言,我没有在我的HTML文件中使用任何iframe。

我搜索了一下,但没有答案让我解决这个问题。


当前回答

有点晚了,但是如果您使用本地应用程序客户端ID而不是web应用程序客户端ID,也会导致此错误。

其他回答

如果你在谷歌文档查看器中使用iframe,请更改iframe:

Iframe src="https://docs.google.com/viewer?url=' + url_your_document .

to:

Iframe src="https://docs.google.com/viewer?url=' + url_your_document + '&embedded=true"

这对我很管用。

有点晚了,但是如果您使用本地应用程序客户端ID而不是web应用程序客户端ID,也会导致此错误。

在本例中,他们将报头设置为SAMEORIGIN,这意味着他们不允许在域外的iframe中加载资源。所以这个iframe不能跨域显示

为此,您需要匹配apache或您正在使用的任何其他服务中的位置

如果你使用apache,那么在httpd.conf文件中。

  <LocationMatch "/your_relative_path">
      ProxyPass absolute_path_of_your_application/your_relative_path
      ProxyPassReverse absolute_path_of_your_application/your_relative_path
   </LocationMatch>

在使用iframe注销具有不同域的子站点时遇到了类似的问题。我使用的解决方案是首先加载iframe,然后在加载帧后更新源代码。

var frame = document.createElement('iframe'); Frame.style.display = 'none'; 框架。setAttribute(“src”、“:空白”); document.body.appendChild(框架); 框架。addEventListener('load', () => { 框架。setAttribute(“src”,url); });

我做了下面的改变,并为我工作良好。

只需添加属性<iframe src="URL" target="_parent" />

_parent:这将在同一个窗口中打开嵌入的页面。

_blank:在不同的选项卡