Laravel 5 и Socialite - новое перенаправление после входа в систему

Еще один новый вопрос, но, надеюсь, кто-то сможет пролить свет:

Я использую Socialite с Laravel 5, и я хочу иметь возможность перенаправлять пользователя на страницу на сайте после того, как они вошли в систему. Проблема в том, что использование

return redirect('any-path-I-put-here');

просто перенаправляет обратно на 'social-site / login? code = afkjadfkjdslkfjdlkfj ...' (где 'social-site' - это любой сайт, который используется, например facebook, twitter, google и т. д.)

Итак, мне кажется, что происходит то, что функция redirect () в интерфейсе Socialite / Contracts / Provider отменяет любое перенаправление, которое я пытаюсь сделать после факта.

Просто для пояснения, мои маршруты настроены правильно. Я пробовал каждую версию «перенаправления», которую вы можете себе представить («на», «назад», «предполагалось», «Redirect ::» и т. Д.), И метод вызывается из моего контроллера аутентификации (хотя я пробовал его в другом месте. также).

Вопрос в том, как мне переопределить этот redirect () после того, как я закончу сохранение и авторизацию пользователя с помощью Socialite? Любая помощь приветствуется! Заранее спасибо.

Код, содержащий рассматриваемое перенаправление:

public function socialRedirect( $route, $status, $greeting, $user )
{

    $this->auth->login( $user, true );

    if( $status == 'new_user' ) {
        // This is a new member. Make sure they see the welcome modal on redirect
        \Session::flash( 'new_registration', true );

        return redirect()->to( $route );// This is just the most recent attempt. It originated with return redirect($route);, and has been attempted every other way you can imagine as well (as mentioned above). Hardcoding (i.e., 'home') returns the exact same result. The socialite redirect always overrides anything that is put here.
    }
    else {
        return redirect()->to( $route )->with( [ 'greeting' => $greeting ] );
    }
}

... Класс SocialAuth, который запускается до этого, однако, имеет длину около 500 строк, так как он должен определять, существует ли пользователь, при необходимости регистрировать новых пользователей, отображать формы для различных сценариев и т. Д. Между тем, вот функция, которая отправляет информацию из класса Social Auth:

private function socialLogin( $socialUser, $goto, $provider, $status, $controller )
{
    if( is_null( $goto ) ) {
        $goto = 'backlot/' . $socialUser->profile->custom_url;
    }

    if( $status == 'new_user' ) {
        return $controller->socialRedirect($goto, $status, null, $socialUser);
    }
    else {
        // This is an existing member. Show them the welcome back status message.
        $message = 'You have successfully logged in with your ' .
            ucfirst( $provider ) . ' credentials.';

        $greeting =
            flash()->success( 'Welcome back, ' . $socialUser->username . '. ' . $message );

        return $controller->socialRedirect($goto, $status, $greeting, $socialUser);
    }
}

person DonnaJo    schedule 27.05.2015    source источник
comment
Покажите нам код перед перенаправлением, в котором вы авторизуете пользователя.   -  person ceejayoz    schedule 27.05.2015
comment
@ceejayoz, код выше с объяснением. Чтобы уточнить, даже если я жестко закодирую переменную $ route в перенаправлении, перенаправление не работает. Дайте мне знать, если вам нужно увидеть больше. Спасибо за ответ.   -  person DonnaJo    schedule 27.05.2015
comment
Пожалуйста, посмотрите учебник Laracasts Socialite   -  person Ali Gajani    schedule 27.05.2015
comment
Есть ли успех с этой проблемой? Я столкнулся с подобной проблемой во время разработки. Вход в социальную сеть через Socialite завершается успешно. Я также получаю данные пользователя из социальных сетей, я создаю / обновляю пользователя в базе данных и пытаюсь перенаправить на панель управления пользователя. Это перенаправление каждый раз терпит неудачу. Однако, когда я обновляю страницу, я перехожу на панель пользователя.   -  person Prakhar    schedule 12.10.2016


Ответы (3)


Мне удалось обойти эту проблему, но я не уверен, что это лучший способ ее исправить. Подобно тому, что указано в вопросе, я получил обратный вызов с аутентификацией из социальных сетей, но мне не удалось перенаправить текущий ответ на другой URL-адрес.

На основе параметров запроса обратного вызова я смог создать и аутентифицировать пользователя в моем приложении Laravel. До сих пор это работало хорошо, но проблемы возникли после этого шага, когда я попытался сделать return redirect()->route('dashboard');. Я перепробовал все варианты redirect() помощника и Redirect фасада, но ничего не помогло.

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

В этот момент (когда обратный вызов был получен приложением и пользователь был аутентифицирован), если я обновил страницу вручную (F5), я был перенаправлен на нужную страницу. Моя интерпретация аналогична тому, что было сказано ранее в этом вопросе. Перенаправление из обратного вызова в социальных сетях преобладало над перенаправлениями, которые я запускал в своем контроллере (возможно, перенаправление в приложении Laravel было подавлено, потому что перенаправление из социальных сетей еще не было завершено). Это просто моя интерпретация. Эксперты могут пролить больше света, если они думают иначе или у них есть лучшее объяснение.

Чтобы исправить это, я выполнил необработанное перенаправление http с использованием header("Location /dashboard"); и применил промежуточное ПО аутентификации к этому маршруту. Таким образом, я мог издеваться над функциональностью обновления, перенаправлять на панель управления (или предполагаемый URL-адрес) и проверять аутентификацию в моем DashboardController.

Опять же, это не идеальное решение, и я исследую фактический корень проблемы, но это может помочь вам двигаться дальше, если вы столкнулись с аналогичной проблемой.

person Prakhar    schedule 12.10.2016

Я считаю, что вы слишком много думаете об этом. Использовать Socialite довольно просто:

Настроить config/services.php. Для facebook у меня это:

 'facebook' => [
    'client_id' => 'your_fb_id',
    'client_secret' => 'your_fb_secret',
    'redirect' => '>ABSOLUTE< url to redirect after login', //like: 'http://stuff'
  ],

Затем настройте два маршрута: один для входа в систему и один для обратного вызова (после входа в систему).

В методе контроллера входа:

return \Socialize::with('facebook')->redirect();

Затем в функции обратного вызова

$fb_user = \Socialize::with('facebook')->user();
// check if user exists, create it and whatnot
//dd($fb_user);
return redirect()->route('some.route');

Для всех других провайдеров он должен быть примерно таким же.

person hfingler    schedule 30.05.2015
comment
Как можно было бы управлять redirect в разных средах? Я полагаю, что могу просто сохранить его в своем .env файле, но кажется странным жестко закодировать что-то вроде абсолютного URL-адреса для моего файла среды. - person oflannabhra; 30.06.2015
comment
@oflannabhra Я думаю, вы можете использовать функции маршрутизации Laravel. Например, вы можете согласовать маршрут, который должно иметь каждое приложение, например маршрут с именем facebook.redirect, а затем установить перенаправление как route('facebook.redirect'). - person hfingler; 30.06.2015
comment
Итак, внутри services.php у меня есть доступ к route()? - person oflannabhra; 30.06.2015
comment
Просто попробовал и нет, не работает. Бьюсь об заклад, у светской львицы есть что исправить. Я поищу код. - person hfingler; 30.06.2015
comment
Я только что обратился к @taylorotwell, и да, он рекомендует хранить эти URL-адреса в .env файле twitter.com/taylorotwell/status/615944072214122496 - person oflannabhra; 30.06.2015
comment
Это мило, я рада, что он отвечает на хорошие вопросы. Так же всегда можно раскошелиться и сделать пиар. Я бы изменил функцию перенаправления, добавив необязательный параметр, который является маршрутом, на который он должен перенаправлять. - person hfingler; 30.06.2015

Мы используем логин Socialite в нашем UserController как черту. Мы просто переопределили AuthenticatesSocialiteLogin :: loginSuccess () в нашем контроллере.

use Broco\SocialiteLogin\Auth\AuthenticatesSocialiteLogin;

class UserController extends BaseController
{
    use AuthenticatesSocialiteLogin;

    public function loginSuccess($user)
    {
        return redirect()->intended(url('/#login-success'));
    }

....
person zmonteca    schedule 20.02.2017