4

現在、OAuth プロトコルを使用して Twitter API に接続し、Python でコードを記述しています。そこにいるほとんどのユーザーと同様に、仕様の最も難しい部分は署名を扱うことだと思います.

解決策を求めて Web をさまよった後、何が起こっているのかをよりよく理解するために、カスタム コードを使用することにしました。

他のユーザーのために、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。
  • method: リクエストの発行方法に応じて、「GET」または「POST」にする必要があります。
  • data: 要求のすべてのパラメーターを含む辞書。カスタム引数は含まれますが、"oauth_signature" は除外されます (明らかな理由により)。
  • secret: プロトコルの初期段階で受け取ったシークレット トークン。

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

これに対する私のひざまずく反応は、If You're Typing The Letters AES Into Your Code, You're Doing It Wrongです。または、redditor khafra が最近、シチリアのバージョンを思い出させてくれたように:

ハハ.. バカ!あなたは古典的な失策の犠牲になりました。最も有名なのは、「アジアで地上戦に巻き込まれるな」です。しかし、これは少し有名ではありませんが、よくテストされたライブラリがあれば、自分の暗号をロールしようとしないでください。

つまり、わかりました。初めて見たときは、oauth.pyも印象に残りませんでした。それ以来、多くの作業が行われ、見栄えは良くなっていますが、まだテストがないように見えるので、わかりません. とにかく、テストの有無にかかわらず、コードよりも多くの人々によってレビューされ、使用されています。

しかし、それは私が暗号コードの再利用に関して緊張しているだけであり、プロトコル機構を理解するのに実際には役立ちません. 私には問題ないように見えますが、最近は OAuth 仕様にあまり頭を悩ませていません。

pu.portそのビジネスにはもう少し回線を使用してください。条件if式、or式、および{}[]構文がすべて 1 行にあると、非常に読みにくくなります。

プロトコルに詳しい人によるコード レビューがどうしても必要な場合は、メーリング リストに問い合わせた方がよいでしょう。また、リポジトリ内のコードを新しいユーザーにとってより魅力的なものにする代替 API を提供できれば、それは誰にとっても良いことです。

于 2010-01-29T04:59:08.863 に答える