Как обнаружить редирект для получения access_token через Java - PullRequest
0 голосов
/ 07 декабря 2011

Я начинаю использовать Facebook Graph API и собираюсь получить токен доступа с помощью нескольких простых HTTP-запросов через Java.

Подписан https://developers.facebook.com/docs/authentication/ Я создал новое приложение, но у меня нет домена, поэтому Я делаю HTTP-запрос к

www.facebook.com / диалог / OAuth? Client_id = YOUR_APP_ID &
redirect_uri = https://www.facebook.com/connect/login_success.html

для потока на стороне сервера, и я предполагаю получить перенаправление на страницу успеха с кодом в URL. Тогда я бы использовал этот код сделать еще один HTTP-запрос к

graph.facebook.com / OAuth / access_token? client_id = YOUR_APP_ID & redirect_uri = YOUR_URL & client_secret = YOUR_APP_SECRET и код = THE_CODE_FROM_ABOVE

и, наконец, получите мой токен доступа.

Я использовал java.net.HttpURLConnection и org.apache.http.HttpResponse, но в обоих случаях, выполняя первый звонок, я получаю в ответ HTML-код страницы входа в Facebook.

Если я использую этот HTML-код для создания веб-страницы, а затем просто нажимаю кнопку входа в систему (без ввода имени пользователя и пароля), я получаю страницу успеха с кодом!

В HTML поле отправки кнопки Логин пусто, и я не могу получить URL перенаправления ... Я могу просто прочитать альтернативную ссылку в теге <meta>, которая генерирует токен auth_token (что это? сильно отличается от обычного access_token ...).

Итак, я спрашиваю:

  1. можно каким-то образом обнаружить скрытый редирект используя java.net.HttpURLConnection или org.apache.http.HttpRespons е

  2. если да, то как механизм? Это связано с auth_token?

  3. если нет, возможно ли это с другими библиотеками? (Я использовал также restfb, но они, кажется, требуют токен доступа, вставленный "вручную" как arg, и я также видел facebook-java-api, но он кажется старым).


Также, если я вошел в Facebook, выполняя первый HTTP-вызов через Java, я получаю в ответ HTML-код страницы входа в Facebook.

Используя HTML для создания веб-страницы, а затем я просто нажимаю кнопку «Вход» (без ввода имени пользователя и пароля), я получаю страницу success.htm с параметром кода в URL.

Если я использую исходный URL-адрес непосредственно в своем браузере, я могу напрямую получить страницу success.htm без переходов в середине.

Итак, я полагаю, что проблема заключается в управлении куки: в Java (выполняется в Eclipse) я не могу получить доступ к куки моего браузера.

Я попытался перенаправить на использование сервлета, но я получаю сообщение об ошибке домена: ServletURL не является доменом Facebook или «URL-адресом сайта», зарегистрированным для моего приложения (на самом деле я не установил URL-адрес сайта для своего приложения ... и это основная проблема).

В любом случае здесь http://developers.facebook.com/docs/authentication/ в разделе Типы приложений> Настольные приложения говорят:

[...] После того, как пользователь авторизует ваше приложение [я разрешил все], мы перенаправить пользователя обратно на redirect_uri с токеном доступа в фрагмент URI: [...]

Определите это перенаправление, а затем прочитайте токен доступа из URI используя любые механизмы, предоставленные вашей структурой выбора. [...]

Так что я думаю, что все еще возможно обнаружить это перенаправление через Java. Как?

1 Ответ

2 голосов
/ 13 декабря 2011

Если у вас еще нет домена, я рекомендую использовать localhost в качестве домена. Таким образом, вы можете проверить его на локальном веб-сервере / в локальном приложении.

Использование HttpURLConnection работает нормально. Вот как мы это делаем.

Redirect to: 
"https://graph.facebook.com/oauth/authorize?" +
            "client_id=" + clientId + "&" +
            "redirect_uri=" + URLEncoder.encode(returnUrl, "utf-8") 
// After redirect to the return url do the following:

//Make a http request to 
"https://graph.facebook.com/oauth/access_token?client_id=" +
            "client_id=" + clientId + "&" +
            "redirect_uri=" + URLEncoder.encode(returnUrl, "utf-8")  + "&"+
            "client_secret=" + clientSecret + "&"+
            "code=" + request.getParameter("code");

Это вернет токен доступа, который вы можете запросить в Facebook с помощью

...