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