2012-09-12 16 views
0

我開發一個用Java編寫的WebApplication(JSF 1.2),我需要實現在新的瀏覽器窗口,打開其他第三方的WebApplication(在其他域)的新功能。 我需要使用表單POST請求登錄到此第三方WebApplication。 我的應用程序中的用戶應該只能看到一個按鈕,它應該將他登錄到此第三方Web應用程序。 問題是,我的Web應用程序中的用戶無法知道他登錄到此第三方系統的憑據。POST登錄請求一些第三方web應用

這是我的第一個虛擬解決這個問題:

我加了一些JavaScript和按鈕:

<script type='text/javascript'> 
    function login(username, password) { 
    var action = "https://some.portal.at.other.domain/login.jsp"; 
    var data = ""; 
    data = data + "<form name='loginform' action='" + action + "' method='post'>"; 
    data = data + " <input id='username' name='username' type='hidden' value='" + username + "' />"; 
    data = data + " <input id='password' name='password' type='hidden' value='" + password + "' />"; 
    data = data + "</form>"; 
    data = data + "<sc" + "ript type='text/javascript'>"; 
    data = data + " document.loginform.submit();"; 
    data = data + "</sc" + "ript>"; 
    newWindow=window.open("", "_blank"); 
    newWindow.document.write(data); 
    newWindow.document.close(); 
    } 
</script> 

... 

<a4j:commandButton id="Login" 
        value="Login" 
        onclick="login('#{user.login}', '#{user.password}')"/> 

這個工程就像一個魅力,但...當我在查看HTML源瀏覽器,我可以看到:

<input id="form:Login" name="form:Login" onclick="login('john', 'secret')" value="Login" type="button" /> 

因爲JSF評估#{} user.login和#{} user.password的頁面時呈現,所以安全被打破:)

我的問題是: 是否有可能以任何方式,以確保此功能?

我知道,如果有人有像螢火蟲或Wireshark的工具,那麼他可以很容易地看到這個POST請求,如果他想,所以我覺得這不能保證一般。 我想以某種方式保證這一點,即它需要更多努力才能打破,而不僅僅是查看頁面源。

我認爲我應該這樣做: 在onclick上執行一些ajax請求,它會返回在服務器端生成的這個JavaScript,然後評估這個JavaScript,但我不知道如何做到這一點。

所以,球員,請給我一些建議 感謝

回答

2

,以確保這類進程的唯一方法是在服務器端執行它。也就是說:如果登錄的客戶端的情況發生,你必須假設客戶已經完全進入到這是在登錄時使用的所有憑據。

處理這種類型的情況的標準方法是,在需要客戶端請求的情況下,但必須首先發生祕密登錄,就是讓登錄發生在服務器端,在用戶背後,並返回一個令牌,客戶端可以使用授權,他們肯定是允許提出具體要求。

+0

我同意,你必須做到這一點的服務器上。使用JavaScript只是在應用程序中打開了一個巨大的安全漏洞。您可以使用諸如Apache HTTPClient之類的功能將您的帖子發送到第三方服務器,然後在一個新窗口中呈現整個HTML響應。如果第三方應用程序寫入cookie或保留會話範圍,則可能會在將數據傳輸到客戶端時遇到一些問題,但無論您需要在服務器上執行登錄工作。 –