gpt4 book ai didi

javascript - window.opener 为 null,父窗口无法访问自己的弹出窗口,或 JavaScript 运行时错误 0x800706b5(facebook、twitter 登录或 paypal 付款)

转载 作者:行者123 更新时间:2023-12-03 06:11:20 25 4
gpt4 key购买 nike

在花费了大量时间解决这个问题之后,我想让遇到同样问题的其他人可以搜索到该解决方案。

常见使用场景

  • 您希望通过 Twitter、Facebook、Microsoft、GitHub 或任何其他支持 OAuth 的网站等提供商实现外部身份验证;或
  • 您希望通过 Braintree、Paypal 等提供商实现外部付款。
  • 您已经在使用服务器端 OAuth 库(例如带有 NuGet 包的 Owin)来支持 Twitter 和 Facebook,就像使用“新建项目”向导生成的 ASP.net 项目一样。您可能还使用其他库,或者在另一个 MVC 生态系统(例如 Ruby 或 Node.js/React)中进行开发。
  • 您希望打开一个窗口来执行身份验证,并在成功或失败时关闭该窗口,而不是暂时将用户重定向出您的网站。由于您的网站是单页应用程序,因此重定向整个 View 会破坏用户体验。
  • 您正在通过让您的运行操作打开 localhost:port 从本地主机测试所有这些。此外,您正在使用 IE 或 Edge 作为浏览器。

症状

您连接“使用 XXX 登录”按钮来执行 JavaScript,该 JavaScript 打开一个新窗口,并向您的外部登录 Controller 发送 GET 请求,然后将 302 重定向发送到外部登录提供程序的 OAuth 端点,并附加 OAuth 信息(“挑战”步骤) )。

此时,尝试从父窗口访问弹出窗口将抛出 JS 错误 0x800706b5(对象已被释放或不再可用)。这没关系,因为该窗口不再属于我们,直到它重定向回我们的网站。我们使用 try/catch 处理这种边缘情况,并处理异常,直到它再次可用。

用户授权您的应用(向外部提供商发布 POST),提供商重定向回您的网站。或者,提供商检测到用户已经登录并批准了该应用程序,因此它会重定向回您的网站。在任一情况下。弹出窗口返回到您的区域,并由您的 Controller 之一处理 GET。

问题

弹出窗口内的网站页面无法访问其开启器,因为它现在为空。如果您尝试通过让其父级存储引用并继续检查 try block 内的引用来尝试解决此问题,则在弹出 URI 返回到您的域后,该引用不会变得有效。如果您将站点上传到服务器,这将起作用并且引用将变得有效,从而允许父级检查子级设置的窗口变量(例如 requestingClose)并调用 close() 来关闭子级。

最佳答案

Alex Altotsky 在 this thread 中提供了解决方案:

以下是使在​​ IE/Edge 中的本地主机上运行的站点能够在重定向回来后访问其弹出窗口所需的明确步骤:

  • 转到“Internet 选项”>“安全”
  • 选择“受信任的站点”图标(区域)
  • 将安全级别更改为与互联网区域的安全级别完全相同的设置(默认为中高)。
  • 确保启用保护模式与互联网区域相同(默认选中)。
  • 点击网站
  • 添加http://localhost
  • 取消选中“需要服务器验证”
  • 关闭“站点”对话框
  • 在“Internet 选项”对话框中单击“应用”

关于javascript - window.opener 为 null,父窗口无法访问自己的弹出窗口,或 JavaScript 运行时错误 0x800706b5(facebook、twitter 登录或 paypal 付款),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39303006/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com