使用Laravel和Socialite刷新访问令牌

时间:2017-01-11 11:15:59

标签: php laravel access-token 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;

我能找到最接近问题的问题是: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);
}

然而,访问令牌不会改变,为什么不呢?

0 个答案:

没有答案