21

我有一个现有的远程站点,它可以访问身份验证,现在我想使用 iframe 将此站点合并到我自己的站点中。是否有任何解决方案可以帮助在加载 iframe 时自动登录远程站点?

<iframe src="http://remote.com/list"></iframe>

如果想访问http://remote.com/list,登录需要并且只发布用户名/密码有效。加载 iframe 时如何自动登录?

这里有一些限制

  • login 仅适用于 post 方法
  • iframe / javascript 有跨域问题
  • 没有提供登录 API
  • 在远程站点中无法进行其他修改
4

4 回答 4

26

一切皆有可能。但是,由于泄露了对远程页面的访问详细信息,以下解决方案非常不安全。

<form id="login" target="frame" method="post" action="http://remote.com/login">
    <input type="hidden" name="username" value="login" />
    <input type="hidden" name="password" value="pass" />
</form>

<iframe id="frame" name="frame"></iframe>

<script type="text/javascript">
    // submit the form into iframe for login into remote site
    document.getElementById('login').submit();

    // once you're logged in, change the source url (if needed)
    var iframe = document.getElementById('frame');
    iframe.onload = function() {
        if (iframe.src != "http://remote.com/list") {
            iframe.src = "http://remote.com/list";
        }
    }
</script>

username和输入的值password在客户端是可读的。

于 2013-05-30T10:31:26.650 回答
11

如果您拥有其他站点,则可以尝试通过某些令牌进行身份验证。

将授权令牌传递给 iframe 中的 url。

于 2012-08-09T09:53:59.220 回答
10

这是我这样做的实现。但这并不能解决跨域问题。对于跨域问题,你可以尝试使用jQuery的JSONP方法(我还没有尝试将jQuery与这个解决方案结合使用)。

<iframe id="MyIFrame" width="400" height="400"></iframe>
<script type="text/javascript">
    var iframeURL = 'http://mysite.com/path/applicationPage.aspx';
    var iframeID = 'MyIFrame';

    function loadIframe(){
        //pre-authenticate
        var req = new XMLHttpRequest();
        req.open("POST",this.iframeURL, false, "username", "password"); //use POST to safely send combination
        req.send(null); //here you can pass extra parameters through

        //setiFrame's SRC attribute
        var iFrameWin = document.getElementById(this.iframeID);
        iFrameWin.src = this.iframeURL + "?extraParameters=true";
    }

    //onload, call loadIframe() function
    loadIframe();   
</script>
于 2013-06-20T10:18:35.127 回答
5

做不到。就那么简单。跨域限制非常明确地阻止您执行此类操作。

于 2012-08-09T09:46:37.043 回答