Gadget サーバーからゲームサーバーへのリクエスト

Gadget サーバーはユーザーからのリクエストに応じてゲームサーバーへコンテンツリクエスト行います。

Gadget サーバーから送信される情報

リクエストヘッダ

ヘッダー名

説明

User-Agent

ユーザー端末のブラウザ情報

Accept-Encoding

gzipもしくはdeflate 通信を許容

  • ユーザーからの UserAgent リクエストヘッダは そのままゲームサーバーにプロキシーされます。この値で iPhone 端末か Android 端末などの判別をしてください。
  • いずれも端末固有の情報 (端末製造番号など) は Gadget サーバーにより削除されます。
  • 上記以外のユーザーからのリクエストヘッダは Gadget サーバーにより削除されます。

クエリパラメータ

フィールド名

説明

opensocial_app_id

このアプリケーションの ID

opensocial_viewer_id

このアプリケーションを利用しているユーザーの ID

opensocial_owner_id

このアプリケーションをインストールしているユーザーの ID

  • 現在は opensocial_viewer_id と opensocial_owner_id には同じ値が含まれます。
  • これらに加えてユーザが指定するクエリパラメータが含まれます。

OAuth Signature の検証

Authorization ヘッダに含まれる OAuth Signature はゲームサーバーへのリクエストが改ざんされていないことを検証するための情報です。悪意を持った第三者からのリクエストを受けて予期しない動作を起こさないように必ず OAuth Signature の検証を行って行ください。なお、画像ファイルには通常 Authorization ヘッダは付きません。検証を行いたい場合は signed=1 クエリパラメータを付けていただく必要があります。

検証には以下の手順を踏みます。

Base String の生成

生成は以下の手順で行います。

  1. HTTP リクエストメソッドを取得します。(例: GET)
  2. URL からクエリパラメータを除いたものを用意します。(例: http://example.com/123456789)
  3. Authorization ヘッダから realm と oauth_signature を除くプロトコルパラメータを取得します

Authorization ヘッダから取得するパラメータ

フィールド名

説明

oauth_consumer_key

アプリケーション登録時に発行される値

oauth_nonce

リクエスト毎にユニークな値

oauth_signature_method

署名方法 (HMAC-SHA1 固定)

oauth_timestamp

UNIX タイムスタンプ値

oauth_token

アクセストークン

oauth_token_secret

トークンシークレット

oauth_version

OAuth のバージョン (1.0 固定)

  4. Gadgetサーバから送られてきたクエリパラメータをすべて取得します。
  5. POST リクエストでContent-Typeが application/x-www-form-urlencoded の場合,ボディパラメータを取得します。
  6. 3から5で取得したパラメータを仕様にしたがって結合します。キーと値はそれぞれ英数字,"-", ".","_","~"以外のすべての文字をパーセントエンコードして "=" で連結します。また、連結したキーと値のペアはアルファベット順にソートして,"&" で連結します。なお、POSTされてきた日本語の文字コードをUTF-8に変換する必要はありません。

Base String の生成例

例としてゲームサーバーに以下のようなリクエストが来た場合

GET ?opensocial_app_id=999999&opensocial_viewer_id=12345&opensocial_owner_id=12345 HTTP/1.1
Authorization: 
OAuth realm="", 
oauth_consumer_key="abcdefghij1234567890", 
oauth_nonce="abcdefghij1234567890", 
oauth_signature="I%2BInIlnDZOUuB%2FROXjjOC%2Bi09fc%3D", 
oauth_signature_method="HMAC-SHA1", 
oauth_timestamp="1234567890", 
oauth_token="abcdefghij1234567890", 
oauth_token_secret="abcdefghij1234567890", 
oauth_version="1.0" 

Base Stringは以下のようになります。

GET&http%3A%2F%2Fexample.com&
oauth_consumer_key%3Dabcdefghij1234567890%26
oauth_nonce%3Dabcdefghij1234567890%26
oauth_signature_method%3DHMAC-SHA1%26
oauth_timestamp%3D1234567890%26
oauth_token%3Dabcdefghij1234567890%26
oauth_token_secret%3Dabcdefghij1234567890%26
oauth_version%3D1.0%26
opensocial_app_id%3D999999%26
opensocial_owner_id%3D12345%26
opensocial_viewer_id%3D12345

Signature の生成と比較

Signature は Base String をキー文字列で署名して生成します。

キー文字列はアプリケーション登録時に発行された Consumer Secret と Authorization ヘッダの oauth_token_secret をパーセントエンコードし,"&" で連結した値です。ダイジェスト値の生成には Authorization ヘッダの oauth_signature_method で指定されているアルゴリズム (現在はHMAC-SHA1固定) を利用します。この値をさらに BASE64 エンコードしたものが Signature になります(ダイジェスト値を生成したときに改行などの文字列が追加される場合は取り除いてから BASE64 エンコードしてください)。

この値と Authorization ヘッダの oauth_signature を比較することによってリクエストの検証を行うことができます。

先ほどの例を用いて取得できる値は、

I+InIlnDZOUuB/ROXjjOC+i09fc=

ですので、Authorization ヘッダの

oauth_signature="I%2BInIlnDZOUuB%2FROXjjOC%2Bi09fc%3D"

をURIアンエスケープした値と同じことで検証することができます。

注意事項

特定のフォームデータ形式をPOSTした際にsignatureが一致しないケースが発生しております。
現在、対応策を検討しておりますが OAuthライブラリ の影響をうけないアンダースコア形式を暫定対応として推奨します。

OAuth Signature の検証サンプルコード

以下のサンプルコードは Signature の妥当性のチェックのみです。timestamp や nonce の妥当性チェックは別途行う必要があります。

Perl

  • サンプルで使われている OAuth::Lite モジュールは CPAN で配布されています。
  • OAuth::Lite モジュールは 1.24 以上を利用してください。

PHP

  • サンプルで使われている OAuth ライブラリはOAuth コミュニティにより配布されています。

参考資料

The OAuth Core 1.0 Protocol draft-hammer-oauth-10
OAuth Core 1.0 Revision A

更新履歴

  • 2013/10/09
    • 配列フォームデータがPOSTされた場合に発生するsignature不具合に関する記述を追加
  • 2013/03/29
    • Accept-Encodingの記述を追加
  • 2013/03/15
    • ドキュメント移行

PREVIOUS

ユーザーから Gadget サーバーへのリクエスト

NEXT

ゲームサーバーから API サーバーへのリクエスト