2015-11-03 2 views
3

Я хочу создать приложение, которое имеет легкие взаимодействия с хранилищем google, то есть файлы списка в ведро, загрузку файла и загрузку файла.аутентификация для Google Storage с использованием Python

После того, как this tutorial, я решил использовать учетную запись службы (а не пользовательскую) для аутентификации и следовать процедуре. Я создал открытый/закрытый ключ на консоли и загрузил ключ на моем компьютере. Затем я создал файл .boto, который указывает на этот частный ключ, и, наконец, запустил эту программу, и она работала:

import boto 
import gcs_oauth2_boto_plugin 


uri = boto.storage_uri('txxxxxxxxxxxxxx9.appspot.com', 'gs') 

for obj in uri.get_bucket(): 
    print '%s://%s/%s' % (uri.scheme, uri.bucket_name, obj.name) 

Как вы можете видеть, пакет gcs_oauth2_boto_plugin не используется в коде, так что я решил получить Избавься от этого. Но волшебно, когда я комментировать import gcs_oauth2_boto_plugin строку и запустить программу еще раз, я получаю эту ошибку:

C:\Users\...\Anaconda3\envs\snakes\python.exe C:/Users/.../Dropbox/Prog/s3_manifest_builder/test.py 
Traceback (most recent call last): 
    File "C:/Users/.../Dropbox/Prog/s3_manifest_builder/test.py", line 10, in <module> 
    for obj in uri.get_bucket(): 
    File "C:\Users\...\Anaconda3\envs\snakes\lib\site-packages\boto\storage_uri.py", line 181, in get_bucket 
    conn = self.connect() 
    File "C:\Users\...\Anaconda3\envs\snakes\lib\site-packages\boto\storage_uri.py", line 140, in connect 
    **connection_args) 
    File "C:\Users\...\Anaconda3\envs\snakes\lib\site-packages\boto\gs\connection.py", line 47, in __init__ 
    suppress_consec_slashes=suppress_consec_slashes) 
    File "C:\Users\...\Anaconda3\envs\snakes\lib\site-packages\boto\s3\connection.py", line 190, in __init__ 
    validate_certs=validate_certs, profile_name=profile_name) 
    File "C:\Users\...\Anaconda3\envs\snakes\lib\site-packages\boto\connection.py", line 569, in __init__ 
    host, config, self.provider, self._required_auth_capability()) 
    File "C:\Users\...\Anaconda3\envs\snakes\lib\site-packages\boto\auth.py", line 987, in get_auth_handler 
    'Check your credentials' % (len(names), str(names))) 
boto.exception.NoAuthHandlerFound: No handler was ready to authenticate. 1 handlers were checked. ['HmacAuthV1Handler'] Check your credentials 

Так что мои вопросы:

1-, как вы можете объяснить, что удаление импорта, который не используется в коде это не получается?

2 в целом, чтобы понять процесс аутентификации, если я хочу запустить свое приложение на машине, я обязательно должен иметь .boto-файл (который указывает на закрытый ключ моей учетной записи службы) ранее? Или есть более чистый/более простой способ предоставить доступ к моему приложению в Google Storage для взаимодействия/выхода?

Например, я должен предоставить публичный и закрытый ключ в качестве строк для моей программы, когда я хочу подключиться к ведро S3 с помощью boto. Мне не нужно создавать .boto-файл, импортировать пакеты и т. Д., Что делает его намного проще в использовании, не так ли?

ответ

1

1- how can you explain that deleting an import which IS NOT USED in the code makes it fail?

Первый намек на то, что модуль назван «плагином», хотя точно так же, как это реализовано, не ясно на поверхности. Интуитивно понятно, что не импортирование модуля приведет к исключению такого рода. Первоначально я думал, что это была плохая практика выполнения активности с состоянием в глобальном масштабе в течение init импорта этого модуля. В некотором роде это то, что было, но только потому, что иерархии классов являются «состояниями» в метапрограммируемом питоне.

Получается, что, как и во многих случаях, проверка местоположения, из которого была выбрана stacktrace (boto.auth.get_auth_handler()), является ключом к пониманию проблемы.

(см связанный источник для комментировал версии)

def get_auth_handler(host, config, provider, requested_capability=None): 
    ready_handlers = [] 
    auth_handlers = boto.plugin.get_plugin(AuthHandler, requested_capability) 
    for handler in auth_handlers: 
     try: 
      ready_handlers.append(handler(host, config, provider)) 
     except boto.auth_handler.NotReadyToAuthenticate: 
      pass 

    if not ready_handlers: 
     checked_handlers = auth_handlers 
     names = [handler.__name__ for handler in checked_handlers] 
     raise boto.exception.NoAuthHandlerFound(
      'No handler was ready to authenticate. %d handlers were checked.' 
      ' %s ' 
      'Check your credentials' % (len(names), str(names))) 

Примечание ссылка на класс AuthHandler, который определен в boto.auth_handler.

Таким образом, вы можете видеть, что мы должны смотреть на содержание boto.plugin.get_plugin(AuthHandler, requested_capability):

def get_plugin(cls, requested_capability=None): 
    if not requested_capability: 
     requested_capability = [] 
    result = [] 
    for handler in cls.__subclasses__(): 
     if handler.is_capable(requested_capability): 
      result.append(handler) 
    return result 

Таким образом, становится ясно, наконец, в конце концов, когда мы видим, что определение класса класса OAuth2Auth в gcs_oauth2_boto_plugin.oauth2_plugin, в котором он объявлен как подкласс boto.auth_handler.AuthHandler, сигнализации ее возможности AUTH в рамках Boto с помощью следующей переменной-члена:

capability = ['google-oauth2', 's3'] 

2- more generally, to be sure to understand the authentification process, if I want to run my app on a machine, I must be sure to have the .boto file (which points to my service account private key) generated previously? Or is there a cleaner/easier way to give access to my application to Google Storage for in/out interactions?

Это более обобщенный ответ: вы можете использовать .boto-файл, хотя вы также можете использовать учетные данные учетной записи службы, и вы даже можете использовать REST API и пройти через поток oauth2, чтобы получить токены, необходимые для отправки в заголовке авторизации. Различные методы аутентификации в облаке хранятся в документации. В учебнике/документе, который вы указали, показаны некоторые методы, вы использовали .boto для другого метода. Вы можете прочитать о API REST Cloud Storage (JSON) here, и вы можете прочитать о потоках pauton oauth2 различных видов here.

Смежные вопросы