pshikoro's blog

休日プログラミング

OAuth1.0の署名(Signature)をPythonで生成してみた

経緯

はてなのブログ投稿APIを叩こうと思ったから

そもそもOAuthとは

以下のサイトによくまとまっている。

ゼロから学ぶOAuth【gihyo.jp】 OAuthとは何か【暇なメモ帳】

Signatureの生成方法

作成方法は以下を参考にした OAuth1.0の署名(Signature)を作成する方法

材料

キーの材料 * Consumer secret (client_secret) * Token secret (resource_owner_secret)

データの材料 * Request method * Request URL * Parameter

上のParameterは、リクエストヘッダに記載するAuthorizationパラメータのうちoauthで始まる値及びBodyに記載したデータのこと

たとえばはてなブログのリクエストトークンを取得するリクエストヘッダは以下のとおり

# HTTPS
POST /oauth/initiate HTTP/1.1
Host: www.hatena.com
Authorization: OAuth realm="",
    oauth_callback="oob",
    oauth_consumer_key="yTVGWKqa6OiH5A%3D%3D",
    oauth_nonce="0c670efea71547422662",
    oauth_signature="lvQC7AXTRIaqxbjwVGgPlYuNaaw%3D",
    oauth_signature_method="HMAC-SHA1",
    oauth_timestamp="1291689730",oauth_version="1.0"
Content-Type: application/x-www-form-urlencoded
Content-Length: 33

scope=read_public%2Cread_private

この場合以下の値を材料として用いる + oauth_callback="oob", + oauth_consumer_key="yTVGWKqa6OiH5A%3D%3D", + oauth_nonce="0c670efea71547422662", + oauth_signature="lvQC7AXTRIaqxbjwVGgPlYuNaaw%3D", + oauth_signature_method="HMAC-SHA1", + oauth_timestamp="1291689730" + oauth_version="1.0" + scope=read_public%2Cread_private

なおnonceは適当な文字列なのでなんでもよい。

以下はてなのOAuth認を題材にsignatureキーの生成をPythonで行うコード

なおPtynonにはrequestsという便利なライブラリがあるのでそれを使うのが一番早い