php - Google ड्राइव सेवा खाते और "अनधिकृत ग्राहक या अनुरोध में दायरा"



google-drive-sdk (1)

इस पोस्ट के लिए धन्यवाद और आपकी टिप्पणी " लाइन $credentials -> sub = $service_account_email; को निकालने के द्वारा हल किया गया $credentials -> sub = $service_account_email; "

मैं यहां एक समान समस्या का सामना कर रहा हूं। जाहिर है, $credentials -> sub = $service_account_email केवल Google डेवलपर कंसोल में बनाए गए प्रथम / प्राथमिक सेवा खाते के लिए स्वीकार किए जाते हैं इसके अलावा, यह कुछ OAuth2 स्कोप के साथ अप्रत्याशित त्रुटियों का भी उत्पादन करेगा (जैसा कि मैंने फ्यूजन टेबल्स के साथ सामना किया)।

इसलिए, यहां सामान्य सलाह दी गई है:

$credentials -> sub = $service_account_email शामिल न करें $credentials -> sub = $service_account_email अनावश्यक रूप से

केवल ऐसा करें जब आप किसी अंतर उपयोगकर्ता का प्रतिरूपण करने की कोशिश कर रहे हों (शर्त के साथ कि Google Apps Admin Console में उपयुक्त सेटअप ठीक से किया गया है)।

हालांकि यह कुछ मामलों में कोई त्रुटि उत्पन्न नहीं कर सकता है, जब "उप" फ़ील्ड के मान के रूप में जेडब्ल्यूटी दावे सेट में सर्विस अकाउंट का ईमेल पता शामिल होता है, तो कुछ अप्रत्याशित व्यवहार होते हैं

मेरे पास 3 सेवा खाते हैं जो ड्राइव sdk का उपयोग कर रहे हैं

1, काम करता है, 2 नहीं।

त्रुटि जो वापस आती है "OAuth2 टोकन को रीफ्रेश करने में त्रुटि, संदेश: '{" त्रुटि ":" अनधिकृत_क्लाइन "," त्रुटि_विवरण ":" अनुरोध में अनधिकृत ग्राहक या क्षेत्र। "}' '

डेवलपर कंसोल में सभी 3 खाते पंजीकृत हैं सभी 3 Google Apps Console में "प्रबंधित क्लाइंट एपीआई पहुंच" के लिए प्राधिकृत हैं सभी 3 के पास " https://www.googleapis.com/auth/drive.readonly " गुंजाइश है। ड्राइव में सभी 3, इसके लिए एक विशिष्ट फ़ोल्डर है, "केवल देखने" के लिए साझा किया गया है

मैं PHP का उपयोग कर रहा हूं और मैं उस पृष्ठ पर एक पैरामीटर पास करता हूं जिसे "टाइप" कहा जाता है और यह दर्शाता है कि खाते का उद्देश्य क्या है, सार्वजनिक के लिए 1, सदस्य के लिए 1 और व्यवस्थापक के लिए 1।

उदाहरण के लिए

http://www.somehost.com/oauth_client.php?type=googledrive_admin

P12 प्रमाण पत्र और उपयोगकर्ता मान सर्वर पर संग्रहीत हैं। सभी "ini" फ़ाइलों में वैल्यू, क्लाइंट_आईडी, क्लाइंट-एमेल, स्कोप और क्वेरी फिल्टर की समान संरचना होती है। सभी मामलों में फाइल के बीच में परिवर्तन करने वाला एकमात्र आइटम client_id और client_email है।

मेरा कोड निम्नानुसार है:

    <?php

 include (__DIR__ . "/google-api-php-client/autoload.php");

 google_api_php_client_autoload("Google_Auth_AssertionCredentials");
 google_api_php_client_autoload("Google_Client");
 google_api_php_client_autoload("Google_Service_Drive");
 google_api_php_client_autoload("Google_Service_OAuth2");

 $type = $_GET['type'];
 $path = __DIR__ . "/secure/";
 $certificate = $path . $type . ".p12";
 $ini_path = $path . $type . ".ini";

 $ini = parse_ini_file($ini_path);
 $service_scope = $ini['scope'];
 $service_account_id = $ini['id'];
 $service_account_email = $ini['email'];
 $service_query = $ini['q'];

 $service_account_key = file_get_contents($certificate);
 $credentials = new Google_Auth_AssertionCredentials(
  $service_account_email,
  array($service_scope),
  $service_account_key
 );
 $credentials -> sub = $service_account_email;

 $google_client = new Google_Client();

 $google_client -> setAssertionCredentials($credentials);
 if ($google_client -> getAuth() -> isAccessTokenExpired()) {
  $google_client -> getAuth() -> refreshTokenWithAssertion(); **//FAILS HERE**
 }  

 $drive = new Google_Service_Drive($google_client);

 $result = array();
 $pageToken = NULL;

 do {
  try {
   $parameters = array();
   if ($pageToken) {
    $parameters['pageToken'] = $pageToken;
   }
   $parameters['q'] = $service_query;

   $files = $drive -> files -> listFiles($parameters);

   $result = array_merge($result, $files -> getItems());
   $pageToken = $files -> getNextPageToken();
  } catch (Exception $e) {
   print "An error occurred: " . $e -> getMessage();
   $pageToken = NULL;
  }
 } while ($pageToken);

 echo json_encode($result) . "\n";
?>

प्रत्येक आईआईआई फाइल को संरचित किया गया है

id="35{code}.apps.googleusercontent.com"
email="35{code}@developer.gserviceaccount.com"
scope="https://www.googleapis.com/auth/drive.readonly"
q="mimeType != 'application/vnd.google-apps.folder'"

क्या मैं अभी काम नहीं कर सकता है इसलिए यह एक सेवा खाते के लिए काम करता है और अन्य लोगों के लिए नहीं, जब मैं उन सभी के लिए उसी प्रक्रिया से गुजरता हूं। किसी भी विचार और मदद की सराहना की।





google-drive-sdk