Аутентификация в чате Facebook с использованием аутентификации X-FACEBOOK-PLATFORM SASL - PullRequest
2 голосов
/ 20 мая 2011

Я имею дело с аутентификацией чата Facebook с использованием механизма аутентификации X-FACEBOOK-PLATFORM SASL.

Я формирую пользователя и пароль, как описано на форуме разработчиков Facebook и в вопросе stackoverflow.

Дело в том, что если я использую application_secret в качестве пароля, я могу войти в систему, но в соответствии с вопросом stackoverflow (ссылка ниже) это должен быть сеанс, сгенерированный из старого метода оставшегося API aph.promoteSession

Я хочу использовать старый метод rest api, чтобы избежать распространения application_secret в наших jar-файлах для настольных приложений.

Итак, вопрос в том, как вам удалось войти с помощью auth.promoteSession ????

Я прочитал следующие посты, которые очень помогли:

http://community.igniterealtime.org/message/205739#205739
XMPP с библиотекой Java Asmack, поддерживающей X-FACEBOOK-PLATFORM

И я использую класс SASLXFacebookPlatformMechanism.java, который поступает из сообщения в режиме реального времени и регистрируется как ошибка.

У меня есть разрешения xmpp_login и offline_access. И я отключил методы удаления устаревшей аутентификации, чтобы я мог вызвать старые методы API остальных, в этом случае: auth.promoteSession Я использую аутентификацию потока на стороне клиента и в Facebook.

Итак, используя application_secret в качестве пароля, я получаю:

<stream:features><mechanisms xmlns="urn:ietf:params:xml:ns:xmpp-sasl"><mechanism>X-FACEBOOK-PLATFORM</mechanism><mechanism>DIGEST-MD5</mechanism></mechanisms></stream:features>
<challenge xmlns="urn:ietf:params:xml:ns:xmpp-sasl">dmVyc2lvbj0xJm1ldGhvZD1hdXRoLnhtcHBfbG9naW4mbm9uY2U9NEIxRUQzNTA5MTQ5MDQxRTE4N0QyNTA0NTUzNjBDQjc=</challenge>
<success xmlns="urn:ietf:params:xml:ns:xmpp-sasl"/>

Но если я использую значение, возвращаемое auth.promoteSession, я получаю:

<stream:features><mechanisms xmlns="urn:ietf:params:xml:ns:xmpp-sasl"><mechanism>X-FACEBOOK-PLATFORM</mechanism><mechanism>DIGEST-MD5</mechanism></mechanisms></stream:features>
<challenge xmlns="urn:ietf:params:xml:ns:xmpp-sasl">dmVyc2lvbj0xJm1ldGhvZD1hdXRoLnhtcHBfbG9naW4mbm9uY2U9MzhFQkUxOTUxNENGRUU4ODc2NzRDREQ0RjhBMUQ0QjI=</challenge>
<failure xmlns="urn:ietf:params:xml:ns:xmpp-sasl"><not-authorized/></failure>

Ответы [ 2 ]

6 голосов
/ 13 сентября 2011

Я изменил версию для Android, и теперь она работает для меня

public class SASLXFacebookPlatformMechanism extends SASLMechanism {

    private static final String NAME              = "X-FACEBOOK-PLATFORM";

    private String              apiKey            = "";
    private String              accessToken        = "";

    /**
     * Constructor.
     */
    public SASLXFacebookPlatformMechanism(SASLAuthentication saslAuthentication) {
        super(saslAuthentication);
    }

    @Override
    protected void authenticate() throws IOException, XMPPException {
        getSASLAuthentication().send(new AuthMechanism(NAME, ""));
    }

    @Override
    public void authenticate(String apiKey, String host, String accessToken) throws IOException, XMPPException {
        if (apiKey == null || accessToken == null) {
            throw new IllegalArgumentException("Invalid parameters");
        }

        this.apiKey = apiKey;
        this.accessToken = accessToken;
        this.hostname = host;

        String[] mechanisms = { "DIGEST-MD5" };
        Map<String, String> props = new HashMap<String, String>();
        this.sc = Sasl.createSaslClient(mechanisms, null, "xmpp", host, props, this);
        authenticate();
    }

    @Override
    public void authenticate(String username, String host, CallbackHandler cbh) throws IOException, XMPPException {
        String[] mechanisms = { "DIGEST-MD5" };
        Map<String, String> props = new HashMap<String, String>();
        this.sc = Sasl.createSaslClient(mechanisms, null, "xmpp", host, props, cbh);
        authenticate();
    }

    @Override
    protected String getName() {
        return NAME;
    }

    @Override
    public void challengeReceived(String challenge) throws IOException {
        byte[] response = null;

        if (challenge != null) {
            String decodedChallenge = new String(Base64.decode(challenge));
            Map<String, String> parameters = getQueryMap(decodedChallenge);

            String version = "1.0";
            String nonce = parameters.get("nonce");
            String method = parameters.get("method");

            String composedResponse =
                "method=" + URLEncoder.encode(method, "utf-8") +
                        "&nonce=" + URLEncoder.encode(nonce, "utf-8") +
                        "&access_token=" + URLEncoder.encode(accessToken, "utf-8") +
                        "&api_key=" + URLEncoder.encode(apiKey, "utf-8") +
                        "&call_id=0" +
                        "&v=" + URLEncoder.encode(version, "utf-8");
            response = composedResponse.getBytes();
        }

        String authenticationText = "";

        if (response != null) {
            authenticationText = Base64.encodeBytes(response);
        }

        // Send the authentication to the server
        getSASLAuthentication().send(new Response(authenticationText));
    }

    private Map<String, String> getQueryMap(String query) {
        Map<String, String> map = new HashMap<String, String>();
        String[] params = query.split("\\&");

        for (String param : params) {
            String[] fields = param.split("=", 2);
            map.put(fields[0], (fields.length > 1 ? fields[1] : null));
        }

        return map;
    }
}

Эта версия требует только идентификатор приложения и токен доступа

ConnectionConfiguration config = new ConnectionConfiguration("chat.facebook.com", 5222);
config.setSASLAuthenticationEnabled(true);
mFbConnection = new XMPPConnection(config);

try {
    SASLAuthentication.registerSASLMechanism("X-FACEBOOK-PLATFORM", SASLXFacebookPlatformMechanism.class);
    SASLAuthentication.supportSASLMechanism("X-FACEBOOK-PLATFORM", 0);
    mFbConnection.connect();
    mFbConnection.login(apiKey, accessToken, "Application");
} catch (XMPPException e) {
    mFbConnection.disconnect();
    e.printStackTrace();
}

Надеюсь, это поможет.

0 голосов
/ 17 августа 2011

Да, мне кажется, вам нужно и то, и другое. Код из XMPP с библиотекой Java Asmack, поддерживающей X-FACEBOOK-PLATFORM , необходимо настроить, чтобы включить секрет приложения, а также секрет сеанса (в качестве пароля).

this.apiKey = keyArray[0];
    Log.d("API_KEY", apiKey);
    this.applicationSecret = "################################";
    Log.d("SECRET_KEY", applicationSecret);
    this.sessionKey = keyArray[1];
    Log.d("SESSION_KEY", sessionKey);

    this.authenticationId = sessionKey;
    this.password = applicationSecret;
    this.hostname = host;

замена ######################## для вашего appSecret (находится в вашей области разработки)

Это не ясно из документации или поста ИМО. Секрет сеанса был получен через FB.getSession (), но работают и другие опции.

...