4

目前我正在使用 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)

谢谢你。

4

1 回答 1

2

我对此的下意识反应是,如果您将字母 AES 输入到您的代码中,那么您做错了。或者,正如 redditor khafra 最近提醒我们西西里人的版本

哈哈..你这个笨蛋!您成为经典错误之一的受害者。最著名的是:永远不要卷入亚洲的陆战。但只是稍微不那么出名的是:当有一个经过良好测试的库会做得更好时,永远不要尝试推出自己的加密货币!

我的意思是,我明白了。我第一次看它时,oauth.py也没有给我留下深刻印象。从那以后有很多工作,它看起来更好,但似乎仍然没有测试,所以我不知道。无论如何,测试或不测试,它被更多的人审查和使用,而不是你的代码。

但这只是我对加密代码重用的主题很紧张,并不能真正帮助您弄清楚协议机制。对我来说这看起来不错,但我最近对 ​​OAuth 规范没有太多了解。

只需为该pu.port业务使用更多线路;在一行中包含一个条件if表达式、一个or表达式和结构真的很难阅读。{}[]

如果您真的希望熟悉该协议的人进行代码审查,您最好询问邮件列表。而且,如果您可以为他们提供一个替代 API,使他们的存储库中的代码对新用户更具吸引力,那对每个人都有好处。

于 2010-01-29T04:59:08.863 回答