NodeJS实现FCM XMPP服务器应用,SASL PLAIN认证无success响应
我之前做Firebase Cloud Messaging的XMPP连接时,也踩过SASL PLAIN认证的坑,给你几个具体的排查方向:
先确认SASL PLAIN的编码格式是否正确
PLAIN机制要求的认证字符串格式是\0{senderID}\0{serverKey},然后做Base64编码。很多人容易在空字符或者顺序上出错,比如把senderID和serverKey搞反,或者漏了开头的空字符。NodeJS里正确的编码代码应该是这样的:const senderID = "你的Cloud Messaging senderID"; const serverKey = "你的服务器密钥"; const authStr = Buffer.from(`\0${senderID}\0${serverKey}`).toString('base64');然后把这个
authStr放到<auth>stanza里发送,确保XML结构正确,命名空间是urn:ietf:params:xml:ns:xmpp-sasl。核对密钥和senderID的正确性
确认你用的senderID是Cloud Messaging标签下的发件人ID(不是项目ID),服务器密钥是该标签下的服务器密钥——别选错成Web API密钥、安卓/iOS密钥或者继承密钥里的其他类型。服务器密钥通常是AAAA开头的长字符串,这个是专门给XMPP/HTTP服务器调用用的。检查服务器返回的具体错误
别只看有没有收到success,如果认证失败,服务器会返回<failure>stanza,里面有具体的错误码(比如not-authorized、invalid-authzid、mechanism-too-weak等)。你可以开启XMPP库的调试模式,或者用抓包工具看原始XML响应,根据错误码定位问题:比如如果是
not-authorized,大概率是密钥或senderID不对;如果是mechanism-not-supported,那就是服务器没启用PLAIN机制。确认服务器端的配置权限
如果是连接Firebase的XMPP服务器,要确保你的项目已经启用了Cloud Messaging API,并且没有IP白名单限制(如果设置了的话,要把你的服务器IP加进去)。另外,有些XMPP服务器可能要求TLS连接,确认你的客户端是用xmpps://或者先做STARTTLS握手。排查依赖库的问题
如果你用的是第三方XMPP库(比如xmpp.js),检查库的版本是否最新,有没有已知的SASL认证bug。比如有些旧版本可能对PLAIN机制的空字符处理有问题,或者需要手动指定启用PLAIN机制。
内容的提问来源于stack exchange,提问作者ungato

