Google Contacts API: хранение кода авторизации и обмен на токен

Я новичок в Python и новичок в работе с API, так что это, вероятно, просто... Я могу сделать свой первоначальный запрос, который вызывает открытие окна браузера. В этот момент пользователь должен сделать свой выбор на странице согласия Google. После этого возвращается код авторизации... Я все понял. Мой вопрос: как мне приостановить выполнение моего кода Python, чтобы я мог дождаться разрешения пользователя и сохранить код, который мне нужен для следующего шага? Я просто тестирую его в Python 2.7, используя их библиотеки, но я застрял на этом этапе. Что можно поставить на стрелку? Цените любую помощь.

    from oauth2client.client import OAuth2WebServerFlow
    import webbrowser

    flow = OAuth2WebServerFlow(client_id=[id],
                       client_secret=[secret],
                       scope='https://www.google.com/m8/feeds',
                       redirect_uri='urn:ietf:wg:oauth:2.0:oob')

    auth_uri = flow.step1_get_authorize_url()
    webbrowser.open(auth_uri)

--->

    code=''
    credentials = flow.step2_exchange(code)

person RAW    schedule 29.01.2014    source источник


Ответы (1)


Вот пример кода, обрабатывающего это для случая веб-сервера. send_redirect не является реальным методом, вам нужно сначала перенаправить пользователя в Google, а затем в обратном вызове заменить код авторизации на набор учетных данных.

Я также включил способ использования учетных данных OAuth2, возвращаемых библиотекой gdata, поскольку похоже, что вы обращаетесь к API контактов:

from oauth2client.client import flow_from_clientsecrets

flow = flow_from_clientsecrets(
  "/path/to/client_secrets.json",
  scope=["https://www.google.com/m8/feeds"],
  redirect_url="http://example.com/auth_return"
)

# 1. To have user authorize, redirect them:
send_redirect(flow.step1_get_authorize_url())

# 2. In handler for "/auth_return":
credentials = flow.step2_exchange(request.get("code"))

# 3. Use them:

import gdata.contacts.client
import httplib2

# Helper class to add headers to gdata
class TokenFromOAuth2Creds:
  def __init__(self, creds):
    self.creds = creds
  def modify_request(self, req):
    if self.creds.access_token_expired or not self.creds.access_token:
      self.creds.refresh(httplib2.Http())
    self.creds.apply(req.headers)

# Create a gdata client
gd_client = gdata.contacts.client.ContactsClient(source='<var>YOUR_APPLICATION_NAME</var>')

# And tell it to use the same credentials
gd_client.auth_token = TokenFromOAuth2Creds(credentials)

См. также Унификация обработки OAuth между gdata и более новыми API Google

Тем не менее, похоже, что у вас уже есть большая часть этого кода в вашем вопросе. Надеюсь, это даст вам более полный пример для начала работы.

Для тестирования — если вы просто хотите приостановить интерпретатор Python, ожидая вырезания и вставки кода, я бы выбрал code = raw_input('Code:') (http://docs.python.org/2/library/functions.html#raw_input)

person aeijdenberg    schedule 29.01.2014
comment
На самом деле он основан на веб-сервере, но я тестировал без настройки веб-сервера, поэтому у меня действительно нет способа сохранить код, добавленный к моему перенаправлению. Я использовал перенаправление установленного приложения в качестве последнего усилия, которое, я думаю, в любом случае не имеет смысла. Есть ли эквивалентная библиотека для веб-приложения? - person RAW; 29.01.2014