JEP-0078: Non-SASL Authentication
SASL
:
Simple Authentication and Security Layer
简单的认证及加密层
1
、客户端向服务器端发送
XML
流
|
<stream:stream to='shakespeare.lit'
xmlns='jabber:client'
xmlns:stream='http://etherx.jabber.org/streams'>
|
2
、服务器返回消息
|
<iq type='get' to='shakespeare.lit' id='auth1'>
<query xmlns='jabber:iq:auth'/>
</iq>
|
注意中间的
ID
,这个
ID
是服务器端返回给客户端的验证信息,验证信息一般是以该
ID
号
+
用户密码通过
SHA1
(RFC3174)
算法进行操作的。也就是说客户端得到该
ID
和密码经过
SHA1
算法加密后返回给服务器。
|
3
、客户端想服务器提交请求获取登录需要验证的字段
|
<iq type='get' to='shakespeare.lit' id='auth1'>
<query xmlns='jabber:iq:auth'/>
</iq>
|
4
、服务器返回登录需要验证的字段
|
<iq type='result' id='auth1'>
<query xmlns='jabber:iq:auth'>
<username/>
<password/>
<digest/>
这个
digest
就是上面经过
SHA1
算法得出的结果字段
<resource/>
</query>
</iq>
|
如果客户端发送的字段包括了用户名和
IQ-GET
的字段,服务器不应该返回错误消息(因为需要服务器判断当前用户名是否在使用),如果服务器不支持可插入的简单认证及密码模块,那么必须返回一个
<service-unavailable/>
的错误
;
如果客户端企图使用
SASL
认证但是失败,服务器必须返回
<policy-violation/>
错误信息
在认证过程中,
jabber:iq:auth
命名、用户名和资源是必须要求客户端提供的
,
而服务器返回的
XML
流中也必须提供
<username/>
和
<resource/>
这
2
个元素。
|
5
、客户端提交字段内容进行验证
|
文本格式,非加密模式
<iq type='set' id='auth2'>
<query xmlns='jabber:iq:auth'>
<username>bill</username>
<password>Calli0pe</password>
<resource>globe</resource>
</query>
</iq>
加密模式
<iq type='set' id='auth2'>
<query xmlns='jabber:iq:auth'>
<username>bill</username>
<digest>48fc78be9ec8f86d8ce1c39c320c97c21d62334d</digest>
<resource>globe</resource>
</query>
</iq>
|
6
、登录结果
|
成功
<iq type='result' id='auth2'/>
失败
–
认证失败,可能是用户名密码不匹配或数字验证错误
<iq type='error' id='auth2'>
<error code='401' type='auth'>
<not-authorized xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/>
</error>
</iq>
失败
–
资源冲突
/
错误
<iq type='error' id='auth2'>
<error code='409' type='cancel'>
<conflict xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/>
</error>
</iq>
失败
–
没有提供需要验证的字段
<iq type='error' id='auth2'>
<error code='406' type='modify'>
<not-acceptable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/>
</error>
</iq>
|
其他的就没什么重要的了,
JEP-0078
就到此了吧,剩余的重要工作就是如何配置
SASL