4

我的应用程序用于oauth允许用户登录 Salesforce,登录后,他们可以访问该应用程序。目前发生的情况是:

  • 用户单击“登录”链接,并被重定向到 Salesforce
  • 用户登录 Salesforce,并被重定向到我指定的 URL
  • 我的服务器处理请求并将它们重定向到主页

我想做的是:

  • 用户单击“登录”链接,会出现一个window.open带有 Salesforce 登录页面的新窗口 ( )
  • 用户登录,并被重定向到我指定的 URL
  • 一旦服务器重定向到主页,主页就会在窗口中触发successorlogged_in事件,原始页面会监听并解释该事件

这是我到目前为止所做的(假设有<button id="login">Log in</button>

$('button#login').on('click', function() {
    var popup = window.open('/auth/salesforce', 'login', '...');
    popup.addEventListener('success', function() {
        popup.close();
        alert('Logged in');
    });
});

在主页中,我添加了用户成功登录时显示的部分:

var event = window.createEvent('loginSuccess');
event.initEvent('success', true, true); 
window.dispatchEvent(event); 

但是,该success事件永远不会被触发。如何success在主页中触发事件,以提醒原始页面用户已成功登录?

编辑:我注意到有window.postMessage方法,如MDN docs中所引用。这是我应该使用的吗?或者我应该使用另一种方法来捕获新创建的成功登录事件window

4

2 回答 2

0

我最近刚刚在我们的应用程序中放置了相同的 OAuth。不要尝试使用新窗口来验证用户,就像所有社交网络一样,只需让用户所在的页面进入验证屏幕,然后将您重定向回来......唯一可以做到的其他方式(和我不确定salesforce是否有这个)是一个javascript身份验证过程。

于 2013-10-13T08:13:02.300 回答
0

通过我的研究,我发现实现这一点的最佳方法,至少如果我不需要支持 IE 浏览器,是查看该window.opener值,如果存在,则运行window.opener. 例如,

if (window.opener) {
    window.opener.userIsLoggedIn();
}
window.close();

userIsLoggedIn()将在打开新弹出窗口的父窗口中定义。

话虽如此,但有几点需要注意:在某些 IE 环境中,window.opener由于某些安全限制,它会失去其价值,因此不会在父窗口上window.opener null触发该方法。在这些情况下,我会在创建的窗口上userIsLoggedIn()监听事件,如果函数没有触发,刷新页面。第二个警告是,只有当且仅当它与同源策略匹配时,您才能调用;请参阅有关该主题的 Wikipedia 文章。如果这会造成问题并且您无法绕过这些限制运行您的应用程序,请参阅此项目以了解可能的解决方法/黑客。closeuserIsLoggedIn()window.opener.userIsLoggedIn()

我不需要支持 IE,因此我没有创建此代码,但如果该window.onclose方法在 IE 中触发,请侦听该window.onclose事件并在发生这种情况后执行您的检查。

于 2013-10-16T03:33:22.640 回答