2013-03-01 28 views
0

我們正在開發一個由嵌入式應用程序(在我的網站中註冊爲IFRAME)使用的Javascript SDK,以幫助他們使用一些資源,如加載一些對話框:例如授權對話框或分享框(如Facebook)。使用與窗口頂部相同的協議加載嵌入式iframe以防止出現相同的源策略

我們的SDK是使用easyXDM工作或多或少是這樣的:

HTML頁面
----------------------- -------------------------------------------------- -------------------------------------------------- -
| http/https:www.mysite.com/embedded-app/
| (一些JS類)
|
| - - - - - | -------------------------------------------------- -------------------------------------------------- --------------
| - - - - - | (IFRAME)
| - - - - - | https:// www.some-embedded-app-domain.com /page.html
| - - - - - | (使用easyXDM從「http/https:www.mysite.com/sdk.js」加載和實例化SDK)
| - - - - - |
| - - - - | - - - - - - | -------------------------------------------------- ------------------------------------------------
| - - - - - | - - - - - |(由easyXDM注入的IFRAME)
| - - - - - | - - - - - | http/https:www.mysite.com /embedded_provider.html
| - - - - - | - - - - - |(與window.top通信以使用那些wndow.top JS類進行通信)
| - - - - - | - - - - - |
| - - - - - | - - - - - |
| - - - - - | - - - - - |
| - - - - - | - - - - - |

我的網站可以使用http/https加載,但嵌入式應用程序必須使用始終使用 HTTPS。爲了允許easyXDM注入的內部iframe與我的站點通信,主機和協議必須在兩個URL中匹配,否則會出現相同的源策略違規。

問題:我將如何告知來自外部應用程序URL的外部窗口(我的站點)使用http或https的SDK中的代碼,使用相同的協議呈現embedded_provider.html,以及從而允許它們之間的JS通信?

我能想到的唯一解決方案是以某種方式通知嵌入式應用程序,我們當前正在瀏覽http/https,然後它可以正確實例化它(使用標誌use_https左右),但我更喜歡不要強制應用程序知道我們正在使用的協議。

你知道其他的選擇嗎?

謝謝!

+0

使用//而不是http://或https:// – mplungjan 2013-03-01 18:47:03

回答

0

使用//而非http://或https://

瀏覽器將整理出來

+0

不幸的是,這不起作用,因爲第一個IFRAME始終在HTTPS上加載(因此「//」將始終解析爲https),但最外面的窗口可能在HTTP上。 – juanjocv 2013-03-12 11:11:36

1

我能想到的唯一的解決方案(沒有測試這個雖然),是有easyXDM提供了兩個測試iframes - 一個在http://www.mysite.com/url_test和一個在https://www.mysite.com/url_test

然後讓你的/ url_test網頁嘗試訪問window.top.location.href。如果/ url_test可以看到該位置,則它必須位於同一個域中。然後,successfull/url_test頁面將通過easyXDM與父級iframe(在some-embedded-app.com上)通信,以在正確的主機上創建您真正需要的iframe。

注意:位於不正確主機上的/ url_test頁面將開始在控制檯中轉儲同源iframe警告。 :)

注意#2:如果這種方法有效,可以通過說:「因爲產品領域,我知道這些嵌入的80%將在http上,我會做一個/ url_test首先在http上,然後嘗試https作爲備份。「