【问题标题】:Google oauth authorization code expired?谷歌oauth授权码过期了?
【发布时间】:2017-05-27 22:28:38
【问题描述】:

在最终为访问令牌或刷新令牌返回 NULL 以外的内容后,我现在收到一条错误消息,提示我的授权令牌已过期。我尝试在一天中的不同时间使用 2 个不同的 Google 帐户进行授权,但我不断获得相同的授权令牌。

如何获得新的有效授权令牌?当我转到帐户设置以删除我正在构建的应用程序的授权访问权限并希望重置它时,它没有被列为授权应用程序/服务。

这是我的代码:

require_once 'vendor/autoload.php';
$redirect_uri = 'site url';
$client = new Google_Client();
$client->setAuthConfig('client_secrets.json');
$client->setRedirectUri($redirect_uri);
$client->setAccessType('offline');
$client->setApprovalPrompt('force');
$client->authenticate($_GET['code']);
$refreshToken = $client->getRefreshToken();
var_dump($refreshToken);
$accessToken = $client->getAccessToken();
$aT = $client->fetchAccessTokenWithAuthCode($_GET['code']);
var_dump($accessToken);
var_dump($aT);

最后一行是返回错误的内容。另一个 var_dumps 返回 NULL。

【问题讨论】:

    标签: php oauth google-api google-api-php-client


    【解决方案1】:

    您所遵循的身份验证过程不是正确的,或者至少不是看起来的那样。设置客户端配置后,您必须检查您是否有访问代码,如果没有访问代码,则重定向用户进行身份验证,并且在用户通过身份验证后,重定向用户以执行您想要的操作。您还缺少应用程序获得正确访问权限所需的范围。从您的 Google 个人资料中的 connected apps and sites 中删除您的应用,然后尝试以下操作:

    <?php session_start(); 
    
    //INCLUDE PHP CLIENT LIBRARY
    require_once 'vendor/autoload.php';
    
    $scopes = array("email");
    
    // Create client object
    $client = new Google_Client(); 
    $client->setRedirectUri('http://' . $_SERVER['HTTP_HOST'] . '/index.php');
    $client->setAuthConfig("client_secrets.json");
    $client->addScope($scopes);
    $client->setAccessType('offline');
    $client->setApprovalPrompt('force');  
    
    if ( isset($_SESSION['access_token']) && $_SESSION["access_token"]){
    
    
      $client->setAccessToken($_SESSION['access_token']);
    
      print_r($_SESSION['access_token']);
    
      echo "<br>***************************************************************************************************************************************<br>";
    
      print "Access token creation time: ".date('M d, Y - H:i:s', $_SESSION['access_token']['created']);
    
      echo "<br>*********************************************************************<br>";
    
      print "Refresh token: ".$_SESSION['access_token']['refresh_token'];
    
    
    } else {
    
        if (!isset($_GET['code'])) {
    
          $auth_url = $client->createAuthUrl();
          header('Location: ' . filter_var($auth_url, FILTER_SANITIZE_URL));
    
        } else {
    
          $client->authenticate($_GET['code']);
          $_SESSION['access_token'] = $client->getAccessToken();
    
          $redirect_uri = 'http://' . $_SERVER['HTTP_HOST'] . '/index.php';
          header('Location: ' . filter_var($redirect_uri, FILTER_SANITIZE_URL));
    
        }
    
    }
    
    ?>
    

    请不要忘记查看说明授权过程的文档,该文档位于 here

    【讨论】:

    • 我正在运行您的确切代码,并且没有连接到此帐户的应用程序或网站,并且 access_token 和 refresh_token 为 NULL。
    • 在这种情况下,您的 client_secrets.json 文件似乎不好。您是否使用重定向 URI 适当地配置了项目?
    • 是的,我是直接从 api 控制台下载的。如果未配置重定向,则会出现该错误。
    • 好吧,我放弃了。请尝试创建另一个项目并创建新凭据。抱歉,我帮不上忙。
    猜你喜欢
    • 2019-08-03
    • 2013-01-18
    • 2012-02-13
    • 1970-01-01
    • 1970-01-01
    • 2017-08-31
    • 1970-01-01
    • 2018-11-21
    • 2018-08-05
    相关资源
    最近更新 更多