检索与gdata.contacts.client和的oauth2接触(Retrieving cont

2019-07-30 07:39发布

我使用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??>>)

有人能帮忙吗?

Answer 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()

希望这有助于someoone!



Answer 2:

> Token类 - 假设你有代码更新的OAuth2.0的API的正确设置,你可以通过创建修改该证书转换头一个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()

请注意,此代码将无法处理令牌刷新,使用凭证手柄哪些代码。 在我自己的应用程序,这是可以接受的,使使用服务拨打电话获得接触之前刷新凭证的简单调用。



文章来源: Retrieving contacts with gdata.contacts.client and oauth2