Обновление токенов доступа с помощью Laravel и Socialite

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

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

Теперь я создал промежуточное программное обеспечение и применил его к маршруту в web.php, например:

Route::get('create', 'EmployeeController@create')
                ->middleware('refresh');

Затем в промежуточном программном обеспечении у меня есть следующий код:

public function handle($request, Closure $next)
{
    dump(session('user'));
    $client = new Google_Client();
    $client->setAccessToken(['access_token' => session('user')->token, 'expires_in' => session('user')->expiresIn]);
    $_SESSION['token'] = $client->getAccessToken();
    $client->setAccessToken($_SESSION['token']);
    if( $client->isAccessTokenExpired() ) {
      echo "expired";
    }
    else {
      echo "not expired";
    }
    return $next($request);
}

Я знаю, что это не делает ничего даже близко к тому, что я хочу. Но когда я вхожу в систему, мне всегда кажется, что «истек срок действия», даже когда я только что вошел в систему. Я думаю, это потому, что я не указал дату и время истечения срока действия, но я не знаю, как установить его, поскольку светская львица поддерживает только эти основные функции:

$token = $user->token;
$refreshToken = $user->refreshToken; // not always provided
$expiresIn = $user->expiresIn;

Самый близкий к моей проблеме вопрос: Как можно Я управляю токенами обновления OAuth с помощью Laravel? Что говорит мне добавить автономный доступ, например:

return Socialite::driver('google')->scopes([ 'email', 'profile', 'https://www.googleapis.com/auth/gmail.compose' ])
            ->with(["access_type" => "offline", "prompt" => "consent select_account"])
    ->redirect();

Это на самом деле не помогает мне, так как я не знаю, что делать дальше, и если это действительно необходимо.

Я не удивлюсь, если пропущу что-то очевидное или сделаю что-то невероятно глупое, но здесь я действительно упираюсь в стену.

Изменить: теперь я понимаю, что вместо социальной сети мне, вероятно, следует использовать API Google, поскольку я использовал его для входа в систему в первую очередь. Теперь у меня есть следующий код:

public function handle($request, Closure $next)
{
  dump(session('user'));
  $client = new Google_Client();
  $client->setAccessToken(['access_token' => session('user')->token, 'expires_in' => session('user')->expiresIn]);
  $client->setAccessType('offline');
  $refreshToken = Auth::User()->remember_token;
  $token = session('user')->token;
  $client->revokeToken();
  $client->refreshToken($refreshToken);
  $newToken=$client->getAccessToken();
  echo "old token: <br>" . $token . "<br> New token: <br>";
  print_r($newToken);
  echo "<br> refreshToken: <br>" . $refreshToken . "<br>" . "client accestoken: <br>";
  session('user')->accessToken = $newToken;
  print_r(session('user')->accessToken);
  dump($client);
  return $next($request);
}

Однако токен доступа не меняется, почему бы и нет?


person Snackoverflow    schedule 11.01.2017    source источник
comment
почему бы не сохранить свой токен или не обновить токен в поле запоминания токена в БД или сохранить в сеансе и получить токен с помощью Socialite::driver('google')->userFromToken(session('access_token'));   -  person Sodruldeen Mustapha    schedule 04.07.2019