Войти пользователем с HWIOAuthBundle в AJAX

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

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

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

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

На самом деле, я хотел бы, чтобы поведение было похоже на страницу «Список мест» на сайте Airbnb. См. здесь.

Заранее спасибо за ваш ответ.


person nairbeau    schedule 20.12.2014    source источник


Ответы (2)


ОТРЕДАКТИРОВАНО:

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

КОРС:

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

Ифрейм:

Вы можете попытаться создать 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
;
person Gnucki    schedule 21.12.2014
comment
Спасибо, но ваше решение не работает. Я попробовал это с JQuery и отладил код. Запрос AJAX вызывает ConnectController.redirectToServiceAction, но я думаю, проблема в том, что эта функция возвращает ответ перенаправления, а с AJAX она не работает. Вы пробовали и проверяли свое решение? Помогите мне, пожалуйста. Спасибо. - person nairbeau; 21.12.2014
comment
Я попробовал ваше последнее бонусное решение. У меня не было ошибок, но моя проблема в том, что я не знаю, как опубликовать свою форму. В самом деле, я нашел веб-сайт, который дает результат, который я хотел бы. См. здесь airbnb.fr/rooms/new. Пожалуйста, можете ли вы дать нам решение с таким же поведением и рабочим процессом? Я отредактировал и улучшил свой вопрос с этим. - person nairbeau; 25.12.2014
comment
Извините, но я не могу помочь вам изучить этот код. Это занимает слишком много времени. Вам следует ознакомиться с RFC для oauth2, чтобы понять, что и как можно сделать. - person Gnucki; 29.12.2014

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

target_path_parameter: _destination

затем создайте такую ​​​​ссылку в twig:

<a href="{{ path('hwi_oauth_service_redirect', { 'service': 'myservice', '_destination' : app.request.requestUri }) }}" class="connect"> 
person Héctor Prats    schedule 22.04.2015