我正在使用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??>>)
任何人都可以帮忙吗?
答案 0 :(得分:4)
我设法让这个工作。实际上它非常简单,我刚刚停止使用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()
希望这对某人有帮助!
答案 1 :(得分:1)
假设您有正确设置较新OAuth2.0 API的代码,您可以通过创建一个Token类来修改转换Credentials的标头 - &gt;令牌课。
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()
请注意,此代码不会处理令牌刷新,这些代码使用凭据句柄。 在我自己的应用程序中,可以使用服务进行简单的调用,以便在调用获取联系人之前刷新凭据。