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ユーザーが正常にログインしたことを元のページに警告するために、ホームページでイベントを発生させるにはどうすればよいですか?

編集: MDN docswindow.postMessageで参照されているように、メソッドがあることに気付きました。これは私が使うべきものですか?または、別の方法を使用して、新しく作成された で成功したログイン イベントをキャプチャする必要がありますか?window

4

2 に答える 2

0

調査の結果、少なくとも IE ブラウザーをサポートする必要がない場合、これを達成するための最善の方法は、値を確認し、window.opener値が存在する場合は で定義されている関数を実行することであることがわかりましたwindow.opener。例えば、

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

userIsLoggedIn()新しいポップアップを開いた親ウィンドウで定義されます。

そうは言っても、いくつかの注意点があります。特定の IE 環境でwindow.openerは、いくつかのセキュリティ制限のためにその値が失われるため、親ウィンドウでメソッドが作成されwindow.opener null、決して起動されません。このような場合、作成されたウィンドウでイベントuserIsLoggedIn()をリッスンし、関数が起動していない場合はページを更新します。2 つ目の注意点は、Same Origin ポリシーに一致する場合にのみ呼び出すことができるということです。この件に関するウィキペディアの記事を参照してください。これにより問題が発生し、これらの制限を回避してアプリケーションを動作させることができない場合は、このプロジェクトで考えられる回避策/ハックを参照してください。closeuserIsLoggedIn()window.opener.userIsLoggedIn()

IE をサポートする必要がないので、このコードは作成していませんが、window.oncloseメソッドが IE で起動する場合は、window.oncloseイベントをリッスンし、発生後にチェックを実行してください。

于 2013-10-16T03:33:22.640 に答える
0

最近、同じ OAuth をアプリケーションに入れました。すべてのソーシャル ネットワークのように、新しいウィンドウを使用してユーザーを認証しようとしないでください。ユーザーがいるページを認証画面に移動させてからリダイレクトします...これを行うことができる他の唯一の方法 (および私はまだセールスフォースがこれを持っているかどうかわかりません) は JavaScript の認証プロセスです。

于 2013-10-13T08:13:02.300 に答える