我正在处理的应用程序具有邮件功能。当我在登录后尝试发送邮件一个多小时后,我遇到了一个错误。访问令牌已过期,强制您再次登录。
但是如何刷新访问令牌?我知道我首先要检查令牌是否已过期,然后使用刷新令牌发送请求,最后保存返回的访问令牌。
我现在已经创建了一个中间件并将其应用到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;
我能找到最接近问题的问题是:How can I manage OAuth refresh tokens with Laravel? 这告诉我添加离线访问,如下所示:
return Socialite::driver('google')->scopes([ 'email', 'profile', 'https://www.googleapis.com/auth/gmail.compose' ])
->with(["access_type" => "offline", "prompt" => "consent select_account"])
->redirect();
这对我来说并没有什么帮助,因为我不知道从那里开始做什么,或者它是否真的有必要。
如果我错过了一些显而易见的事情或者做了一些非常愚蠢的事情,我不会感到惊讶,但我真的在这里碰壁。
编辑: 我现在意识到,我应该使用Google API,而不是社交名流,因为我首先使用它来登录。我现在有以下代码:
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);
}
然而,访问令牌不会改变,为什么不呢?