1.流程:
发起服务器和接收服务器建立一个连接。
发起服务器通过到连接发送一个 'key' 值给接收服务器。
接收服务器建立一个连接到授权服务器。
接收服务器发送一个相同的 'key' 值给授权服务器。
授权服务器回答这个key是否合法。
接收服务器通知发起服务器是否被验证通过。
我们用用以下图形展示这个事件流程:
流程图:
1.
1.发起服务器向接收服务器建立连接
2.发送头
<stream:stream
xmlns:stream='http://etherx.jabber.org/streams'
xmlns='jabber:server'
xmlns:db='jabber:server:dialback'>
注意: 'to'和'from'属性在流的根元素是可选的(OPTIONAL). 其中包含的xmlns:db名字空间向接收服务器声明了发起服务器支持回拨. 如果名字空间不正确,接收实体必须生成一个<invalid-namespace/>流错误条件并且终止XML流和相应的TCP连接.
3.接收服务器返回头
<stream:stream
xmlns:stream='http://etherx.jabber.org/streams'
xmlns='jabber:server'
xmlns:db='jabber:server:dialback'
id='457F9224A0...'>
注意: 'to'和'from'属性在流的根元素是可选的(OPTIONAL). 如果名字空间不正确,发起服务器必须生成一个<invalid-namespace/>流错误条件并且终止XML流和相应的TCP连接.也要注意,在这里接收服务器应该应答但是可以出于安全策略考虑只是悄悄地终止XML流和TCP连接;无论如何,如果接收服务器希望继续,它必须回送一个流头信息给发起服务器.
4.发送服务器向接收服务器发送一个key
<db:result
to='Receiving Server'
from='Originating Server'>
98AF014EDC0...
</db:result>
5.接收服务器向发起服务器所在的域建立TCP连接,连接到的是授权服务器(由于授权服务器可以是发起服务器,所以可以使用重用现有连接)。
<stream:stream
xmlns:stream='http://etherx.jabber.org/streams'
xmlns='jabber:server'
xmlns:db='jabber:server:dialback'>
7.授权服务器返回一个流头
<stream:stream
xmlns:stream='http://etherx.jabber.org/streams'
xmlns='jabber:server'
xmlns:db='jabber:server:dialback'
id='1251A342B...'>
如果一个流错误发生在接收服务器和 授权服务器 之间,接收服务器必须生成一个 <remote-connection-failed/> 流错误条件并且终止它和 发起服务器 之间的XML流和相应的TCP连接.
<db:verify
from='Receiving Server'
to='Originating Server'
id='457F9224A0...'>
98AF014EDC0...
</db:verify>
9.授权服务器验证key是否合法:
<db:verify
from='Originating Server'
to='Receiving Server'
type='valid'
id='457F9224A0...'/>
或
<db:verify
from='Originating Server'
to='Receiving Server'
type='invalid'
id='457F9224A0...'/>
<db:result
from='Receiving Server'
to='Originating Server'
type='valid'/>