Laravel 5.4 и Socialite перенаправляют на вызывающую страницу после входа в Twitter

Я создаю сайт, на котором есть вход в Twitter через Socialite в Laravel 5.4. Прямо сейчас, когда пользователь вошел в систему, я перенаправляю на домашнюю страницу; однако я хотел бы иметь возможность перенаправлять пользователя на ту страницу, на которой он находился, активировав ссылку «Войти через Twitter». Я пробовал использовать return redirect()->back(), но поскольку последний запрос был к API Twitter, это просто вызывает бесконечный цикл. Я уверен, что это должно быть довольно просто, но я не могу этого понять. Это контроллер, обрабатывающий мои запросы на авторизацию:

<?php

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use App\User;
use Illuminate\Support\Facades\Auth;
use Laravel\Socialite\Facades\Socialite;

class AuthController extends Controller
{
    /**
     * Where to redirect users after login.
     *
     * @var string
     */
    protected $redirectPath = '/home';

    /**
     * Redirect user to OAuth Provider.
     *
     * @param $provider
     * @return Response
     */
    public function redirectToProvider($provider)
    {
        return Socialite::driver($provider)->redirect();
    }

    /**
     * Obtain the user information from provider. check if user already
     * exists in our db by looking up their provider_id in the db.
     * If user exists, log them in. Otherwise, create a new user then log them in.
     * After login, redirect them to the authenticated users homepage.
     *
     * @param $provider
     * @return Response
     */
    public function handleProviderCallback($provider)
    {
        try {
            $user = Socialite::driver($provider)->user();
        } catch (Exception $e) {
            return redirect("auth/$provider");
        }
        $authUser = $this->findOrCreateUser($user, $provider);
        Auth::login($authUser, true);

        return redirect($this->redirectPath);
    }

    /**
     * If a user has registered before using social auth, return the user
     * else, create a new user object.
     *
     * @param $user Socialite user object
     * @param $provider Social auth provider
     * @return User
     */
    public function findOrCreateUser($user, $provider)
    {
        $authUser = User::where('provider_id', $user->id)->first();
        if ($authUser) {
            return $authUser;
        }

        return User::create([
            'name'        => $user->name,
            'handle'      => $user->nickname,
            'provider'    => $provider,
            'provider_id' => $user->id,
            'avatar'      => $user->avatar_original,
        ]);
    }

}

person Ely Bascoy    schedule 22.07.2017    source источник
comment
Вы можете использовать функцию intended   -  person Aman Kumar    schedule 22.07.2017


Ответы (2)


Вам нужно Laravel поведение аутентификации по умолчанию.

return $this->authenticated($request, $this->guard()->user())
    ?: redirect()->intended($this->redirectPath());

Если пользователь посещает /privatepage и эта страница защищена auth middleware, то пользователь перенаправляется на страницу входа и /privatepage сохраняется в сеансе как url.intended. Затем после успешной аутентификации Laravel проверяет, есть ли в сеансе url.intended ключ, и, если он есть, перенаправляет на URL-адрес, сохраненный в сеансе. В противном случае он будет перенаправлен на любую страницу, которую вы определили, по умолчанию /home.

Если вы хотите вручную обрабатывать то, что происходит при аутентификации пользователя, вы можете создать функцию с именем authenticated(), которая будет вызываться вместо этого с ручным перенаправлением.

ИЛИ

Если у вас есть общая страница для guest посетителей и logged in пользователей, вы можете сохранить URL в Session примерно так:

Session::flash('url',Request::server('HTTP_REFERER')); 

и используйте это после манипуляции или аутентификации как:

return redirect(Session::get('url')); 

Надеюсь, это решит вашу проблему.

person Nitish Kumar    schedule 22.07.2017
comment
В итоге я сделал что-то похожее на решение Session::flash('url', Request::server('HTTP_REFERER'));. Я добавил текущий путь в качестве параметра в конец href, например, в своей ссылке: href="{{ url('/auth/facebook') }}?last-url={!! htmlentities(request()->path()) !!}" Затем я добавил это в свою redirectToProvider() функцию: request()->session()->put('last_url', request()->query('last-url')); Я предпочитаю ваш ответ, поскольку он включает меньше кода, а добавление параметра является избыточным, поскольку данные уже отправляются в запросе через переменную $__SERVER - person Ely Bascoy; 23.07.2017

return redirect () -> предназначенный ('/ home #');

person Andrés    schedule 29.08.2018