6.使用SASL 6.5 客戶端到服務器的例子 6.6服務器到服務器的例子 7.資源綁定
接收實體SASL協商(6)之後,初始實體可能想要或是需要綁定一個特殊資源至那個流。普通的,這僅用於客戶端:爲了遵從在此指定的尋址格式(3)與節傳送規則(10),必須有一個資源標識符聯合客戶端的<node@domain>(即可以由服務器產生也可以由客戶應用提供);這確保基於流使用的地址是“全JID”形式<node@domain/resource>。 根據在SASL協商中接收的一個成功指示,客戶端必須發送一個新流頭給服務器,服務器必須用可利用流特徵列表中的內容來響應。特別的,如果服務器需要客戶端在SASL成功協商後,將資源綁定到流上,它必須包括一個由在流特徵列表中的'urn:ietf:params:xml:ns:xmpp-bind'命名空間限定的空<bind/>元素。成功SASL協商後(不是前),它通過發送響應流的頭表示給客戶端: 服務器廣告資源綁定特徵給客戶端: <stream:stream xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams' id='c2s_345' from='example.com' version='1.0'> <stream:features> <bind xmlns='urn:ietf:params:xml:ns:xmpp-bind'/> </stream:features> 根據這樣的通知,資源綁定是需要的,客戶端必須靠送給服務器一個包含由'urn:ietf:params:xml:ns:xmpp-bind' 命名空間限定的,類型“set”(參考IQ語義(9.2.3))的IQ節,將資源綁定到流上。 如果客戶端希望允許服務器代表自己產生資源標識符,它發送一個類型“set”的IQ節,包含一個空<bind/>元素: 客戶端請求服務器綁定資源: <iq type='set' id='bind_1'> <bind xmlns='urn:ietf:params:xml:ns:xmpp-bind'/> </iq> 支持資源綁定的服務器必須能代表一個客戶端產生一個資源標識符。由服務器產生的資源標識符必須對<node@domain>是唯一的。如果客戶端希望指定資源標識符,它發送一個類型爲“set”的IQ節,包含所需資源的標識符,作爲<bind/>元素子元素<resource/>的XML字符數據。 客戶端綁定一個資源: <iq type='set' id='bind_2'> <bind xmlns='urn:ietf:params:xml:ns:xmpp-bind'> <resource>someresource</resource> </bind> </iq> 一旦服務器爲客戶端產生了一個資源標識符或是接受了由客戶端提供的資源標識符,它必須返回一個類型爲“result”的IQ節給客戶端,必須包含一個<jid>子元素,來爲服務器決定的已連接資源指定全JID: 服務器通知客戶端成功資源綁定: <iq type='result' id='bind_2'> <bind xmlns='urn:ietf:params:xml:ns:xmpp-bind'> <jid>[email protected]/someresource</jid> </bind> </iq> 服務器應當接受由客戶端提供的資源標識符,但可能用一個服務器產生的資源標識符覆蓋它;在這種情況,服務器不應當返回一個節錯誤(例:<forbidden/>)給客戶端,取而代之,應當以以上顯示的IQ結果,傳達產生的資源標識符給客戶端。 當客戶端提供一個資源標識符,以下節錯誤條件是可能的(參考節錯誤(9.3)): 1) 提供的資源標識符不能被與Resourceprep(附錄B)一致的服務器處理。 2) 客戶端不允許綁定資源到流上(例:因爲結點或用戶已經達到了在被允許的連接的資源的數目)。 3) 已提供資源標識符已經使用,但服務器並不允許用同樣的標識符綁定多連接資源。 用於這些錯誤條件的協議顯示如下。 資源標識符不能被處理: <iq type='error' id='bind_2'> <bind xmlns='urn:ietf:params:xml:ns:xmpp-bind'> <resource>someresource</resource> </bind> <error type='modify'> <bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/> </error> </iq> 客戶端不允許綁定資源: <iq type='error' id='bind_2'> <bind xmlns='urn:ietf:params:xml:ns:xmpp-bind'> <resource>someresource</resource> </bind> <error type='cancel'> <not-allowed xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/> </error> </iq> 資源標識符在使用: <bind xmlns='urn:ietf:params:xml:ns:xmpp-bind'> <resource>someresource</resource> </bind> <error type='cancel'> <conflict xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/> </error> </iq> 如果,完成資源綁定步驟之前,客戶端嘗試發送一個XML節,而不只是一個帶有由'urn:ietf:params:xml:ns:xmpp-bind'命名空間限定的<bind/>子元素的IQ節,服務器不準處理此節,並且,應當返回一個<not-authorized/>節錯誤給客戶端。 |