OpenSocial Signed Request を Google App Engine で検証する
OpenSocial の Signed Request を Google App Engine で検証する方法についてです。Signed Request は、OpenSocial コンテナからのリクエストが正しいものであるかを検証するための仕組みです。OAuth Signature を検証することで、リクエストパラメータの不正な改ざんを検出することができます。この署名付きリクエストの検証方法については、mixi Developer Center に分かりやすいサンプルがあるのですが、PHP と Java と C# のみで Python がありません。
ヽ(`Д´)ノ
そこで mixiアプリからのリクエストを検証するサンプルを書いてみました。
利用するためには、次の2つのライブラリが必要です。
これらを 次のように App Engine のプロジェクト直下に置いてください。
nantoka-project/ |-- Crypto/ |-- app.yaml |-- index.py |-- index.yaml |-- oauth.py |-- signed_request.py
Cryptoは、下のようにすると簡単に入手できます。
% svn export http://gdata-python-client.googlecode.com/svn/trunk/src/gdata/Crypto
準備ができたら、さっそく使ってみます。使い方は、モジュールをインポートして、署名を検証したいリクエスト・メソッドのデコレータとして指定します。動いているアプリケーションに下線部分を追加するだけです。
from google.appengine.ext import webapp
import wsgiref.handlers
from signed_request import signed_request
class Index(webapp.RequestHandler):
@signed_request
def get(self):
# do something
self.response.headers['Content-Type'] = 'text/plain'
self.response.out.write('OK')
def main():
application = webapp.WSGIApplication(
[('/', Index),],
debug=True)
wsgiref.handlers.CGIHandler().run(application)
if __name__ == "__main__":
main()
以上。
だけだと素っ気ないので、signed_request.py の中身を簡単に説明します。通常なら OAuth のクライアントライブラリを使って簡単にできそうなものですが、Google App Engine では openssl のライブラリが使えないので、多くのコンテナで採用されている RSA-SHA1 形式の署名を検証するには少し工夫する必要があります。外部サーバの呼び出し » mDCのページに記載されている公開鍵を mixi.cer という名前のテキストファイルに保存します。そして、この公開鍵を16進数表記に変換します。
% openssl x509 -modulus -noout < mixi.cer | sed s/Modulus=/0x/ 0xC048F9DD595072FD561EF7D69533FE4F5957520F755BE6E0252B87003F3D3DD55FF548E78BDD 8491B8EA68B0F3038DFE53950B94AFF4E6344E9C6C050557484B150B81EBD2A624DF81B7C270A6 D15BB857AD34A68C5444A7B60EBDF953DEBAFBAAA36F8E6FB75C4D79EF3714DF74973081AF5F5B 901FF6387CDA44135A665FE5
signed_request.py 中の MIXI_CERT がこれに当たります。他のコンテナに対応させる場合も同様に変換すれば OK です。
関連リンク:
» Building an OpenSocial App with Google App Engine
» OpenSocial in the Cloud(日本語訳)










kadota said
on 2009-11-09 1:39 p.m.
こんにちは
mixiで実際に試してみました。
動作確認で、signed_request.py内のMIXI_CERTを変更してみたのですが変化がありません。
ブラウザのアドレスから直接実行すると、「Invalid OAuth Signature.」とメッセージが表示されます。
mixiアプリから実行した場合はMIXI_CERTを変更してもエラーが出ないのですが、
公開鍵を変更してもエラーは出ないのでしょうか?
kadota said
on 2009-11-11 4:35 p.m.
importしない方法で動作検証ができました。お騒がせして申し訳ありませんでした。
コメントは削除していただいてかまいません。
ありがとうございました。