Spring Security Chain и Facebook с использованием Spring Social

Мне нужно войти в Facebook для большого веб-проекта, и я застрял. Мы используем Eclipse IDE с Java 1.6 и Spring. Далее используем Spring-Security для проверки. Я нашел Spring Social и вместе с ним Spring Social Facebook. Текущий выход для входа в систему: пользователь может ввести свои учетные данные и войти в систему с помощью кнопки входа или нажать кнопку facebook. После этого он будет перенаправлен на facebookAuthenticationFilter, который проверяет, нажимал ли он кнопку facebook или нет. Если он это сделал, facebookAuthenticationFilter сгенерирует перенаправление на вход в Facebook. Это выглядит так:

FacebookConnectionFactory connectionFactory = new FacebookConnectionFactory(APP_ID, APP_SECRET);
OAuth2Operations oauthOperations = connectionFactory.getOAuthOperations();
OAuth2Parameters params = new OAuth2Parameters();
params.setRedirectUri(REDIRECT_URI);
params.setScope("user_about_me,user_birthday,user_likes,user_status");
String authorizeUrl = oauthOperations.buildAuthorizeUrl(GrantType.AUTHORIZATION_CODE, params);
response.sendRedirect(authorizeUrl);

После этого ищем Параметр "код" и получив его в Фильтре делаем

String authURL = "https://graph.facebook.com/oauth/access_token?client_id="
                    + APP_ID
                    + "&redirect_uri="
                    + REDIRECT_URI
                    + "&client_secret="
                    + APP_SECRET + "&code=" + code;
// Facebook.getAuthURL(code);
URL url = new URL(authURL);
String result = readURL(url);
String authorizationCode = null;
Integer expires = null;
String[] pairs = result.split("&");
for (String pair : pairs) {
    String[] kv = pair.split("=");
    if (kv.length != 2) {
        logger.error("Unexpected auth response");
    } else {
        if (kv[0].equals("access_token")) {
            authorizationCode = kv[1];
        }
        if (kv[0].equals("expires")) {
            expires = Integer.valueOf(kv[1]);
        }
    } // if-else kv.length!=2
} // for

// upon receiving the callback from the provider:
AccessGrant accessGrant = null;
try {
    FacebookConnectionFactory connectionFactory = new FacebookConnectionFactory(APP_ID, APP_SECRET);
        OAuth2Operations oauthOperations = connectionFactory.getOAuthOperations();
    // nächstes produziert einen Fehler: 400 - BAD REQUEST
    accessGrant = oauthOperations.exchangeForAccess(authorizationCode,REDIRECT_URI, null);

    Connection<Facebook> connection = connectionFactory.createConnection(accessGrant);
    Facebook facebook = connection.getApi();

В отмеченной строке получаем Bad Request от сервера. Не знаю почему. И особенно часть с разбором параметра «код» кажется неприглядной и выглядит не очень хорошо. Разве нет лучшего способа сделать это?

Заранее благодарны за Вашу помощь.


person DonMarco    schedule 12.12.2011    source источник
comment
Позаботьтесь о коде авторизации, он может включать в себя clientId!   -  person Grim    schedule 02.11.2012


Ответы (1)


Вместо вызова authUrl вы должны использовать код, который передается в URL-адрес обратного вызова, чтобы получить accessGrant, например:

accessGrant = connectionFactory.getOAuthOperations().exchangeForAccess(code, REDIRECT_URI, null)

С помощью этого accessGrant вы сможете установить соединение, как вы уже это сделали.

person Pieter Kuijpers    schedule 14.12.2011