facebookactionscript-3flashxmppx-facebook-platform

Facebook chat reports "not-authorized", although "xmpp_login" is granted


I am trying to integrate the facebook chat into our mobile Flash/AIR application, and am using XIFF for the XMPP stuff. Of course, I had to modify some files for the newer Facebook API that uses access_token instead of sig and secret.

For those familiar with the xiff/smack API, here is how I establish the connection:

XFacebookPlatform.setFacebookSessionValues(AppData.FACEBOOK_APP_ID, AppData.getInstance().getFBSession().accessToken);
XMPPConnection.registerSASLMechanism("X-FACEBOOK-PLATFORM", XFacebookPlatform);

var con :XMPPConnection = new XMPPConnection();
con.server = "chat.facebook.com";
con.useAnonymousLogin = true;
con.connect(XMPPConnection.STREAM_TYPE_STANDARD);

.

Basically, I get to the point where I answer the challenge with what IMO should be a correct format:

var responseMap:Dictionary = new Dictionary();
responseMap.api_key = fb_api_key;
        responseMap.call_id = 0;
        responseMap.method = incomingChallengeMap.method;
        responseMap.nonce = incomingChallengeMap.nonce;
        responseMap.access_token = user_access_token;
        responseMap.v = "1.0";

        var challengeResponse:String = "api_key=" + responseMap.api_key;
        challengeResponse += "&call_id=" + responseMap.call_id;
        challengeResponse += "&method=" + responseMap.method;
        challengeResponse += "&nonce=" + responseMap.nonce;
        challengeResponse += "&access_token=" + responseMap.access_token;
        challengeResponse += "&v=" + responseMap.v;
        challengeResponse = Base64.encode( challengeResponse );

.

The response is sent, but as an answer I receive the following:

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

This sounds like I did not grant the "xmpp_login", but I did. I checked that via the Graph API explorer, and for the same access_token it shows:

{
 "data": [
   {
     "installed": 1,
     "xmpp_login": 1,
     "user_online_presence": 1,
     "friends_online_presence": 1
   }
 ]
}

This should be more than enough, I guess.

But still I get the "not-authorized" failure. Any ideas what went wrong here?


Solution

  • Funny enough, the problem was this line:

    var con :XMPPConnection = new XMPPConnection();
    

    Which has to be replaced with this line:

    var con :XMPPTLSConnection = new XMPPTLSConnection();
    

    That's it. The facebook chat only authenticates with a TLS connection.

    .

    While that does make sense, the error message of

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

    is very misleading here, as it implies that something with the rights would be wrong.