mixiアプリ » 技術仕様(Graph API方式) » ライフサイクルイベントについて
ライフサイクルイベントについて
ライフサイクルイベントは、OpenSocial 0.8.1 にて規定されている「コンテナ上で起こったアプリケーションに関する事象を、アプリケーションプロバイダに送信するための仕様」です。mixi ではライフサイクルイベントのうち、現在
- event.addapp
- event.removeapp
の2つをご提供しています。アプリケーションプロバイダは対象mixiアプリ設定画面の、「ライフサイクルイベントに関する設定」で、ライフサイクルイベントを受け取るための設定を行うことで、そのmixiアプリに関して、
- どのユーザが使用を開始したのか
- どのユーザが使用を終了したのか
といった情報を外部サーバにて受けとることが可能になります。開発、公開したmixiアプリの利用状況の把握や、使用を終了したユーザに関する情報の削除処理などを行うためのきっかけとして、ライフサイクルイベントを利用すると良いでしょう。
ライフサイクルイベントの使用宣言
開発したmixiアプリに関するライフサイクルイベントを利用するためには、対象mixiアプリ設定画面の、「ライフサイクルイベントに関する設定」で、以下のように設定を行います。
各設定は、それぞれ、以下のライフサイクルイベントに対応しています。
メニュー名 | ライフサイクルイベント |
---|---|
アプリ追加情報 | event.addapp |
アプリ削除情報 | event.removeapp |
上記のコード例では、以下のような定義となります。
- ユーザがこのmixiアプリの使用を開始したことを、http://example.com/add にGETでリクエストを送信する
- ユーザがこのmixiアプリの使用を終了したことを、http://example.com/remove にPOSTでリクエストを送信する
設定を変更した後、「設定を変更する」ボタンを押下します。これによりライフサイクルイベントの登録が行われます。
ライフサイクルイベントを解除する場合は、エンドポイントの記述を削除した後、「設定を変更する」ボタンを押下してください。
送信されるパラメータ
実際にライフサイクルイベントに関する通知が行われる際には、関係する情報がパラメータ値として同時に送信されます。以下に送信されるパラメータをイベントごとに示します。
event.addapp
アプリ追加情報を設定した場合、以下のパラメータが渡されます。
- eventtype – “event.addapp”
- opensocial_app_id – mixiアプリのID
- id – mixiアプリの使用を開始したユーザのID
- mixi_invite_from – 招待を受けてmixiアプリの使用を開始した場合の、招待したユーザのID
event.removeapp
アプリ削除情報を設定した場合、以下のパラメータが渡されます。
- eventtype – “event.removeapp”
- opensocial_app_id – mixiアプリのID
- id – mixiアプリの使用を終了したユーザのID
ライフサイクルイベントの通知頻度
エンドポイントへのライフサイクルイベントの通知は、これにかかる負荷などのコストを考慮し、ユーザのアクションに対してリアルタイムに行われるのではなく、定期的に通知が行われます。そのため、ユーザのアクションと実際の通知に関して、遅延が発生いたしますので、それを前提とした設計を行ってください。
準備するエンドポイントに関しては、必ずリクエストの受信成功とステータスコードとして200を返却するようにしてください。受信に失敗した場合であっても再送はされません。200以外のステータスコードが返却されると、一定時間ライフサイクルイベントの通知を中断します。その間の通知は送信されません。
各イベントのマージ
ライフサイクルイベントの通知は定期的に行われます。その際に、一定期間内で発生した各イベントごとにリクエストが行われるのではなく、同一イベントであれば一つのリクエストにまとめられます。具体的には、同じイベント種別であり、ユーザのIDのみが異なる複数のイベントについて、リクエストがマージされます。
例えば、mixiアプリXについて、ユーザID=A,B,Cそれぞれのユーザがそのアプリの使用を開始したことを”http://example.com/add”にGETで送信する場合、
- GET /add?opensocial_app_id=X&id=A
- GET /add?opensocial_app_id=X&id=B
- GET /add?opensocial_app_id=X&id=C
というリクエストが個別に送信されるのではなく、
- GET /add?opensocial_app_id=X&id=A&id=B&id=C
といったようにリクエストが一つにまとめられます。エンドポイント側で、複数のidパラメータが指定されている場合についても、正しく受け取れるように処理を行うようにしてください。
また、あるユーザに招待されたことを受けてアプリの利用を開始したユーザに関するリクエストの場合、mixi_invite_fromパラメータは各リクエストで0個もしくは1個となります。例えば、
- ユーザAの招待を受けて、ユーザBとユーザCが利用開始した。
- ユーザBの招待を受けて、ユーザDが利用開始した。
- 招待に関係なく、ユーザAが利用開始した。
という場合は、
- id=B&id=C&mixi_invite_from=A
- id=D&mixi_invite_from=B
- id=A
という3つのリクエストが送信されます。
署名の検証
ライフサイクルイベントによって送信されるリクエストには、Authorizationリクエストヘッダに署名が付与されています。これを検証することによって、妥当なリクエストかどうかをエンドポイント側で判断することが可能です。
具体的な検証方法は、以下のドキュメントをご参照ください。
[署名付きリクエストの検証]
http://developer.mixi.co.jp/appli/ns/pc/validating_signed_requests/
POSTメソッドを利用する場合はmixiモバイル同様PostBodyを署名のベース文字列に含めないようご注意ください。
また、
ライフサイクルイベントでのリクエストでは、opensocial_owner_idパラメータおよびopensocial_viewer_idパラメータが送信されることはありません。上記の署名検証に加えて、これらのパラメータがリクエストに含まれないことも同時に確認を行うようにしてください。
公開鍵
-----BEGIN CERTIFICATE----- MIIDNzCCAh+gAwIBAgIJAIQ3zDiILtpzMA0GCSqGSIb3DQEBBQUAMDIxCzAJBgNV BAYTAkpQMREwDwYDVQQKDAhtaXhpIEluYzEQMA4GA1UEAwwHbWl4aS5qcDAeFw0x MzExMDcwODQwNTBaFw0yMzExMDUwODQwNTBaMDIxCzAJBgNVBAYTAkpQMREwDwYD VQQKDAhtaXhpIEluYzEQMA4GA1UEAwwHbWl4aS5qcDCCASIwDQYJKoZIhvcNAQEB BQADggEPADCCAQoCggEBAMxzCu9sUctGAzL/X0/sH2MSRmc/+X2Wx87ObZDpEd5P 19mIUQXW6hCXObB3SkE7kMuXiRhtrxwsnB9fjYIUEq/1vsTHkLJoJVUFIumqe6EH c/WZaTmu34WpEUFXNDS4htidXyVqikoDQZF9wdczyH7bLPbekQfRAcyek3E6/7Qi B00yWUqK8FcUOD4ILmtSHXsz4BNqekNgEzfUi5WkBYKtuD5zSunZalbWUPS7xa57 o1auVdclaHBfqe8dC5DTbxIe0szpHckQrJF9fJ/bIQSmvY6ADBRGfoLF7Fgoc5x+ R5my9weytzg4WdDUjYrxmhy5IpjxytipQqrFDqAUxl8CAwEAAaNQME4wHQYDVR0O BBYEFKCQSlssCWLqd0tT7NVtoBUNzCasMB8GA1UdIwQYMBaAFKCQSlssCWLqd0tT 7NVtoBUNzCasMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBALoI7elk ZCv+pUpi6aJepzLnQDYHB2eXpDkpWEUrF1WMvx8ovmWdVeviHqUdFtGL0XZ5tSoV vGE/KQTavag+MfbafKaff4iHXNyNMygeFP7r/FaFQQRafyNfhaXF6sWfwKrOk/Bc jIXFN9tYWN6LEwNgYT0C+OSOppQJzt2y1am15FExAHQcIEFYc+3T+MGGJ7e9H8tn Qz84WmIgNZRUMYQC0PJTsMNVvr+/DTIzjabKz4W8qodXGA7AxXiRYdgC+3RUj/rA lR09PXZ6nRaKiB0KBDIMUlPu/0u0Vw+GBt0ckH0htOKSxsn09jkITFhy3NX7Slbk jlnY4pS9JO+avmM= -----END CERTIFICATE-----
サンプルコード
ライフサイクルイベントに付加されている署名を検証するためのサンプルコード(PHP)を以下に掲載します。
<?php require_once("OAuth.php"); class MixiSignatureMethod extends OAuthSignatureMethod_RSA_SHA1 { protected function fetch_public_cert(&$request) { return <<< EOD -----BEGIN CERTIFICATE----- MIIDNzCCAh+gAwIBAgIJAIQ3zDiILtpzMA0GCSqGSIb3DQEBBQUAMDIxCzAJBgNV BAYTAkpQMREwDwYDVQQKDAhtaXhpIEluYzEQMA4GA1UEAwwHbWl4aS5qcDAeFw0x MzExMDcwODQwNTBaFw0yMzExMDUwODQwNTBaMDIxCzAJBgNVBAYTAkpQMREwDwYD VQQKDAhtaXhpIEluYzEQMA4GA1UEAwwHbWl4aS5qcDCCASIwDQYJKoZIhvcNAQEB BQADggEPADCCAQoCggEBAMxzCu9sUctGAzL/X0/sH2MSRmc/+X2Wx87ObZDpEd5P 19mIUQXW6hCXObB3SkE7kMuXiRhtrxwsnB9fjYIUEq/1vsTHkLJoJVUFIumqe6EH c/WZaTmu34WpEUFXNDS4htidXyVqikoDQZF9wdczyH7bLPbekQfRAcyek3E6/7Qi B00yWUqK8FcUOD4ILmtSHXsz4BNqekNgEzfUi5WkBYKtuD5zSunZalbWUPS7xa57 o1auVdclaHBfqe8dC5DTbxIe0szpHckQrJF9fJ/bIQSmvY6ADBRGfoLF7Fgoc5x+ R5my9weytzg4WdDUjYrxmhy5IpjxytipQqrFDqAUxl8CAwEAAaNQME4wHQYDVR0O BBYEFKCQSlssCWLqd0tT7NVtoBUNzCasMB8GA1UdIwQYMBaAFKCQSlssCWLqd0tT 7NVtoBUNzCasMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBALoI7elk ZCv+pUpi6aJepzLnQDYHB2eXpDkpWEUrF1WMvx8ovmWdVeviHqUdFtGL0XZ5tSoV vGE/KQTavag+MfbafKaff4iHXNyNMygeFP7r/FaFQQRafyNfhaXF6sWfwKrOk/Bc jIXFN9tYWN6LEwNgYT0C+OSOppQJzt2y1am15FExAHQcIEFYc+3T+MGGJ7e9H8tn Qz84WmIgNZRUMYQC0PJTsMNVvr+/DTIzjabKz4W8qodXGA7AxXiRYdgC+3RUj/rA lR09PXZ6nRaKiB0KBDIMUlPu/0u0Vw+GBt0ckH0htOKSxsn09jkITFhy3NX7Slbk jlnY4pS9JO+avmM= -----END CERTIFICATE----- EOD; } protected function fetch_private_cert(&$request) { return; } } //Build a request object from the current request $request = OAuthRequest::from_request(); $signature = $request->get_parameter('oauth_signature'); //Initialize the new signature method $signature_method = new MixiSignatureMethod(); //Check the request signature @$signature_valid = $signature_method->check_signature($request, null, null, $signature); if (!$signature_valid) { header('HTTP/1.0 400 Bad Request'); echo "This request was spoofed"; } else { echo "Success! The data was validated"; }
上記プログラムの動作には、OAuth.php が必要です。
2010年5月18日時点の最新バージョンである r1171 では署名の生成方法に問題がありますので、以下のように修正してご利用ください。
--- OAuth.php.org 2010-05-17 17:25:38.000000000 +0900 +++ OAuth.php 2010-05-17 17:29:12.000000000 +0900 @@ -276,7 +276,7 @@ // and add those overriding any duplicates from GET or POST if (@substr($request_headers['Authorization'], 0, 6) == "OAuth ") { $header_parameters = OAuthUtil::split_header( - $request_headers['Authorization'] + $request_headers['Authorization'], false ); $parameters = array_merge($parameters, $header_parameters); } @@ -857,7 +857,7 @@ if (is_array($value)) { // If two or more parameters share the same name, they are sorted by their value // Ref: Spec: 9.1.1 (1) - natsort($value); + sort($value, SORT_STRING); foreach ($value as $duplicate_value) { $pairs[] = $parameter . '=' . $duplicate_value; }