php - Google एपीआई क्लाइंट "रीफ़्रेश टोकन को सेट एवेस्ट टोकन के हिस्से में पास किया जाना चाहिए या सेट करना"




google-api google-calendar (4)

मैं वर्तमान में एक बहुत ही अजीब समस्या का सामना कर रहा हूं, वास्तव में मैं Google API दस्तावेज़ीकरण से इस बहुत ही मार्गदर्शिका ( https://developers.google.com/google-apps/calendar/quickstart/php ) का अनुसरण कर रहा हूं। मैंने पहली बार इसे एक जादू की तरह काम करते हुए दो बार कोशिश की, लेकिन ऐक्सेस टोकन ने सीधे Google API डॉक द्वारा प्रदान की गई स्क्रिप्ट को समाप्त करने के बाद इसे रीफ़्रेश करने में असमर्थ था।

टी एल; डॉ

यहां त्रुटि संदेश दिया गया है:

[email protected]:~$ php www/path/to/app/public/quickstart.php


Fatal error: Uncaught exception 'LogicException' with message 'refresh token must be passed in or set as part of setAccessToken' in /home/pueblo/www/path/to/app/vendor/google/apiclient/src/Google/Client.php:258
Stack trace:
#0 /home/pueblo/www/path/to/app/public/quickstart.php(55): Google_Client->fetchAccessTokenWithRefreshToken(NULL)
#1 /home/pueblo/www/path/to/app/public/quickstart.php(76): getClient()
#2 {main}
  thrown in /home/pueblo/www/path/to/app/vendor/google/apiclient/src/Google/Client.php on line 258

यहां मैंने संशोधित Google से php स्क्रिप्ट का हिस्सा है:

require_once __DIR__ . '/../vendor/autoload.php';

// I don't want the creds to be in my home folder, I prefer them in the app's root
define('APPLICATION_NAME', 'LRS API Calendar');
define('CREDENTIALS_PATH', __DIR__ . '/../.credentials/calendar-php-quickstart.json');
define('CLIENT_SECRET_PATH', __DIR__ . '/../client_secret.json');

मैंने expandHomeDirectory भी संशोधित किया है ताकि मैं बहुत कोड को संशोधित किए बिना "अक्षम" कर expandHomeDirectory :

function expandHomeDirectory($path) {
  $homeDirectory = getenv('HOME');
  if (empty($homeDirectory)) {
    $homeDirectory = getenv('HOMEDRIVE') . getenv('HOMEPATH');
  }
  return $path;
  // return str_replace('~', realpath($homeDirectory), $path);
}

तो यह जांचने के लिए कि क्या मैं ग़लत था या यदि Google था, तो मैंने एक प्रयोग किया: कल रात मैंने यह जांचने के लिए कि क्या यह काम कर रहा था, एस.एस.एस. से त्वरित स्टार्ट स्क्रिप्ट लांच करता है, और वास्तव में यह था, इसलिए मैंने आज सुबह यह जांचने का फैसला किया कि क्या यह अभी भी काम कर रहा है जैसा कि मैंने सोया था इससे पहले कि यह सो गया था और ऐसा नहीं था मुझे लगता है कि Google की quickstart.php कुछ गड़बड़ है।

मुझे आशा है कि कोई मेरी सहायता कर सकता है, मैंने पहले से ही इस विषय के बारे में अन्य सभी पदों की जांच की है लेकिन वे सभी पुराने हैं।


Google ने इसका संभाल करने के लिए एक बेहतर विधि के साथ, अपने PHP क्विकस्टार्ट को अपडेट किया है:

नीचे स्निपेट:

// Exchange authorization code for an access token.
$accessToken = $client->fetchAccessTokenWithAuthCode($authCode);
$client->setAccessToken($accessToken);

// Refresh the token if it's expired.
if ($client->isAccessTokenExpired()) {
$client->fetchAccessTokenWithRefreshToken($client->getRefreshToken());
file_put_contents($credentialsPath, json_encode($client->getAccessToken()));
}

मेरे मामले में मैं एक्सेस प्रकार को "ऑफ़लाइन" के रूप में सेट करना भूल गया था, जिसके बिना ताज़ा टोकन उत्पन्न नहीं हो रहा था।

$client->setAccessType('offline');

यह पूरा होने के बाद, Google दस्तावेज़ में दिया गया नमूना कोड काम करेगा।

// Exchange authorization code for an access token.
// "refresh_token" is returned along with the access token
$accessToken = $client->fetchAccessTokenWithAuthCode($authCode);
$client->setAccessToken($accessToken);


// Refresh the token if it's expired.
if ($client->isAccessTokenExpired()) {
    $client->fetchAccessTokenWithRefreshToken($client->getRefreshToken());
    file_put_contents($credentialsPath, json_encode($client->getAccessToken()));
}

मुझे नए गूगल एपीआई लाइब्रेरी के साथ एक ही समस्या का सामना करना पड़ा है समाधान के लिए खोज निम्न लिंक लाई है: रिफ़्रेश टॉक मैं नए टोकन के Google शीट एपीआई प्राप्त करने के बाद वापस नहीं लौट रहा हूं

उस जानकारी के आधार पर, मैंने अपनी आवश्यकताओं को पूरा करने के लिए क्विकस्टार्ट कोड भाग को संशोधित किया है Google के साथ पहले प्राधिकरण के बाद मैंने ड्राइव- php-quickstart.json प्राप्त किया है जिसमें रिफ्रेश_टोकन है, जो 3600 सेकंड या एक घंटे में समाप्त होता है। ताज़ा टोकन केवल एक बार जारी किया जाता है, इसलिए यदि यह खो जाता है, तो पुनः प्राधिकरण की आवश्यकता होती है। इसलिए, यह हमेशा ड्राइव- php-quickstart.json में रखने के लिए मैंने निम्नलिखित किया है:

// Refresh the token if it's expired.
if ($client->isAccessTokenExpired()) {
// save refresh token to some variable
$refreshTokenSaved = $client->getRefreshToken(); 

// update access token
$client->fetchAccessTokenWithRefreshToken($refreshTokenSaved); 

// pass access token to some variable
$accessTokenUpdated = $client->getAccessToken();

// append refresh token
$accessTokenUpdated['refresh_token'] = $refreshTokenSaved;

// save to file
file_put_contents($credentialsPath, json_encode($accessTokenUpdated)); 
}

मुझे हाल ही में एक ही समस्या मिली है और मैंने इसे इसके साथ हल किया

<?php
 $client->setRedirectUri($this->_redirectURI);
 $client->setAccessType('offline');
 $client->setApprovalPrompt('force');

मैं समझाता हूं ..... ताज़ा टोकन वापस नहीं आया क्योंकि हमने स्वीकृति के लिए मजबूर नहीं किया। ऑफ़लाइन मोड enought नहीं है हमें अनुमोदन को मजबूर होना चाहिए। इसके अलावा, redirectURi को इन दो विकल्पों के बाद सेट किया जाना चाहिए। यह मेरे लिए काम किया

यह मेरा पूरा कार्य है

<?php
     private function getClient()
     {
        $client = new Google_Client();
        $client->setApplicationName($this->projectName);
        $client->setScopes(SCOPES);
        $client->setAuthConfig($this->jsonKeyFilePath);
        $client->setRedirectUri($this->redirectUri);
        $client->setAccessType('offline');
        $client->setApprovalPrompt('force');

       // Load previously authorized credentials from a file.
       if (file_exists($this->tokenFile)) {
         $accessToken = json_decode(file_get_contents($this->tokenFile), 
         true);
      } else {
        // Request authorization from the user.
        $authUrl = $client->createAuthUrl();
        header('Location: ' . filter_var($authUrl, FILTER_SANITIZE_URL));

        if (isset($_GET['code'])) {
            $authCode = $_GET['code'];
            // Exchange authorization code for an access token.
            $accessToken = $client->fetchAccessTokenWithAuthCode($authCode);
            header('Location: ' . filter_var($this->redirectUri, 
            FILTER_SANITIZE_URL));
            if(!file_exists(dirname($this->tokenFile))) {
                mkdir(dirname($this->tokenFile), 0700, true);
            }

            file_put_contents($this->tokenFile, json_encode($accessToken));
        }else{
            exit('No code found');
        }
    }
    $client->setAccessToken($accessToken);

    // Refresh the token if it's expired.
    if ($client->isAccessTokenExpired()) {

        // save refresh token to some variable
        $refreshTokenSaved = $client->getRefreshToken();

        // update access token
        $client->fetchAccessTokenWithRefreshToken($refreshTokenSaved);

        // pass access token to some variable
        $accessTokenUpdated = $client->getAccessToken();

        // append refresh token
        $accessTokenUpdated['refresh_token'] = $refreshTokenSaved;

        //Set the new acces token
        $accessToken = $refreshTokenSaved;
        $client->setAccessToken($accessToken);

        // save to file
        file_put_contents($this->tokenFile, 
       json_encode($accessTokenUpdated));
    }
    return $client;
}




google-api-php-client