Мое приложение предназначено для взаимодействия с календарем 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 и возвращения оттуда?