HWIOAuthBundle - FOSUserBundle - Symfony 2 - Перенаправление на пользовательский путь после входа в систему через facebook

Отражена следующая проблема после входа пользователя с учетной записью Facebook: он перенаправляется на следующий маршрут /#_=_

Как я могу вместо этого перенаправить его на этот маршрут: / Или на более этот /# ?

На стороне клиента я использую backbone.


person Angelo Giuffredi    schedule 19.09.2013    source источник
comment
Вы получили ответ на этот вопрос?   -  person Venkat Kotra    schedule 22.10.2013


Ответы (4)


Перенаправление с помощью javascript. Добавьте подписку на страницу.

<script>
    // Handle facebook callback
    if (window.location.hash && window.location.hash == '#_=_') {
        window.location.hash = '';
    }
</script>
person Venkat Kotra    schedule 30.01.2014

Принимая идею @Prynz, мы можем пойти дальше и создать «перенаправление на страницу, откуда приходит пользователь» следующим образом:

1) В брандмауэре позаботьтесь об удалении следующих строк:

# security.yml

# ...
logout: true
logout:
    path: /logout
    target: /

Поскольку мы сами реализуем выход из системы, чтобы избежать перенаправления на указанный target.

2) Добавьте решение @Prynz в ваш security.yml (или config.yml в зависимости от вашей реализации)

oauth:
    resource_owners:
        google: "/login/check-google"
        facebook: "/login/check-facebook"
        twitter: "/login/check-twitter"
        sensio_connect: "/login/check-sensio-connect"
    login_path: /login
    failure_path: /login
    default_target_path: /welcome # THIS LINE CONTRIBUTES TO THE MAGIC
    oauth_user_provider:
        service: app.oauth_user_provider

3) В маршрутизации добавьте новый контроллер (здесь, LoginController) перед импортом HWIO:

fuz_app_login:
    resource: "@FuzAppBundle/Controller/LoginController.php"
    type:     annotation
    prefix:   /

4) Создайте соответствующий контроллер:

<?php

namespace Fuz\AppBundle\Controller;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;

class LoginController
{

    /**
     * @Route("/login", name="login")
     * @Method({"GET"})
     */
    public function loginAction(Request $request)
    {
        if ($this->getUser())
        {
            // already-logged user accessed /login
            return $this->redirect($request->headers->get('referer'));
        }
        else
        {
            // redirect to the login page
            return $this->forward('HWIOAuthBundle:Connect:connect');
        }
    }

    /**
     * @Route("/logout", name="logout")
     * @Method({"GET"})
     */
    public function logoutAction(Request $request)
    {
        // we do a manual logout just to redirect the user to where he comes from
        $this->container->get('security.context')->setToken(null);
        return $this->redirect($request->headers->get('referer'));
    }

    /**
     * @Route("/connect/{service}", name="connect")
     * @Method({"GET"})
     */
    public function connectAction(Request $request, $service)
    {
        // we overwrite this route to store user's referer in the session
        $this->get('session')->set('referer', $request->headers->get('referer'));
        return $this->forward('HWIOAuthBundle:Connect:redirectToService', array('service' => $service));
    }

    /**
     * @Route("/welcome", name="welcome")
     * @Method({"GET"})
     */
    public function welcomeAction()
    {
        // on login success, we're redirected to this route...
        // time to use the referer we previously stored.
        $referer = $this->get('session')->get('referer');
        if (is_null($referer))
        {
            return new RedirectResponse($this->generateUrl('home'));
        }
        return new RedirectResponse($referer);
    }

}

5) расслабиться.

person Alain Tiemblo    schedule 02.01.2015
comment
Это вдохновлено. Большое спасибо. - person Jake N; 12.03.2015
comment
Спасибо, рад узнать, что это помогает. Для более полной реализации вы можете посмотреть этот файл, этот и тот самый. Наслаждаться! - person Alain Tiemblo; 12.03.2015
comment
Одна вещь, которую я сделал по-другому, была в первом файле в строке 27, внутри else я добавил $this->get('session')->set('referer', $request->headers->get('referer'));, потому что моя страница входа содержит ссылки на мои маршруты подключения OAuth. Таким образом, установив реферер здесь, я получаю настоящего реферера, в противном случае реферер всегда является маршрутом входа для моих пользователей OAuth, поскольку они всегда приходят через /login. - person Jake N; 12.03.2015
comment
Я также изменил строку 65 в этом файле на эту, так как становился странным if(!strlen($referer) || preg_match("/login$/", $referer)) - person Jake N; 12.03.2015

Вы просто добавляете default_target_path: /whatever/path/you/want в раздел oauth в настройках брандмауэра.

oauth:
    resource_owners:
        facebook: '/login/check-facebook'
        google: '/login/check-google'
        windows: '/login/check-windows'
        twitter: '/login/check-twitter'
    login_path: /login
    failure_path: /login
    default_target_path: /whatever/path/you/want

Взгляните на https://github.com/hwi/HWIOAuthBundle/issues/89.

person Prynz    schedule 20.11.2013

Если вы хотите, вы можете перенаправить пользователей на текущую страницу следующим образом: Добавьте в свой config.yml

hwi_oauth.target_path_parameter: "target_path"

На ваш взгляд, добавьте URL-адреса с:

&target_path=...

помните, что вы можете взять текущее имя маршрута с помощью

app.request.get('_route')
person marcostvz    schedule 26.05.2016