Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oauth 2.0 OAuth 2.0访问令牌已过期,刷新令牌不可用_Oauth 2.0_Access Token_Google Oauth - Fatal编程技术网

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

Oauth 2.0 OAuth 2.0访问令牌已过期,刷新令牌不可用,oauth-2.0,access-token,google-oauth,Oauth 2.0,Access Token,Google Oauth,我有一个基于web的应用程序,它使用GoogleOAuth2.0作为登录框架。直到昨天,它一直工作得很好。访问令牌过期后,应用程序无法获取刷新令牌。除此之外,“权限请求”页面已改为“离线访问”,而不是“知道你在谷歌上是谁”和“查看你的电子邮件” 最初,“请求许可”页面将请求访问“知道你在谷歌上是谁”和“查看你的电子邮件”。用户注销并尝试第二次登录后,“权限请求”页面也将相同 然而,直到昨天,“许可请求”页面才改为“离线访问”。访问令牌过期后,我收到以下错误消息: PHP致命错误:未捕获异常“Go

我有一个基于web的应用程序,它使用GoogleOAuth2.0作为登录框架。直到昨天,它一直工作得很好。访问令牌过期后,应用程序无法获取刷新令牌。除此之外,“权限请求”页面已改为“离线访问”,而不是“知道你在谷歌上是谁”和“查看你的电子邮件”

最初,“请求许可”页面将请求访问“知道你在谷歌上是谁”和“查看你的电子邮件”。用户注销并尝试第二次登录后,“权限请求”页面也将相同

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

PHP致命错误:未捕获异常“Google_AuthException”,消息为“OAuth 2.0访问令牌已过期,刷新令牌不可用”。对于自动批准的响应,不会返回刷新令牌。'in/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();
    }

我试着像我一样寻找类似的问题,但我找不到。这件事从昨天起就发生了。在此之前,我从未对代码做过任何更改

法比安·帕泽法尔通过他的评论帮助我修复了这个问题

这是我的剧本:

if($client->isAccessTokenExpired()) {

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

}
其实很简单。我没有让他点击“连接我”按钮(由GA API团队提供的演示脚本所示),而是直接给他重定向。
不确定这是否是正确/安全的方法,但这是目前适合我的方法

上面的答案是“正确”的,但我只是想把它放在哪里(!)。。。因此,如果其他人尝试了以令牌过期(!)而告终的示例,请发表此文章

  if($client->isAccessTokenExpired()) {

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

    }
一旦您的代码完成了它需要的任何令牌,并且您的客户机拥有一个访问令牌。。。然后检查它是否仍然有效,如果不是,则发送重新授权

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

据我所知,他们的安全管理有了一些改变。如果你现在可以访问某个应用程序,谷歌会知道你将来需要什么权限并保存它们,如果你想拥有新的权限或离线访问权限,只会再次询问你。我想,这是他们更新系统时出现的一个临时错误,因为我现在没有遇到任何问题。更新:你说得对,我也不能再使用刷新令牌了…你能告诉我如何摆脱这个问题吗?你能解释一下吗,这个解决方案是如何导致API批准您的访问令牌的?这段代码实际上并不是关于获取您的访问令牌,而是为了防止用户每5分钟登录一次应用程序。很抱歉,我很久没有接触过这段代码了,所以我现在无法提供帮助…authenticate()需要从身份验证系统传回的代码。我让它工作了,但似乎有一个无休止的循环,正如我所知,当页面加载时,令牌会一直过期。我必须取消设置所有保存并在重定向时传递令牌和状态的会话,但我不明白为什么不能取消设置保存的令牌。我怀疑该状态与令牌一起使用,但我无法调查它,不得不继续。