2015-04-14 4 views
0

Я пытаюсь создать поток аутентификации в нашем приложении для facebook в java. Я использую библиотеку facebook4j.Facebook OAuth redirect_uri Issue

Мой соответствующий код выглядит следующим образом -

public String authenticate() throws IOException { 
    Facebook facebook = new FacebookFactory().getInstance(); 
    String redirectURL = facebook.getOAuthAuthorizationURL("http://localhost:9099/default/facebook/verify.html"); 
    servletResponse.sendRedirect(redirectURL); 
    return null; 
} 

public String verify() throws Exception { 
    String code = servletRequest.getParameter("code"); 
    Facebook facebook = new FacebookFactory().getInstance(); 
    AccessToken accessToken = facebook.getOAuthAccessToken(code); 
    String token = accessToken.getToken(); 
    servletResponse.getWriter().write(token); 
    return null; 
} 

Я получаю ошибку после перенаправления на этой линии -

AccessToken accessToken = facebook.getOAuthAccessToken(code); 

Ошибка заключается в следующем -

FacebookException{statusCode=400, errorType='OAuthException', errorMessage='redirect_uri isn't an absolute URI. Check RFC 3986.', errorCode=191, errorSubcode=-1, version=2.2.2} 
    at facebook4j.internal.http.HttpClientImpl.request(HttpClientImpl.java:179) 
    at facebook4j.internal.http.HttpClientWrapper.request(HttpClientWrapper.java:65) 
    at facebook4j.internal.http.HttpClientWrapper.get(HttpClientWrapper.java:97) 
    at facebook4j.auth.OAuthAuthorization.getOAuthAccessToken(OAuthAuthorization.java:107) 

redirectURL что Я получаю от facebook при первом звонке -

https://www.facebook.com/dialog/oauth?client_id=4161XXXXXX6389&redirect_uri=http%3A%2F%2Flocalhost%3A9099%2Fdefault%2Ffacebook%2Fverify.html&scope=email,public_profile,user_friends

пытался без использования кодировки тоже -

https://www.facebook.com/dialog/oauth?client_id=4161XXXXXX6389&redirect_uri=http://localhost:9099/default/facebook/verify.html&scope=email,public_profile,user_friends

Это правильно перенаправлении 'проверить' имеет URL-адрес что-то вроде -

http://localhost:9099/default/facebook/verify.html?code=AQCE4aaIpE_c94J3NVNjge_YL_OP84vPIgUauvfRRXNCj_FOK8U2kfSxfKGrjWnFL1dqMeM8q22M6UaVbGsTpTQOQmjxYILdFHKFiSFd0Ycf_ByBE9rNX_yxvFnJ3RNLf7bjCT4C1uXuuqCXHZjVNN1lBb3LWUHz7eNkq0r8K14x7ZEVIWjbll-Vqys1FZuCIVDBrI4StoYkZR1rpCsoSqq7VdCIX3zawnw_nbPZBZU7iUeZJiBbahYjWkHIn47b9AQb3hZxxpe4xxXHXfDsP_h2fhC1YYioJbwGq4QbnWpUrP7aF-0Q_wF71zn4txCQLd4#=

facebook4j.properties

oauth.appId=416XXXXXXXXX389 
oauth.appSecret=9ed3XXXXXXb6acXXXXXXXXc7acXXXX5 
oauth.permissions=email,public_profile,user_friends 

My Facebook Основные параметры App являются -

enter image description here

важные продвинутые настройки -

enter image description here

Я полностью понимаю, что аналогичный вопрос был опубликован несколько раз. Я прошел почти каждый вопрос & Я попробовал почти все предлагаемое решение этой проблемы. Но по какой-то причине он не работает. Я решил опубликовать свою проблему здесь, проведя 3 дня по той же проблеме.

Я был бы очень признателен, если бы кто-то указал, где именно я ошибаюсь.

+1

Параметр 'redirect_uri' должен быть указан при обмене« кодом »на токен (и должен быть таким же, как указано ранее в диалоговом окне входа в систему). Я предполагаю, что, поскольку вы используете «новый FacebookFactory(). GetInstance()» во втором методе, это не так. Взгляните на основную реализацию здесь: https://github.com/roundrop/facebook4j-oauth-example/tree/master/src/main/java/facebook4j/examples/signin - в 'SignInServlet',' Facebook' экземпляр объекта сохраняется в сеансе, а затем в 'CallbackServlet' тот же экземпляр извлекается и используется снова. – CBroe

+0

Да, это точно. Я использовал 2 экземпляра facebook4j.Facebook и второй раз я не устанавливал redirect_uri. Я думаю, что это было бы полезно для других, если вы добавите свой комментарий в качестве ответа. Благодарю. – ameykpatil

ответ

1

Параметр redirect_uri должен указываться при обмене кода для токена (и должен быть таким же, как указано ранее в диалоговом окне входа в систему).

Я бы предположил, что, поскольку вы используете new FacebookFactory().getInstance() во втором методе, это не так. Посмотрите на базовой реализации здесь, https://github.com/roundrop/facebook4j-oauth-example/tree/master/src/main/java/facebook4j/examples/signin

В SignInServlet, экземпляр объекта Facebook хранится в сессии, а затем в CallbackServlet тот же экземпляр извлекается и используется снова. Поэтому он по-прежнему содержит значение redirect_uri, которое изначально использовалось при вызове диалогового окна Auth, и будет повторно использовать это же значение при обмене code на токен.

Смежные вопросы