2014-12-20 6 views
2

Я реализую страницу с формой на Symfony с особым обращением. Когда пользователь нажимает кнопку, вызов в AJAX отправляется на мой сервер. Когда пользователь не аутентифицирован, мы помещаем информацию в ответ, и клиент отображает всплывающее окно входа в Facebook Connect Link. Все это в порядке. Теперь, если пользователь нажимает ссылку Facebook Connect, я внедрил this. Моя проблема заключается в том, что если пользователь вошел в Facebook, этот код делает перенаправление с этим:Войти с HWIOAuthBundle в AJAX

document.location = "{{ url("hwi_oauth_service_redirect", {service: "facebook"}) }}"; 

я хотел бы заменить этот код с вызовом в AJAX для аутентификации пользователя на сервере, то получите ответ, и если ответ будет готов, отправьте мою форму еще раз. Как я могу это сделать?

Я разработал обработчик для возврата ответа в JSON с функцией onAuthenticationSuccess и onAuthenticationFailure. В этой части нет проблем. Поэтому моя проблема прежде.

На самом деле, мне бы хотелось, например, как «Список вашего пространства» на сайте Airbnb. См. here.

Заранее благодарим за ваш ответ.

ответ

1

EDITED:

Как я уже сказал в своем комментарии, в архитектуре OAuth, пользователь должен быть перенаправлен на authentifier (здесь facebook) для аутентификации и/или авторизовать приложение для доступа к его данным пользователя. Вы не сможете сделать это в ajax, потому что вы не можете запросить другой домен из-за same origin policy. Тем не менее, вы можете посмотреть на 2 решения:

CORS:

Вы можете попробовать использовать CORS, но вы можете потерять некоторую безопасность в процессе (и я не знаю, если facebook позволяет).

Iframe:

Вы можете попробовать создать IFRAME в JavaScript со страницей аутентификации facebook, но это будет трудно достичь и работать с ним!

Бонус:

Вы можете решить иметь дело с перенаправлением но дать реальный URL пользователь был прежде, чем быть перенаправлены, чтобы его снова после его входа в систему. Чтобы сделать это, вы можете переопределить действие redirectToServiceAction контроллера HWI\Bundle\OAuthBundle\Controller\ConnectController пройти текущий URL:

public function redirectToServiceAction(Request $request, $service) 
{ 
    $redirectUri = $request->query->get('redirect_uri'); 

    // ... 

    return new RedirectResponse($this->container->get('hwi_oauth.security.oauth_utils')->getAuthorizationUrl($request, $service, $redirectUri)); 
} 

Тогда вам нужно изменить ваш JavaScript:

document.location = 
    '{{ url("your_oauth_service_redirect", {service: "facebook"}) }}' + 
    '&redirect_uri=' + 
    document.location 
; 
+0

Спасибо, но ваше решение не работает.Я пробовал это с JQuery, и я отлаживал код. Запрос AJAX вызывает ConnectController.redirectToServiceAction, но я думаю, что проблема в том, что эта функция возвращает ответ на перенаправление, а с AJAX он не работает. Вы пробовали и проверяли свое решение? Пожалуйста, помогите мне. Благодарю. – nairbeau

+0

О да, я сказал вам, что ... b ...! В архитектуре oauth пользователь должен быть перенаправлен на аутентификатор (здесь facebook) для аутентификации и/или авторизации вашего приложения для доступа к его пользовательским данным. Вы не сможете сделать это в ajax, потому что вы не можете запросить другой домен. Вы можете попробовать использовать [CORS] (http://devcenter.kinvey.com/html5/tutorials/how-to-implement-safe-signin-via-oauth#OAuthandJavaScript), но вы потеряете некоторую безопасность в этом процессе (и я не знаю, разрешает ли ему facebook). Завтра я изменю свой ответ, чтобы дать вам лучшее объяснение, почему это невозможно. – Gnucki

+0

Я попробовал ваше последнее бонусное решение. У меня не было ошибок, но моя проблема в том, что я не знаю, как публиковать свою форму. Фактически, я нашел веб-сайт, который сделал бы результат, который я бы хотел. См. Здесь https://www.airbnb.fr/rooms/new. Пожалуйста, можете ли вы дать нам решение с тем же поведением и рабочим процессом? Я отредактировал и улучшил свой вопрос с этим. – nairbeau

0

добавить в config.yml под hwi_oauth :

target_path_parameter: _destination

затем построить ссылку, как, что в веточке:

<a href="{{ path('hwi_oauth_service_redirect', { 'service': 'myservice', '_destination' : app.request.requestUri }) }}" class="connect"> 

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

  • Нет связанных вопросов^_^