2013-06-17 24 views
7

negli ultimi due giorni (durante l'ora dispari che posso spendere per questo progetto), ho avuto difficoltà a iniziare a utilizzare Google Drive API con un account di servizio in GAE python, per il debugging locale.Utilizzo dell'API di Google Drive con account di servizio nel progetto python di Google Apps Engine con debug locale

La mia configurazione:

  • Eclipse 4.4
  • Google App Engine SDK per Python 1.8.0
  • Google client API Python GAE 1,1

Ho attivato (tra gli altri) queste librerie di terze parti in app.yaml:

- name: pycrypto 
    version: latest 
- name: ssl 
    version: latest 
.210

Questo è quello che ho capito sulla configurazione sofar, in un paio di dichiarazioni:

  • perché la mia applicazione non ha bisogno di accedere ai file degli utenti, ma un file che è specifico per l'applicazione, l'applicazione dovrebbe utilizzare un account di servizio per possedere e accedere al file su Google Drive
  • account di servizio possono autenticarsi in due modi: (1) tramite chiave API e (2) con credenziali di chiave privata
  • durante lo sviluppo di un'app GAE utilizzando l'SDK , ci sono due ambienti da tenere in considerazione: il sistema locale (per il debug) e il server GAE (per la distribuzione)
  • autenticazione della chiave API non funziona (e non funzionerà mai) durante l'esecuzione sul sistema locale, a causa della autenticazione a due zampe (non completamente afferrare questo ..., ma sembra vero)

voglio davvero il funzionalità di debugging locale, perché sto imparando Python e sto imparando l'interfaccia di google drive, quindi il debugging sul server è un grande onere.

Quindi ho bisogno di ottenere le credenziali della chiave privata che funzionano sul sistema locale. Ma poi mi imbatto nel problema "ImportError: impossibile importare il nome SignedJwtAssertionCredentials". Ho provato quasi tutto ciò che ho trovato sul web:

  • utilizzando il runtime di Python 2.7 e abilitare la libreria pycrypto
  • riqualificazione google-api-python-client-gae a 1.1 (che include questa correzione)
  • installato OpenSSL sul mio sistema (ma probabilmente non riuscirà a impostare i percorsi di destra)
  • istruzioni di lettura per installare pycrypto a livello locale, ma assunti erano obsolete

=> la mia prima domanda, solo per understan d, è: è possibile eseguire l'autenticazione sul tuo sistema locale dall'SDK di GAE all'API di Google Drive utilizzando Python? Forse la risposta è semplicemente "no"?

=> se la risposta fosse "sì", ci sarebbe un esempio di esempio di configurazione e codice per mostrare il modo per ottenere questa autenticazione locale?

=> il log degli errori (sotto) sembra suggerire che c'è ancora un problema con pycrypto non essere disponibile, ma i documenti dicono esplicitamente che è incluso nell'ambiente di runtime GAE Python 2.7.

=> forse (si prega di confermare) Sono confuso dalla differenza tra installazione locale e server python. Quando guardo in Eclipse nel PYTHONPATH "Esegui locale", include (1) le mie cartelle di progetto, (2) le cartelle google-api-client-python-gae (che non sembrano includere pycrypto !!), mentre il runtime di GAE fa --- qual è la differenza? e (3) la mia distribuzione Python 2.7 locale. Quindi cosa manca in questa configurazione locale che ho bisogno di imitare la configurazione del server per avviare il debug?

Questo è il mio codice per l'autenticazione utilizzando le credenziali chiave privata:

from oauth2client.client import SignedJwtAssertionCredentials 
f = file(SERVICE_ACCOUNT_PKCS12_FILE_PATH, 'rb') 
key = f.read() 
f.close() 
credentials = SignedJwtAssertionCredentials(SERVICE_ACCOUNT_EMAIL, key, scope=OAUTH_SCOPE) 
http = httplib2.Http() 
http = credentials.authorize(http) 
return build('drive', 'v2', http=http) 

Questo mio log di errore:

ERROR 2013-06-18 00:59:57,562 dev_appserver_import_hook.py:1251] Third party package Crypto was enabled in app.yaml but not found on import. You may have to download and install it. 
ERROR 2013-06-18 00:59:59,255 dev_appserver_import_hook.py:1251] Third party package Crypto was enabled in app.yaml but not found on import. You may have to download and install it. 
ERROR 2013-06-18 00:59:59,289 webapp2.py:1552] import_string() failed for 'illustrations.SyncHandler'. Possible reasons are: 

- missing __init__.py in a package; 
- package or module path not included in sys.path; 
- duplicated package or module name taking precedence in sys.path; 
- missing module, class, function or variable; 

Original exception: 

ImportError: cannot import name SignedJwtAssertionCredentials 

Debugged import: 

- 'illustrations' not found. 
Traceback (most recent call last): 
    File "C:\Program Files (x86)\Google\google_appengine\lib\webapp2-2.5.2\webapp2.py", line 1535, in __call__ 
    rv = self.handle_exception(request, response, e) 
    File "C:\Program Files (x86)\Google\google_appengine\lib\webapp2-2.5.2\webapp2.py", line 1529, in __call__ 
    rv = self.router.dispatch(request, response) 
    File "C:\Program Files (x86)\Google\google_appengine\lib\webapp2-2.5.2\webapp2.py", line 1272, in default_dispatcher 
    self.handlers[handler] = handler = import_string(handler) 
    File "C:\Program Files (x86)\Google\google_appengine\lib\webapp2-2.5.2\webapp2.py", line 1850, in import_string 
    return getattr(__import__(module, None, None, [obj]), obj) 
    File "C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\dev_appserver_import_hook.py", line 692, in Decorate 
    return func(self, *args, **kwargs) 
    File "C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\dev_appserver_import_hook.py", line 1766, in load_module 
    return self.FindAndLoadModule(submodule, fullname, search_path) 
    File "C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\dev_appserver_import_hook.py", line 692, in Decorate 
    return func(self, *args, **kwargs) 
    File "C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\dev_appserver_import_hook.py", line 1630, in FindAndLoadModule 
    description) 
    File "C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\dev_appserver_import_hook.py", line 692, in Decorate 
    return func(self, *args, **kwargs) 
    File "C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\dev_appserver_import_hook.py", line 1577, in LoadModuleRestricted 
    description) 
    File "C:\Users\vic\Dropbox\Development\Eclipse-juno-workspace\Missale\src\illustrations.py", line 6, in <module> 
    import drive 
    File "C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\dev_appserver_import_hook.py", line 692, in Decorate 
    return func(self, *args, **kwargs) 
    File "C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\dev_appserver_import_hook.py", line 1766, in load_module 
    return self.FindAndLoadModule(submodule, fullname, search_path) 
    File "C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\dev_appserver_import_hook.py", line 692, in Decorate 
    return func(self, *args, **kwargs) 
    File "C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\dev_appserver_import_hook.py", line 1630, in FindAndLoadModule 
    description) 
    File "C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\dev_appserver_import_hook.py", line 692, in Decorate 
    return func(self, *args, **kwargs) 
    File "C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\dev_appserver_import_hook.py", line 1577, in LoadModuleRestricted 
    description) 
    File "C:\Users\vic\Dropbox\Development\Eclipse-juno-workspace\Missale\src\drive.py", line 6, in <module> 
    from oauth2client.client import SignedJwtAssertionCredentials 
ImportStringError: import_string() failed for 'illustrations.SyncHandler'. Possible reasons are: 

- missing __init__.py in a package; 
- package or module path not included in sys.path; 
- duplicated package or module name taking precedence in sys.path; 
- missing module, class, function or variable; 

Original exception: 

ImportError: cannot import name SignedJwtAssertionCredentials 

Debugged import: 

- 'illustrations' not found. 

[update] rivedere la mia domanda, penso che avrò bisogno di a dare un'occhiata più da vicino all'installazione di pycrypto localmente. Se questa è la soluzione, fornirò un feedback su this article per richiedere l'aggiunta di una nota sulle discrepanze tra le librerie di runtime del server GAE e le librerie SDK locali. E aggiungerò qui le istruzioni di installazione.

[update2] il problema di importazione SignedJwtAssertionCredentials era scomparso, ma un altro problema di importazione si è verificato nel pacchetto tlslite. Non avevo idea di come risolvere questo problema, perché l'importazione sembrava perfettamente sana, e ho fatto ricorso alla riconfigurazione dell'intero IDE da zero. Ora ho installato another precompiled pycrypto library e ho seguito il suggerimento nel messaggio di errore e convertito il mio file di chiave privata .p12 in un file .pem. Si noti che il file .pem creato da openssl conteneva 4 righe di testo prima del "----- BEGIN", che dovevo rimuovere manualmente in modo che il file .pem fosse riconosciuto da oauth2client!

[update3] quando si riconfigura l'IDE da zero, ho trascurato di utilizzare "old_dev_appserver.py" per eseguire l'app localmente, invece di "dev_appserver.py". The latter will not enable breakpoints! Ma sembra che abbia qualcosa a che fare con il problema di importazione SignedJwtAssertionCredentials. Utilizzando 'dev_appserver.py', non ho il problema di importazione (ma nessun breakpoint), e usando 'old_dev_appserver.py', posso riprodurre il problema dell'importazione. Quindi il 'old_dev_appserver.py' potrebbe aver fatto parte del problema da sempre!

+0

[doc dicendo sull'utilizzo degli account di servizio] (https://developers.google.com/api-client-library/python/guide/google_app_engine#ServiceAccounts) – vicmortelmans

+0

[doc con due metodi di autenticazione dell'account di servizio] (https://developers.google.com/drive/service-accounts) – vicmortelmans

+0

[problema simile con la correzione che non sembra risolvere nulla per me] (http://stackoverflow.com/questions/12823366/using-appidentitycredential-with-google -drive-api) – vicmortelmans

risposta

1

Sì, è possibile utilizzare SignedJwtAssertionCredentials per connettersi ai servizi di Google. Ho scritto un codice che lo fa contemporaneamente e funziona alla grande. Usare quella classe è un problema. Su GAE viene fornita la libreria PyCrypto come hai scritto, ma su locale devi installarla manualmente. GAE ha la sua versione modificata di questa libreria in modo che non forniscano il suo codice sorgente. Il secondo problema con quella libreria è che è compilata per una macchina specifica che la utilizzerà. Se guardi nel codice sorgente di quella classe, vedrai che ha bisogno di alcune dipendenze per funzionare. Se non soddisfano i requisiti di quella classe, non sarà accessibile dal codice esterno.

Informazioni sui problemi con l'importazione nel vecchio e nuovo dev_server non riesco a scrivere nulla perché non ne so nulla.

Problemi correlati