Приложение, над которым я работаю, имеет функцию рассылки. Когда я попытался отправить письмо более чем через час после регистрации, меня встретила ошибка. Срок действия токена доступа истек, что вынуждает вас снова войти в систему.
Но как обновить токен доступа? Я знаю, что сначала мне нужно проверить, не истек ли срок действия токена, затем отправить запрос с токеном обновления и, наконец, сохранить возвращенный токен доступа.
Теперь я создал промежуточное программное обеспечение и применил его к маршруту в 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);
}
Однако токен доступа не меняется, почему бы и нет?