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(日本語訳)


3 Comments so far »

  1.  

    kadota said

    on 2009-11-09 1:39 p.m.

    こんにちは
    mixiで実際に試してみました。

    動作確認で、signed_request.py内のMIXI_CERTを変更してみたのですが変化がありません。
    ブラウザのアドレスから直接実行すると、「Invalid OAuth Signature.」とメッセージが表示されます。
    mixiアプリから実行した場合はMIXI_CERTを変更してもエラーが出ないのですが、
    公開鍵を変更してもエラーは出ないのでしょうか?

  2.  

    kadota said

    on 2009-11-11 4:35 p.m.

    importしない方法で動作検証ができました。お騒がせして申し訳ありませんでした。
    コメントは削除していただいてかまいません。
    ありがとうございました。

  3.  

    魔法使いA-Ki☆。 said

    on 2010-07-31 2:40 p.m.

    参考にさせていただきました!
    ありがとうございます!

    あ、mixiの公開鍵が変更されてるので、MIXI_CERTも変更になってます。
    こちらで生成した新しいMIXI_CERTを貼っておきますね。
    (Linux環境があれば自分ですぐに生成出来るんですけど・・・)

    B5BAB9467B3920492D5E5759FB7EC58E56AF9EE73826EC2B0F817EE0
    D43057056D479CB0560D7411A9D759218801B505C7A865A6960E6F4C
    7FDCF04C1BCD3AE372E65D2266BEFE1589150197662CF487B62FF0FD
    2954170D68098F1046AA8E4C3BAAC0FC8A7BF246E235B210254209B5
    BB896562F72CC55EEA6A483B64948B55


このエントリーのはてなブックマーク (-)