2011-07-08 208 views

回答

2

EventSource是關於服務器向客戶端發送事件的。我認爲你需要雙向通信進行身份驗證。你會如何發送實際的憑證?

但是,WebSockets可以實現這一點。那是你在找什麼?

更新:

你可以達到你想要的利用餅乾,由4esn0k指出。 Cookie與瀏覽器建立連接的初始請求一起發送。所以,只要確保在啓動任何EventSource連接之前設置cookie的會話標識符。

+3

的EventSource必須初始化連接,並需要保持其開放的照顧,無論是從來沒有關閉它,如果它沒有關閉或者如果服務器正在關閉服務器,則試圖無限期地重新建立它。無論採用哪種方式,EventSource都必須完成連接的第一步。 EventSource非常適合我的目的,但我希望它在發出請求時發送身份驗證信息。 –

+1

根據規範(http://dev.w3.org/html5/eventsource/),恐怕沒有辦法發送這些憑證。 – Tower

+0

@塔我不同意。一個EventSource只是一個保持活動的HTTP請求,並且具有「文本/事件流」的內容類型。您可以將cookie作爲任何其他http請求(假設您已經通過身份驗證),也可以通過查詢字符串傳遞憑據 – saml

2

如果你談的cookies(不HTTP認證):

EventSource的使用HTTP,因此Cookie與EventSource的連接請求sended。雖然從規格CORS + HTTP認證不支持

1

我正在尋找一個解決同樣的問題

HTTP認證應該支持任何其他的HTTP URL。這篇文章here這樣說:

另一個需要注意的是,據我們所知,你不能改變HTTP 頭使用EventSource的時候,這意味着你必須提交 授權查詢字符串PARAM與價值,你將使用HTTP基本身份驗證插入 :您的 登錄和令牌的base64編碼級聯。

下面是從崗位代碼:

// First, we create the event source object, using the right URL. 
 
var url = "https://stream.superfeedr.com/?"; 
 
url += "&hub.mode=retrieve"; 
 
url += "&hub.topic=http%3A%2F%2Fpush-pub.appspot.com%2Ffeed"; 
 
url += "&authorization=anVsaWVuOjJkNTVjNDhjMDY5MmIzZWFkMjA4NDFiMGViZDVlYzM5"; 
 

 
var source = new EventSource(url); 
 

 
// When the socket has been open, let's cleanup the UI. 
 
source.onopen = function() { 
 
    var node = document.getElementById('sse-feed'); 
 
    while (node.hasChildNodes()) { 
 
    node.removeChild(node.lastChild); 
 
    } 
 
}; 
 

 
// Superfeedr will trigger 'notification' events, which corresponds 
 
// exactly to the data sent to your subscription endpoint 
 
// (webhook or XMPP JID), with a JSON payload by default. 
 
source.addEventListener("notification", function(e) { 
 
    var notification = JSON.parse(e.data); 
 
    notification.items.sort(function(x, y) { 
 
    return x.published - y.published; 
 
    }); 
 
    notification.items.forEach(function(i) { 
 
    var node = document.getElementById('sse-feed'); 
 
    var item = document.createElement("li"); 
 
    var t = document.createTextNode([new Date(i.published * 1000), i.title, i.content].join(' ')); 
 
    item.appendChild(t); 
 
    node.insertBefore(item, node.firstChild); 
 
    // We add the element to the UI. 
 
    }); 
 
});