OAuth)最近、色んなサービスの認証シーンでOAuthをよく見かけます。Twitterのアカウントを使って、全く別のマッシュアップサービスを使うような場合に使われていて、ユーザの予期せぬ権限委譲が話題にもなりましたね。Userの3者間で認証を行うものだと思っていたのですが、実はProviderとConsumerの2者間での認証に使われる場合もあります。Requestと呼ばれているようです。ここでは後者の認証をpythonでやります。OAuthは署名アルゴリズムにHMAC-SHA1を使っているものとします。(他のアルゴリズムの場合はサーバ側でのリクエストの検証フローが違います。OAuthはただの公開鍵共通鍵認証です。OAuthはただの公開鍵共通鍵認証なので、以下の手順で行います。パラメータに公開鍵を含めて、HTTPリクエストの組み立て1を元に秘密鍵で署名を作成1に2を加えて送信するとサーバでは送られてきた署名と公開鍵から、リクエストが有効かどうかを判断します。以下の手順でリクエストが有効かどうかを判断します。秘密鍵とHTTPリクエストからクライアントでも行った署名の作成を行う2の署名をクライアントから送られた署名と比較するProviderが不正なリクエストをはじく為に使われる訳ですね。Userを守るのではなく、Providerの自己防衛の為の仕組みなので、Consumerからしたら何も嬉しくないですが、MixiモバイルやYQLを初めとしてメジャーなサービスにも浸透してきています。実際に先ほどの処理手順を実装する訳ですが、各言語用に軽いライブラリが用意されているのでそれを使います。oauth面倒な署名の作成等はライブラリがやってくれるので簡単です。リクエストに署名する時に暗号化に使うアルゴリズムを選択できますが,大抵HMAC_SHA1で良いようです。OAuthなんて大げさな名前に腰が引けそうになりますが,ただの公開鍵共通鍵認証でした(3回目)。02:19ritou様よりご指摘を頂きまして、公開鍵認証だと騒いでたのを共通鍵認証に修正しました。それに伴い誤解していたサーバ側でのリクエストの検証手順も修正しました。署名アルゴリズムはHMAC-SHA1に限定する文を追加しました。3度も強調した部分が間違っていて大変恥ずかしいです。これを書いた時に(H)MACという単語を全く理解していなかった事が原因でした。突っ込みを頂いたのは初めてですが、とてもありがたく感じました。18:50:47はじめまして。methodを使うときは共有秘密鍵を用いた共通鍵暗号方式な気がします。1:34:39ritou様コメントありがとうございます。すいません、完全に勘違いというか思い込みで書いてしまいました。keyで署名を復号するものとばかり思っていました。keyを元にsecretキーをルックアップして、サーバ側でも署名を作成して、送信された署名との比較を取っていました。ご指摘の通りHMAC-SHA1方式での認証は共通鍵暗号化方式ですね。そもそもHMAC自体がそのような認証方式とは知らず、新しい暗号化アルゴリズムの1つと思い込んでおりました。上記修正致しますので、しばらくお待ちくださいませ。