使用刷新令牌续订后,访问令牌相同

问题描述 投票:0回答:1

在youtube api上,我在1小时后遇到0auth问题,已经被拦截了两天。 401凭据错误。

$OAUTH2_CLIENT_ID = 'XXXXX';
$OAUTH2_CLIENT_SECRET = 'XXXXX';
$client = new Google_Client();
$client->setAccessType('offline');
$client->setApprovalPrompt('force');
$client->setClientId($OAUTH2_CLIENT_ID);
$client->setClientSecret($OAUTH2_CLIENT_SECRET);
$client->setScopes('https://www.googleapis.com/auth/youtube');
$redirect = filter_var('http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'],
    FILTER_SANITIZE_URL);
$client->setRedirectUri($redirect);
$service = new Google_Service_YouTube($client);                            
if (isset($_GET['code'])){
    $accessToken = $client->fetchAccessTokenWithAuthCode($_GET['code']);
    $client->setAccessToken($accessToken);
    $test=$client->getAccessToken();    
    //TEST REFRESH TOKEN
    print_r($test);
    sleep(10);
    $client->fetchAccessTokenWithRefreshToken($client->getRefreshToken());
    $test=$client->getAccessToken();
    print_r($test);                                                         
  }    

// Check to ensure that the access token was successfully acquired.
if ($client->getAccessToken()) {
 ... 
  foreach ($files as $file){    
      if ($client->isAccessTokenExpired()) {
         $client->fetchAccessTokenWithRefreshToken($client->getRefreshToken());
         file_put_contents($credentialsPath, json_encode($client->getAccessToken()));
       } // end if token expired                                     
  ====CALL YOUTUBE API HERE IN FOREACH LOOP ===
  }// end foreach files

}

我的测试代码的结果显示,在提供刷新令牌后,访问令牌根本没有改变,即使到期时间也没有说明'expires_in'

这就是为什么我在一小时后面临信用错误...我不知道我的代码有什么问题,请帮助我,这是获取访问代码后我的测试代码的结果,因此你可以看到'新'访问令牌与前一个类似,我已经尝试在setAccessToken()和fetchAccessTokenWithRefreshToken()的参数上使用encode_json。没有得到错误但结果仍然相同......

阵列([的access_token] => ya29.GlvQBuGBfZDQn3E8HWd4wfSbb0hLHsYVGzPBE0boJuB4ien5pcsOGqXlkEyOU7mevDLOGOWbuakTyTiAUVf2bkxNwZXX [expires_in] => 3600 [refresh_token] => 1 / KEgjy2t9kTNwCXk-ZtMTSzPSS2xl4XX [范围] => https://www.googleapis.com/auth/youtube [token_type] =>承载[创建] => 1552891085)

阵列([的access_token] => ya29.GlvQBuGBfZDQn3E8HWd4wfSbb0hLHsYVGzPBE0boJuB4ien5pcsOGqXlkEyOU7mevDLOGOWbuakTyTiAUVf2bkxNwZXX [expires_in] => 3600 [refresh_token] => 1 / KEgjy2t9kTNwCXk-ZtMTSzPSS2xl4XX [范围] => https://www.googleapis.com/auth/youtube [token_type] =>承载[创建] => 1552891085)

谢谢

php youtube-api google-oauth google-api-php-client google-oauth2
1个回答
0
投票

访问令牌在一小时后到期,这就是它们的工作方式。访问令牌到期后,您应该运行代码并获取新的访问令牌。在新的访问令牌到期之前获取它将导致相同的访问令牌。

您的访问令牌是在创建(tip epoch converter)时创建的,添加3600(秒)以查明它何时到期。

1552891085 <--- Monday, March 18, 2019 6:38:05 AM

我可以看到你的代码唯一错误的是你获取访问令牌但实际上没有使用它Oauth2Authentication.php

function getOauth2Client() {
    try {

        $client = buildClient();

        // Set the refresh token on the client. 
        if (isset($_SESSION['refresh_token']) && $_SESSION['refresh_token']) {
            $client->refreshToken($_SESSION['refresh_token']);
        }

        // If the user has already authorized this app then get an access token
        // else redirect to ask the user to authorize access to Google Analytics.
        if (isset($_SESSION['access_token']) && $_SESSION['access_token']) {

            // Set the access token on the client.
            $client->setAccessToken($_SESSION['access_token']);                 

            // Refresh the access token if it's expired.
            if ($client->isAccessTokenExpired()) {              
                $client->fetchAccessTokenWithRefreshToken($client->getRefreshToken());
                $client->setAccessToken($client->getAccessToken()); 
                $_SESSION['access_token'] = $client->getAccessToken();              
            }           
            return $client; 
        } else {
            // We do not have access request access.
            header('Location: ' . filter_var( $client->getRedirectUri(), FILTER_SANITIZE_URL));
        }
    } catch (Exception $e) {
        print "An error occurred: " . $e->getMessage();
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.