1

我正在尝试在 Python 中访问 OAuth2(代码与http://code.google.com/p/google-api-ads-python/source/browse/trunk/examples/adspygoogle/adwords/v201302/misc/相同使用_oauth2.py?spec=svn139&r=139 ):

flow = OAuth2WebServerFlow(client_id='XXX',
      client_secret='YYY',          
      scope='https://adwords.google.com/api/adwords',
      user_agent='ZZZ')

authorize_url = flow.step1_get_authorize_url('urn:ietf:wg:oauth:2.0:oob')        

    code = raw_input('Code: ').strip()        
    credential = None
    try:
        credential = flow.step2_exchange(code) #<- error
    except FlowExchangeError, e:
        sys.exit('Authentication has failed: %s' % e)

这会在 step2_exchange 处产生“socket.error: [Errno 10054]”错误,并且 Python 会切断确切的消息。因此,在使用 OAuthplayground 检查密钥(以获得更好的错误消息)后,我得到了这个错误:

HTTP/1.1 400 Bad Request
Content-length: 37
X-xss-protection: 1; mode=block
X-content-type-options: nosniff
X-google-cache-control: remote-fetch
-content-encoding: gzip
Server: GSE
Via: HTTP/1.1 GWA
Pragma: no-cache
Cache-control: no-cache, no-store, max-age=0, must-revalidate
Date: Thu, 06 Jun 2013 13:54:29 GMT
X-frame-options: SAMEORIGIN
Content-type: application/json
Expires: Fri, 01 Jan 1990 00:00:00 GMT

{
  "error" : "unauthorized_client"
}

我检查了 client_id (用于已安装的应用程序)和 client_secret 是否与 Google API 控制台(https://code.google.com/apis/console/)中指定的相同。

如果我在 OAuthPlayground 上完成整个过程,它将起作用,但如果我尝试使用由游乐场创建的令牌,则应用程序也会失败。

任何人都知道如何解决它?

4

2 回答 2

1

修复。我在一个代理后面,它让 step1 Auth 通过但显然不是 step2 auth。所以一个简单的

h = httplib2.Http(proxy_info = httplib2.ProxyInfo PROXY DATA .....)
flow.step2_exchange(code, h)

修复。

于 2013-06-10T07:17:44.290 回答
1

https://code.google.com/p/httplib2/wiki/Examples中有一个关于如何在 httplib2 中配置 proxy_info 的示例

其中说:

import httplib2
import socks

httplib2.debuglevel=4
h = httplib2.Http(proxy_info = httplib2.ProxyInfo(socks.PROXY_TYPE_HTTP, 'localhost', 8000))
r,c = h.request("http://bitworking.org/news/")

但是,我发现最新的 httplib2 附带了一个清理过的 socks 模块,因此您真的想做更多类似的事情:

import httplib2
ht = httplib2.Http(proxy_info = httplib2.ProxyInfo(httplib2.socks.PROXY_TYPE_HTTP, 'name_or_ip_of_the_proxy_box', proxy_port)
flow.step2_exchange(code, ht)

此外,您希望使用 oauth2client >= 1.0beta8 的版本,这需要 httplib2 >= 0.7.4 的版本,这是在两个软件包中清除对 HTTP 代理的支持的地方。

于 2013-09-06T21:09:19.083 回答