【问题标题】:Retrieving contacts with gdata.contacts.client and oauth2使用 gdata.contacts.client 和 oauth2 检索联系人
【发布时间】:2012-07-08 01:18:33
【问题描述】:

我正在使用 oAuth2WebServerFlow 获取 oAuth 访问令牌,然后检索用户联系人列表。我使用 web2py 作为 web 框架。

    flow = oauth2client.client.OAuth2WebServerFlow(client_id=CLIENT_ID,
                                                   client_secret=CLIENT_SECRET,
                                                  scope='https://www.google.com/m8/feeds', 
                                                   user_agent=USER_AGENT)
    callback = 'http://127.0.0.1:8000/Test/searcher/oauth2callback'
    authorise_url = flow.step1_get_authorize_url(callback)
    session.flow = pickle.dumps(flow)
    redirect(authorise_url) 

然后按如下方式处理重定向

flow = pickle.loads(session.flow)
credentials = flow.step2_exchange(request.vars) 

我的问题是如何将上面返回的 OAuth2Credentials 对象更改为 OAuth2AccessToken 对象,然后我可以使用它来授权对联系人库的请求,例如:

gc = gdata.contacts.client.ContactsClient(source="")
token.authorize(gc)
gc.GetContacts

我尝试了各种方法都没有成功,通常会收到“无效授权”的 oAuth2AccessTokenError 消息。我在想这样的事情可能会奏效,但也认为必须有更简单的方法!

token = gdata.gauth.OAuth2Token(client_id=CLIENT_ID, client_secret=CLIENT_SECRET, scope='https://www.google.com/m8/feeds', user_agent=USER_AGENT)

    token.redirect_uri = 'http://127.0.0.1:8000/Test/searcher/oauth2callback'
    token.get_access_token(<<code to pass the access_token out of the Credentials object??>>)

有人可以帮忙吗?

【问题讨论】:

    标签: python oauth-2.0 gdata-api


    【解决方案1】:

    我设法让这个工作。实际上这很简单,我刚刚停止使用 OAuth2WebServerFlow,无论如何它似乎并没有增加太多价值。所以新代码如下所示:

    token = gdata.gauth.OAuth2Token(client_id, client_secret, scope, ua)
    session.token = pickle.dumps(token)                   
    redirect(token.generate_authorize_url(redirect_uri='http://127.0.0.1:8000/Test/default/oauth2callback'))
    

    紧随其后

    def oauth2callback():
        token = pickle.loads(session.token)
        token.redirect_uri='http://127.0.0.1:8000/Test/default/oauth2callback'
        token.get_access_token(request.vars.code)
        gc = gdata.contacts.client.ContactsClient(source='')
        gc = token.authorize(gc)
        feed = gc.GetContacts()
    

    希望这对某人有帮助!

    【讨论】:

      【解决方案2】:

      假设您正确设置了较新的 OAuth2.0 API 的代码,您可以通过创建一个 Token 类来修改转换 Credentials -> Token 类的标头来实现此功能。

      OAUTH_LABEL='OAuth '
      
      #Transforms OAuth2 credentials to OAuth2 token.
      class OAuthCred2Token(object):
      
          def __init__(self, token_string):
              self.token_string = token_string
      
          def modify_request(self, http_request):
              http_request.headers['Authorization'] = '%s%s' % (OAUTH_LABEL,
                                                                self.token_string)
      
          ModifyRequest = modify_request
      

      你可以如下测试:

      gc = gdata.contacts.client.ContactsClient(source='')
      token = OAuthCred2Token(creds.access_token)
      gc.auth_token = token
      print gc.GetContacts()
      

      请注意,此代码不会处理令牌刷新,该代码使用凭据处理。 在我自己的应用程序中,可以使用服务进行简单调用以在调用获取联系人之前刷新凭据。

      【讨论】:

        猜你喜欢
        • 2012-06-12
        • 1970-01-01
        • 1970-01-01
        • 2017-01-04
        • 1970-01-01
        • 2011-12-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多