سؤال

أحاول استخدام Google Drive API من خلال هوية التطبيق الواجهة المقدمة مع Google App Engine.يتيح هذا بشكل أساسي لتطبيق الويب الخاص بي التواصل مع واجهات برمجة التطبيقات الخاصة بـ Google من خادم إلى خادم.

لا أحتاج إلى تسجيل دخول المستخدمين، كل ما أحتاجه هو عرض مستندات Google Drive الخاصة بي.

ومع ذلك، بعد أن قمت بتعيين جميع القيم والنطاقات المناسبة، وتمكين جميع مقابض Google Drive الصحيحة على صفحة وحدة التحكم، ما زلت أحصل على هذا لطلب GET بسيط https://www.googleapis.com/drive/v2/files:

{ "error": { "errors": [ { "domain": "usageLimits", "reason": "dailyLimitExceededUnreg", "message": "Daily Limit for Unauthenticated Use Exceeded. Continued use requires signup.", "extendedHelp": "https://code.google.com/apis/console" } ], "code": 403, "message": "Daily Limit for Unauthenticated Use Exceeded. Continued use requires signup." }}

ما هو الخطأ؟ماذا ينقصني؟إليك الكود الذي يقوم بالفعل بتنفيذ الطلب - والشيء المضحك هو أنه يعمل بشكل رائع إذا كنت أستخدم واجهات برمجة التطبيقات الأخرى مثل واجهة برمجة تطبيقات تقصير عناوين URL:

var scopes = new java.util.ArrayList();                                                                                                    
scopes.add("https://www.googleapis.com/auth/drive");                                                                                       
var appIdentity = AppIdentityServiceFactory.getAppIdentityService();                                                                       
var accessToken = appIdentity.getAccessToken(scopes);

var url = new URL("https://www.googleapis.com/drive/v2/files");                                                                            
var connection = url.openConnection();                                                                                                     
connection.setDoOutput(true);                                                                                                              
connection.setRequestMethod("GET");                                                                                                        
connection.addRequestProperty("Content-Type", "application/json");                                                                         
connection.addRequestProperty("Authorization", "OAuth " + accessToken.getAccessToken());

يحرر

إذا قمت ببساطة بتغيير واجهة برمجة التطبيقات لاستخدام urlshortner API على سبيل المثال، يعمل:

var url = new URL("https://www.googleapis.com/urlshortener/v1/url/history");

والإخراج:

{ "kind": "urlshortener#urlHistory", "totalItems": 0, "itemsPerPage": 30}

إذن يجب أن يكون هناك شيء لا يعمل مع Google Drive وهوية التطبيق؟

تحرير 2

لقد وجدت بعض المساعدة من الإجابة الصحيحة هنا: https://stackoverflow.com/a/12526286/50394

ولكنه يتحدث عن تعيين نطاقات Client API على Google Apps، وأنا لا أستخدم Google Apps، بل أستخدم نطاق Google App Engine ببساطة foo.appspot.com

هل كانت مفيدة؟

المحلول

الخطأ 403 الذي تحصل عليه يعني عدم وجود رأس التفويض في GET الخاص بك.المنطق هو أنه بدون رأس التفويض، أنت مجهول (أنت فيلق بلا بلا :-)).حصة Drive للاستخدام المجهول هي صفر، ومن هنا جاءت الرسالة.يحتوي مُختصر URL على حصة أعلى للمجهول لذا فهو يعمل.

أقترح عليك تغيير عنوان URL للإشارة إلى خادم http خاص بك، والتحقق من الرؤوس التي ترسلها بالفعل.

نصائح أخرى

AFAICT يجب أن تستخدمه Bearer في رأس التفويض.

ربما ما يحدث هو أن Drive API لا يتعرف على حساب الخدمة (بسبب العنوان الخاطئ؟) وبالتالي يعتبره طلبًا مجهولًا لأنه لا يوجد key لم يتم توفير المعلمة أيضًا (انظر معلمات الاستعلام الشائعة).

جرب هذا:

connection.addRequestProperty("Authorization", "Bearer " + accessToken.getAccessToken());

أو يمكنك محاولة إضافة الرمز المميز كـ access_token معلمة الاستعلام

أعتقد أنه يجب عليك على الأقل إعداد إدخال وحدة تحكم API مع تمكين Drive API في https://code.google.com/apis/consoleبمجرد إنشاء هذا، ستحصل على معرف يمكنك استخدامه في كائن GoogleCredential الخاص بك.من كائن GoogleCredential، يمكنك الحصول على رمز الوصول الذي يمكنك إضافته إلى طلبك.

ما قرأته هنا (محرك جوجل عبر حسابات الخدمة) هو أنك تستخدم نمطًا مختلفًا قليلاً يستخدم API KEY الذي تسترده من وحدة تحكم المطور.
كانت الأجزاء ذات الصلة بالنسبة لي هي إنشاء "مفتاح لتطبيقات الخادم"، ثم استخدام هذه التقنية، التي لم أقرأها أي مكان آخر!

      HttpTransport httpTransport = new NetHttpTransport();
  JsonFactory jsonFactory = new JacksonFactory();
  AppIdentityCredential credential =
      new AppIdentityCredential.Builder(DriveScopes.DRIVE).build();
  // API_KEY is from the Google Console as a server API key
  GoogleClientRequestInitializer keyInitializer =
      new CommonGoogleClientRequestInitializer(API_KEY);
  Drive service = new Drive.Builder(httpTransport, jsonFactory, null)
      .setHttpRequestInitializer(credential)
      .setGoogleClientRequestInitializer(keyInitializer)
      .build();

هذا إجابة يدعي أن:

لا يتم دعم حسابات الخدمة بواسطة محرك الأقراص SDK بسبب نموذج الأمان الخاص به.

إذا كان هذا لا يزال صحيحًا، فإن أحد الحلول هو إجراء رقصة OAuth عادية مرة واحدة باستخدام حساب Google عادي، والاستمرار في الوصول وتحديث الرمز المميز في مخزن البيانات.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top