Google通讯录API:存储身份验证代码并交换令牌

时间:2014-01-29 14:38:08

标签: api python-2.7 google-oauth google-contacts

我是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)

1 个答案:

答案 0 :(得分:0)

以下是一些处理Web服务器案例的示例代码。 send_redirect不是一种真正的方法,您需要先将用户重定向到Google,然后在回拨中交换一组凭据的授权码。

我还提供了一种使用gdata库返回的OAuth2凭据的方法,因为它看起来像是在访问Contacts 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)

另见Unifying OAuth handling between gdata and newer Google APIs

那就是说,看起来你的问题已经包含了大部分代码。希望这能为您提供一个更完整的例子来启动和运行。

进行测试 - 如果您只是想在等待剪切和粘贴代码时暂停Python解释器,我会选择code = raw_input('Code:')http://docs.python.org/2/library/functions.html#raw_input