2013-12-13 238 views
15

我有一个基于Web的应用程序,它使用Google OAuth2.0作为登录框架。它以前工作很好,直到昨天。访问令牌过期后,应用程序无法获取刷新令牌。除此之外,“请求许可”页面更改为“有离线访问”,而不是“知道您在Google上的人”和“查看您的电子邮件”OAuth 2.0访问令牌已过期,并且刷新令牌不可用

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

但是,直到昨天,“请求许可”页面更改为“有离线访问”。访问令牌过期后,我收到以下错误消息:

PHP致命错误:未收到的异常'Google_AuthException'带有消息'OAuth 2.0访问令牌已过期,并且刷新令牌不可用。刷新令牌不会返回自动批准的响应。 in /home2/xxxx/public_html/test/google-api-php-client/src/auth/Google_OAuth2.php:221

我试过​​。但是,我仍然有这个致命的错误。下面是我的代码获取访问令牌:

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(); 
    } 

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

+0

据我所知,他们改变了一点他们的安全管理。如果您现在可以访问应用程序,那么Google知道未来,您要求提供哪些权限并将其保存,如果您想拥有新的权限或脱机访问权限,则只会再询问一次。我想,这是一个暂时的错误,他们一直在更新他们的系统,因为我现在没有遇到任何问题。 –

+0

更新:你说得对,我也不能使用刷新标记了... –

+0

你能告诉我如何摆脱这个? – Akilsree1

回答

18

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

这里是我的脚本:

if($client->isAccessTokenExpired()) { 

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

} 

这其实很简单。与其要求他点击“连接我”按钮(就像GA API团队提供的演示脚本一样),我直接重定向他。 不知道这是否是正确/安全的方式,但这是现在为我工作的那个!

+0

你能解释一下,这个解决方案是如何导致API批准你的访问令牌的? – Rodniko

+0

这段代码并不是真的需要获取您的访问令牌,而只是为了防止用户每隔5分钟就登录应用程序。 我很抱歉,我长期没有触及此代码,因此我现在无法提供帮助... –

3
if($client->isAccessTokenExpired()) { 

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

    } 
+3

authenticate()要求从认证系统传回的代码。 –

+0

我得到了这个工作,但似乎有一个无限循环,因为我的令牌在页面加载时会一直到期。 – JBS

2

上面的答案是“正确的”,但我faffed各地制定出在哪里把它(!)......所以这张贴任何其他人想的是,最终有令牌即将到期的例子(!)。

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

// 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{ 
... 
    } 
+0

我不得不取消所有SESSION的保存并通过重定向的令牌和状态,但我不明白为什么我不能只取消保存的令牌。我怀疑这个国家正在与令牌一起使用,但我无法调查它,只好继续前进。 – imparante