Laravel не помнит меня после перенаправления GoogleOAuth - PullRequest
0 голосов
/ 21 января 2020

Мое приложение предназначено для взаимодействия с календарем Google пользователя. Поэтому я настроил все элементы GoogleOAuth в Консоли API Google и в laravel с пакетом google/apiclient через composer.

GoogleCalendarApi. php

public function __construct($redirectUri, $tokens = [], $state = '')
{
    $this->client = new \Google_Client();
    $this->client->setAuthConfig([
        'client_id' => env('GOOGLE_CALENDAR_API_OAUTH_CLIENT_ID'),
        'client_secret' => env('GOOGLE_CALENDAR_API_OAUTH_CLIENT_SECRET'),
    ]);
    $this->client->addScope(\Google_Service_Calendar::CALENDAR);
    $this->client->setRedirectUri($redirectUri);
    $this->client->setAccessType('offline');

    if (! empty($tokens) && ! isset($tokens['error'])) {
        $this->client->setAccessToken($tokens);
    }
    if (! empty($state)) {
        $this->client->setState($state);
    }

    $this->calendar = new \Google_Service_Calendar($this->client);
}

$redirectUri - это внутренний URL, который должен получить код и сохранить его для доступа пользователя к API календаря при необходимости.

GoogleCalendarApiController. php

public function oAuthRedirectTarget(Request $request)
{
    $code = $request->get('code');
    $user = Auth::user();
    $instance = GoogleCalendarApi::getInstanceForUser($user);
    $tokens = $instance->client->fetchAccessTokenWithAuthCode($code);

    $user->setMeta('google_calendar_api_tokens', json_encode($tokens));

    return redirect(route('account.user'));
}

Но функция oAuthRedirectTarget выполняется только тогда, когда я не защищаю ее с помощью auth, потому что, как только процесс GoogleOAuth перенаправляет меня в мое приложение, я Я вышел из системы. Поскольку для сохранения токенов мне нужен текущий пользователь (к которому у меня нет доступа по маршруту guest), я создал специальный Guard, который аутентифицирует пользователя на основе временного Remember_token - как строка Это действительно сработало, и токены были сохранены для текущего пользователя, но поскольку маршрут за этой строкой return redirect(route('account.user')); защищен защитой по умолчанию auth, я перенаправлен на экран входа в систему.

Я пытался добавив обертку вокруг URL-адреса OAuth, созданного с помощью пакета, и используя для этого внутреннюю функцию redirect, сохранив сеанс перед перенаправлением, и даже снова войдя в систему вручную, установив для параметра «запомнить» значение true, но я выходить из системы по возвращении из Google.

GoogleCalenderApiController. php

public function oAuthCodeUrlWrapper(Request $request)
{
    $user = Auth::user();
    $url = GoogleCalendarApi::getUserOAuthCodeUrl($user);

    $request->session()->save(); # doesn't help
    Auth::login($user, true); # doesn't help either
    return redirect($url);
}

Я пытался установить SESSION_DRIVER в cookie вместо file, но это сначала дало мне ошибку Bad Gateway (возможно, сбой в работе виртуальной машины), и после некоторого беспокойства я забыл, что вернулся к выходу из системы.

Итак, все это формирует вопрос: как сохранить сеанс текущего пользователя после перенаправления в GoogleOAuth и возвращения оттуда?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...