Google+ Authentication: refreshToken()返回invalid_grant错误


Google+ Authentication: refreshToken() returns invalid_grant error

我正在使用Laravel构建一个web应用程序,该应用程序使用谷歌帐户作为登录方法。我从Github下载了Google+ PHP API,并编写了一个单例类来访问Google+服务。该类的代码片段如下所示:

// Returns a client ready to receive an access token.
private static function getClient() {
  if (!self::$client) {
    self::$client = new Google_Client();
    self::$client->setApplicationName(self::$application_name);
    self::$client->setClientId(self::$client_id);
    self::$client->setClientSecret(self::$client_secret);
    self::$client->setAccessType('offline');
    // I'm only requesting the plus.login and userinfo.profile scopes.
    self::$client->setScopes(self::$scopes);
    // RedirectURI = 'postmessage'
    self::$client->setRedirectUri(self::$redirect_uri);
  }
  return self::$client;
}
// Returns a client ready to be used for API calls.
private static function getClient2() {
  $c = self::getClient();
  // getToken returns the token session variable. This is the full
  // JSON encoded token we got after authenticating the code.
  $token = self::getToken();
  $c->setAccessToken($token);
  if ($c->isAccessTokenExpired()) {
    // getRefreshToken returns the refresh_token session variable.
    // This is a JSON decoded string that only contains
    // the refresh_token value.
    $refreshToken = self::getRefreshToken();
    // This is the line that blows up.
    $c->refreshToken($refreshToken);
    // This code has never been reached :(
    $newToken = $c->getAccessToken();
    self::storeToken($newToken);
  }
  // If the access_token hasn't expired, we can merrily begin using
  // the client to construct a Google_Service_Plus object.
  return $c;
}

我正在实现混合客户端/服务器流。用户第一次登录时,将调用JavaScript回调函数,该函数将发送一个要进行身份验证的代码。用户通过身份验证,refresh_token存储在数据库和当前会话中,并且我可以在access_token的生命周期内成功地进行API调用。

1小时后,访问令牌过期。我在getClient2()中测试了这一点,并尝试使用从会话检索的refresh_token来刷新access_token(我已经打印了会话变量,并且可以确认它们存在并且是json_decoded)。然后我得到一个漂亮的描述错误

刷新OAuth2令牌错误,消息:'invalid_grant'

在这一点上,所有的页面取决于Google+显示一个错误页面。除非用户返回到站点主页,JavaScript再次开始登录流程,允许服务器在另一个小时内获得有效的access_token,否则站点将变得无响应。

如果需要的话,我可以发布更多的单例类,但我认为这是所有相关的,考虑到我能够验证用户并在第一个小时发出请求。

类似但没有帮助的问题:

  • Google-api-php刷新令牌返回invalid_grant
  • 如何刷新令牌与谷歌API客户端?
  • google上的身份验证:OAuth2一直返回'invalid_grant'
  • 离线访问

如果您希望使用刷新令牌来刷新您的访问令牌,您可以这样做

$client->refreshToken( $refresh_token );
$_SESSION['token'] = $client->getAccessToken();

如果您尝试刷新除最近授予的刷新令牌以外的内容,则会返回invalid_grant。