目前我正在使用 OAuth 协议连接 Twitter API 并用 Python 编写代码。作为大多数用户,我认为规范中最困难的部分是处理签名。
在网上四处寻找解决方案后,我决定使用我的自定义代码,以便更好地了解正在发生的事情。
为了其他用户,我在这里发布了一个非常简单且简短的 Python SHA1 签名规范实现:
import hmac
from hashlib import sha1
from urllib import quote, urlencode
from base64 import b64encode
from urlparse import urlparse
def sign_request_sha1(url,method,data,secret=""):
pu = urlparse(urlparse(url).geturl())
normUrl = "%s://%s%s%s" % (
pu.scheme,
pu.hostname,
"" if not pu.port or {"http":80,"https":443}[pu.scheme] == pu.port else ":%d" % pu.port,
pu.path,
)
names = data.keys()
names.sort()
sig = "%s&%s&%s" % (
method.upper(),
quote(normUrl,''),
quote("&".join(["%s=%s" % (k,quote(data[k].encode('utf-8'),'')) for k in names]),''),
)
key = "%s&%s" % (quote(CONSUMER_SECRET.encode('utf-8'),''),secret)
return b64encode(hmac.new(key,sig,sha1).digest())
该函数的输入参数为:
- url:您将为特定 OAuth 请求调用的 url。
- 方法:这必须是“GET”或“POST”,具体取决于您将如何发出请求。
- 数据:包含请求的所有参数的字典,包括任何自定义参数,但不包括“oauth_signature”参数(出于显而易见的原因)。
- 秘密:您在协议初始阶段收到的秘密令牌。
我用 Twitter 对其进行了测试,它似乎可以工作,但我想收到一些关于错误、改进等的评论。
最后,您可以在此处找到一段代码,该代码调用了初始“请求令牌”阶段的代码:
from random import getrandbits
from base64 import b64encode
from time import time
def twitter_request_token(req,callback,errback):
req_url="http://twitter.com:80/oauth/request_token"
data = { \
"oauth_consumer_key" : CONSUMER_KEY,
"oauth_nonce" : b64encode("%0x" % getrandbits(256))[:32],
"oauth_timestamp" : str(int(time())),
"oauth_signature_method" : "HMAC-SHA1",
"oauth_version" : "1.0",
"oauth_callback" : "http://localhost:8080/",
}
data["oauth_signature"] = sign_request_sha1(req_url,"GET",data)
谢谢你。