OAuth 2.0访问令牌已过期,并且刷新令牌不可用

时间:2013-12-13 11:40:47

标签: oauth-2.0 access-token google-oauth

我有一个基于网络的应用程序,它使用Google OAuth2.0作为登录框架。直到昨天它还能很好地工作。访问令牌过期后,applcation无法获取刷新令牌。除此之外,“请求权限”页面已更改为“有离线访问权限”,而不是“知道您在Google上的身份”和“查看您的电子邮件”

最初,“请求许可”页面将要求访问“了解您在Google上的身份”和“查看您的电子邮件”。用户注销并尝试第二次登录后,“请求权限”页面也是相同的。

但是,直到昨天,“请求权限”页面已更改为“具有脱机访问权限”。访问令牌过期后,我收到了错误消息:

PHP致命错误:未捕获的异常“Google_AuthException”,并显示消息“OAuth 2.0访问令牌已过期,并且刷新令牌不可用。对于自动批准的回复,不会返回刷新令牌。在/home2/xxxx/public_html/test/google-api-php-client/src/auth/Google_OAuth2.php:221

我试过了$client->setAccessType('online');。但是,我仍然遇到了这个致命的错误。以下是获取访问令牌的代码:

    if ($client->getAccessToken()) {
      $token = $client->getAccessToken();
      $authObj = json_decode($token);
      $refreshToken = $authObj->refresh_token;
      $user = $oauth2->userinfo->get();
      $me = $plus->people->get('me');
      $email = filter_var($user['email'], FILTER_SANITIZE_EMAIL); // get the USER EMAIL ADDRESS using OAuth2

      $optParams = array('maxResults' => 100);
      $activities = $plus->activities->listActivities('me', 'public', $optParams);


      $_SESSION['access_token'] = $client->getAccessToken();
    } else {
      $authUrl = $client->createAuthUrl();
    }

我试图像我一样搜索类似的问题,但我找不到一个。这发生在昨天以后。在此之前,我从未对代码做过任何更改。

3 个答案:

答案 0 :(得分:18)

通过他的评论,Fabian Parzefall帮助我解决了这个问题。

这是我的剧本:

if($client->isAccessTokenExpired()) {

    $authUrl = $client->createAuthUrl();
    header('Location: ' . filter_var($authUrl, FILTER_SANITIZE_URL));

}

实际上非常简单。而不是要求他点击"连接我"按钮(由GA API团队提供的演示脚本放置),我直接重定向他。 不确定它是否是正确/更安全的方式,但那就是现在为我工作的人!

答案 1 :(得分:3)

  if($client->isAccessTokenExpired()) {

     $client->authenticate();
     $NewAccessToken = json_decode($client->getAccessToken());
     $client->refreshToken($NewAccessToken->refresh_token);

    }

答案 2 :(得分:2)

上面的答案是正确的'但是我一直在努力找出把它放在哪里(!)......所以发布这个给其他人尝试最后用令牌到期的例子(!)。

一旦你的代码完成了它需要的任何令牌内容,你的客户端就有了一个访问令牌......然后检查它是否仍然有效,如果没有发送给重新授权!

// Stuff to do with getting tokens and storing in session etc...

if ($client->getAccessToken()) { // Hey! we got one!
    if($client->isAccessTokenExpired()) { // Oh! its not good - go for another
        $authUrl = $client->createAuthUrl();
        header('Location: ' . filter_var($authUrl, FILTER_SANITIZE_URL));
        exit();
    }
  try{
...
     }