首页 > 代码库 > XMPP 常见错误一:(<failure xmlns="urn:ietf:params:xml:ns:xmpp-sasl"><not-authorized/></failure>)

XMPP 常见错误一:(<failure xmlns="urn:ietf:params:xml:ns:xmpp-sasl"><not-authorized/></failure>)

在XMPP开发中,使用XMPPStream进行连接服务器后,验证过程中,比较常见的一个错误是

<failure xmlns="urn:ietf:params:xml:ns:xmpp-sasl"><not-authorized/></failure>.

尤其作为初学者(笔者就是这样的),经常会因为这个问题弄得不着边际的凌乱.现在笔者将自己的遇到的问题定期整理,总结错误,希望对日后的使用有所参考,同时希望能够对也是在这方面的初学者有所提醒.

服务器的测试版本为openfire 3.9.3  ; 数据库使用的是MYSQL; Mac环境为Xcode5.1.1;

 

开放中,一般在设置了XMPPStream的JID以及hostname之后,就可以进行连接服务器:

NSString *name = [[NSUserDefaults standardUserDefaults] objectForKey:@"name"];      NSString *host = [[NSUserDefaults standardUserDefaults] objectForKey:@"host"];    XMPPJID *myJID = [XMPPJID jidWithUser:name domain:host resource:nil];    _xmppStream.myJID = myJID;    _xmppStream.hostPort = 5222;    _xmppStream.hostName = host;    NSError *error;    if ([_xmppStream isConnected]) {        [_xmppStream disconnect];    }    [_xmppStream connectWithTimeout:XMPPStreamTimeoutNone error:&error];    

正常情况下,连接服务器成功(此时并不需要密码严重)后,XMPPStream会通知代理,那么我们就可以在代理的相应方法中,进行连接后的操作:

1 - (void)xmppStreamDidConnect:(XMPPStream *)sender2 {3     NSLog(@"连接成功");4     NSString *passwd = [[NSUserDefaults standardUserDefaults] objectForKey:@"passwd"];5     NSError *error;6     [_xmppStream authenticateWithPassword:passwd error:&error];7     8     9 }

一般在这里进行用户的密码验证,虽然authenticateWithPassword:erroe:方法在官方的解释里面说会在后续的版本中渐渐丢弃,但这无疑是我们用来测试验证的非常方便的一个接口.

这时候,我们经常会在密码正确的时候,遇到

<failure xmlns="urn:ietf:params:xml:ns:xmpp-sasl"><not-authorized/></failure>这个错误.

作为初学着遇到这个问题,常常觉得莫名其妙,明明密码是正确的,但系统就是提示认证失败,而且如果使用Spark这样的客户端,却完全可以正常登录服务器;最难过的是,在XMPPStream的这个错误中,没有所谓的code码,这就更难定位到底是哪里出了问题(不像用户名和密码的错误提示code8,以及服务器相关的code61那么友善).

这个错误会通过XMPPStream代理返回来:

 

1 - (void)xmppStream:(XMPPStream *)sender didNotAuthenticate:(DDXMLElement *)error2 {3     NSLog(@"%@",error);4 }
// <failure xmlns="urn:ietf:params:xml:ns:xmpp-sasl"><not-authorized/></failure>

其实,XMPP认证的问题,一般都是与JID有关的,因此解决这类问题,首选的入口就是分析一下XMPPStream的JID,客户端在与服务器连接后,Socket就绑定了这个端口,用来处理与服务器的往返数据,认证就是其中之一.而且,往往我们在与服务器来连接的时候,为了简便,经常使用localhost或者127.0.0.1来当做域名的部分,这时候要尤其注意,因为使用Spark或者其他客户端程序登录的时候,使用这样的域名登录服务器是没有问题的,但在代码中处理就要特别小心,一定要在服务器的后段,确认域名统一:

 

否则,就会出现本文提示到的这个常见错误!!!!!!

// 注: 笔者在第一次遇到这个问题时,整整纠结了一晚上.....??.