oauth 谷歌使用 python

Posted

技术标签:

【中文标题】oauth 谷歌使用 python【英文标题】:oauth google using python 【发布时间】:2010-11-15 22:44:36 【问题描述】:

我对网络编程相当陌生。我想从头开始。 我试图在网上搜索,但最终完全糊涂了。 现在我想学习的是如何通过 python 脚本验证 google 帐户。 谁能给我一个代码片段或任何例子。

非常感谢。

【问题讨论】:

我一整天都在做同样的事情,希望尽快有工作。 【参考方案1】:

在过去几周的几次尝试失败后,我花了一整天的时间编写这个代码。这只能让你走到第一步,但它没有任何外部库。是的,我知道在 OP 之后已经快两年了,但据我所知,它仍然需要完成。


#!/usr/bin/python
'demo Google OAuth'
import sys, os, urllib, urllib2, time, httplib
import hmac, hashlib, random, re, base64
PARAMETERS = 
 'oauth_consumer_key': os.getenv('OAUTH_CONSUMER_KEY') or 'anonymous',
 'oauth_signature_method': 'HMAC-SHA1',
 'oauth_signature': '',
 'oauth_timestamp': os.getenv('OAUTH_TIMESTAMP') or '%d' % time.time(),
 'oauth_nonce': os.getenv('OAUTH_NONCE') or '%x' % random.getrandbits(64),
 'oauth_version': '1.0',
 'oauth_callback': os.getenv('OAUTH_CALLBACK') or 'callback',

SCOPE = 'scope': 'https://www.google.com/calendar/feeds/'
SECRET = os.getenv('OAUTH_CONSUMER_SECRET') or 'anonymous'
def google_oauth():
 'OAuthGetRequestToken, OAuthAuthorizeToken, OAuthGetAccessToken'
 request_token = get_request_token()
 return request_token
def get_request_token():
 'ask Google for a request token'
 url = 'https://www.google.com/accounts/OAuthGetRequestToken'
 token_secret = ''  # we don't have a token secret yet
 PARAMETERS['oauth_signature'] = sign('&'.join((SECRET, token_secret)),
  '&'.join(map(urlencode, ('GET', url, parameters('signing')))))
 body = urllib.urlencode(SCOPE)
 request = urllib2.Request(url + '?' + body)
 request.add_header('Authorization', 'OAuth ' + parameters('header'))
 opener = urllib2.build_opener(urllib2.HTTPSHandler(debuglevel = 1))
 response = opener.open(request)
 reply = response.read()
 response.close()
 return reply
def byte_encode(match):
 'for use with re.sub'
 return '%%%02X' % ord(match.group())
def urlencode(string):
 "unreserved = ALPHA, DIGIT, '-', '.', '_', '~'"
 return re.sub(re.compile('[^0-9A-Za-z._~-]'),
  byte_encode, string.encode('utf8'))
def sign(secret, text):
 print >>sys.stderr, 'signature base string: "%s", secret: %s' % (
  repr(text), repr(secret))
 digest = hmac.new(secret, text, hashlib.sha1).digest()
 return urlencode(base64.encodestring(digest).rstrip())
def base64string(hexstring):
 recoded = urlencode(base64.encodestring(hexstring.decode('hex')).rstrip())
 print >>sys.stderr, 'recoded:', recoded
 return recoded
def parameters(format):
 if format == 'header':
  formatted = ', '.join(['%s="%s"' % (key, value)
   for key, value in PARAMETERS.items()])
 elif format == 'signing':
  formatted = '&'.join(sorted(['%s=%s' % (key,
   urlencode(value.encode('utf8'))) for
   key, value in (PARAMETERS.items() + SCOPE.items()) if
   key not in ['oauth_signature']]))
 #print >>sys.stderr, format, formatted
 return formatted
def hmac_sha1_test():
 'from tools.ietf.org/html/rfc2202'
 assert sign('\x0b' * 20, 'Hi There') == base64string(
  'b617318655057264e28bc0b6fb378c8ef146be00')
 assert sign('Jefe', 'what do ya want for nothing?') == base64string(
  'effcdf6ae5eb2fa2d27416d5f184df9c259a7c79')
 assert sign('\xaa' * 20, '\xdd' * 50) == base64string(
  '125d7342b9ac11cd91a39af48aa17b4f63f175d3')
 # last test from http://oauth.net/core/1.0/#rfc.section.9.1.1, app. A.5.2
 assert sign('kd94hf93k423kf44&pfkkdhi9sl3r4s00',
  'GET&http%3A%2F%2Fphotos.example.net%2Fphotos&file%3Dvacation.jpg%26' + \
  'oauth_consumer_key%3Ddpf43f3p2l4k3l03%26oauth_nonce%3D' + \
  'kllo9940pd9333jh%26oauth_signature_method%3DHMAC-SHA1%26' + \
  'oauth_timestamp%3D1191242096%26oauth_token%3Dnnch734d00sl2jdk%26' + \
  'oauth_version%3D1.0%26size%3Doriginal') == urlencode(
   'tR3+Ty81lMeYAr/Fid0kMTYa/WM=')
 return True
if __name__ == '__main__':
 command = os.path.splitext(os.path.basename(sys.argv[0]))[0]
 print eval(command)(*sys.argv[1:])

将其保存为 google_oauth.py,您可以像这样链接到它:

ln -s google_oauth.py hmac_sha1_test.py
来测试任何子程序。结合环境变量的使用,您可以将您的结果与 Google 的 OAuth Playground 的结果进行比较(此处的其他人提供了链接)并查看您哪里出错了。我发现脚本有很多问题;可能还有更多。但是,如果您调用 ./google_oauth.py,您应该会看到如下内容: jcomeau@intrepid:~/rentacoder/marchie$ ./google_oauth.py 签名基本字符串:“'GET&HTTPS%3A%2F%2Fwww.google.com%2Faccounts%2FOAuthGetRequestToken&oauth_callback%3Dcallback%26oauth_consumer_key%3Danonymous%26oauth_nonce%3Da64720fda018906b%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1302253695%26oauth_version%3D1.0%26scope% 3Dhttps%253A%252F%252Fwww.google.com%252Fcalendar%252Ffeeds%252F'",秘密:'匿名&' 发送:'GET /accounts/OAuthGetRequestToken?scope=https%3A%2F%2Fwww.google.com%2Fcalendar%2Ffeeds%2F HTTP/1.1\r\n接受编码:身份\r\n主机:www.google.com\ r\n连接:关闭\r\n授权:OAuth oauth_nonce="a64720fda018906b", oauth_timestamp="1302253695", oauth_consumer_key="anonymous", oauth_signature_method="HMAC-SHA1", oauth_version="1.0", oauth_signature="LSJxopTFXWJc%1" , oauth_callback="callback"\r\n用户代理: Python-urllib/2.6\r\n\r\n' 回复:'HTTP/1.1 200 OK\r\n' 标题:内容类型:文本/纯文本;字符集=UTF-8 标题:日期:格林威治标准时间 2011 年 4 月 8 日星期五 09:08:20 标头:到期时间:格林威治标准时间 2011 年 4 月 8 日星期五 09:08:20 标头:缓存控制:私有,最大年龄 = 0 标头:X-Content-Type-Options:nosniff 标头:X-XSS-保护:1;模式=块 标头:内容长度:118 标头:服务器:GSE 标题:连接:关闭 oauth_token=4%2FfvSIWW9WBHXa_CjInpOf4FdNYhCj&oauth_token_secret=qhB1EGIKjL1pG9POF2ZOcQk3&oauth_callback_confirmed=true

【讨论】:

不错的构建内容。为了稍微清理一下,我认为request = opener.open(request) 中的分配应该是response = opener.open(request),并且响应应该替换随后两行中的请求 好点。很难说那天我脑子里在想什么。【参考方案2】:

上面有一些不错的链接(游乐场非常宝贵)。

我混合使用了 Leah Culver 的 oAuth 代码(b3rx 帖子中的示例)和 FireEagle's Python OAuth code。前者,我上次查看时,缺少范围方法。

另外,请确保您清楚自己是否使用2 or 3 legged OAuth:

【讨论】:

【参考方案3】:

很好的介绍: http://code.google.com/apis/accounts/docs/OAuth.html

很好的工作,可玩的例子:http://googlecodesamples.com/oauth_playground/

【讨论】:

【参考方案4】:

请参阅 Google 数据 API 文档中的文档:

Getting Started with the Google Data Python Library

“Hello World”下有一个 ClientLogin 示例。

【讨论】:

【参考方案5】:

试试这个example

【讨论】:

以上是关于oauth 谷歌使用 python的主要内容,如果未能解决你的问题,请参考以下文章

谷歌应用引擎 oauth2 提供商

用于谷歌 API 访问的 Oauth2 似乎依赖于请求 Python 任务的用户 ID

护照谷歌oauth和护照谷歌令牌有啥区别?

如何检查用户是不是使用“谷歌登录”(OAuth 2.0)登录

如何检查用户是不是使用“谷歌登录”(OAuth 2.0)登录

护照-谷歌-oauth 无法注销用户