首页 > 代码库 > 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或者其他客户端程序登录的时候,使用这样的域名登录服务器是没有问题的,但在代码中处理就要特别小心,一定要在服务器的后段,确认域名统一:
否则,就会出现本文提示到的这个常见错误!!!!!!
// 注: 笔者在第一次遇到这个问题时,整整纠结了一晚上.....??.