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> somenode@example.com/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/>节错误给客户端。 |