/**
  * @author Naomichi Yamakita <*****@*****.**>
  */
 private function buildLaunchURI($type, $queryData)
 {
     if ($type === Mars_MixiApp::AGENT_TYPE_PC || $type == Mars_MixiApp::AGENT_TYPE_SMARTPHONE) {
         $buffer = NULL;
         if (sizeof($queryData)) {
             $buffer = '&' . http_build_query($queryData, '', '&');
         }
         $uri = sprintf('http://mixi.jp/run_appli.pl?id=%s%s', Mars_MixiMobileApp::getApplicationId(), $buffer);
     } else {
         if (!isset($queryData['action'])) {
             $queryData['action'] = Mars_Config::loadSetup('action.default');
         }
         $uri = Mars_MixiMobileApp::buildForwardActionURI($queryData, TRUE);
     }
     return $uri;
 }
 /**
  * HTTP リクエストが mixi から送信された正当なものであるかどうかを検証します。
  * mixi モバイルアプリを実装する上で、このメソッドはリクエスト毎に必ず実行して下さい。
  * 
  * @param int $type 署名方式。Mars_OAuthProvider::SIGNATURE_* 定数を指定。
  * @throws Mars_UnsupportedException サポートされていない署名形式が指定された場合に発生。
  * @link http://developer.mixi.co.jp/appli/spec/mob/validate-oauth-signature OAuth Signature の検証方法について
  * @link http://developer.mixi.co.jp/appli/spec/mob/for_partners/photo_upload_api アプリからフォトアップロード機能について
  * @link http://developer.mixi.co.jp/appli/spec/mob/for_partners/lifecycle_event ライフサイクルイベントについて
  * @see Mars_OAuthProvider::isAuthorizaed()
  * @author Naomichi Yamakita <*****@*****.**>
  */
 public function isAuthorized($type = self::SIGNATURE_HMAC)
 {
     $result = FALSE;
     switch ($type) {
         case self::SIGNATURE_HMAC:
             $authorization = $this->request->getHeader('Authorization');
             // Authorization ヘッダに含まれるパラメータを連想配列に変換
             preg_match_all('/([a-z_]+)="([^"]+)"/', $authorization, $matches);
             if (sizeof($matches[0])) {
                 $attributes = array_combine($matches[1], $matches[2]);
                 $parameters = array();
                 $parameters['oauth_nonce'] = $attributes['oauth_nonce'];
                 $parameters['oauth_signature_method'] = $attributes['oauth_signature_method'];
                 $parameters['oauth_timestamp'] = $attributes['oauth_timestamp'];
                 $parameters['oauth_version'] = $attributes['oauth_version'];
                 $parameters['opensocial_app_id'] = Mars_MixiMobileApp::getApplicationId();
                 $parameters['opensocial_owner_id'] = Mars_MixiMobileApp::getOwnerId();
                 $parameters += $this->request->getQuery();
                 $method = $this->request->getRequestMethod();
                 $uri = $this->request->getURL(FALSE);
                 $request = OAuthRequest::from_consumer_and_token($this->_consumer, NULL, $method, $uri, $parameters);
                 $request->sign_request(new OAuthSignatureMethod_HMAC_SHA1(), $this->_consumer, NULL);
                 $buildSignature = @$request->get_parameter('oauth_signature');
                 $requestSignature = urldecode($attributes['oauth_signature']);
                 if ($buildSignature === $requestSignature) {
                     $result = TRUE;
                 }
             }
             break;
         case self::SIGNATURE_RSA_PC:
             $request = OAuthRequest::from_request(NULL, NULL, array_merge($_GET, $_POST));
             // 不正なリクエスト時に 'Undefined index: oauth_signature' エラーが起こる不具合 (r525 で確認済み) があるため、エラー制御演算子を付けておく
             $signature = @$request->get_parameter('oauth_signature');
             if (!is_null($signature)) {
                 $signatureMethod = new Mars_MixiPCSignature();
                 $result = $signatureMethod->check_signature($request, NULL, NULL, $signature);
             }
             break;
         case self::SIGNATURE_RSA_TOUCH:
             $request = OAuthRequest::from_request(NULL, NULL, array_merge($_GET, $_POST));
             $signature = @$request->get_parameter('oauth_signature');
             if (!is_null($signature)) {
                 $signatureMethod = new Mars_MixiTouchSignature();
                 $result = $signatureMethod->check_signature($request, NULL, NULL, $signature);
             }
             break;
         case self::SIGNATURE_RSA_PHOTO_UPLOAD:
             $request = OAuthRequest::from_request();
             $signature = @$request->get_parameter('oauth_signature');
             if (!is_null($signature)) {
                 $signatureMethod = new Mars_MixiFileUploadSignature();
                 $result = $signatureMethod->check_signature($request, NULL, NULL, $signature);
             }
             break;
         case self::SIGNATURE_RSA_LIFECYCLE_EVENT:
             if ($this->request->getParameter('opensocial_owner_id') !== NULL) {
                 break;
             }
             if ($this->request->getParameter('opensocial_viewer_id') !== NULL) {
                 break;
             }
             // ライフサイクルイベントは mixi から POST リクエストが送信される
             // (OAuth の仕様上は POST データを署名生成のアルゴリズムに使用することが規定されているが、mixi アプリが仕様に準拠していないため QueryString のみを使用する)
             $requestHeaders = OAuthUtil::get_headers();
             $parameters = OAuthUtil::parse_parameters($this->request->getEnvironment('QUERY_STRING'));
             if (isset($requestHeaders['Authorization']) && substr($requestHeaders['Authorization'], 0, 6) == 'OAuth ') {
                 $headerParameters = OAuthUtil::split_header($requestHeaders['Authorization'], FALSE);
                 $parameters = array_merge($parameters, $headerParameters);
                 $request = OAuthRequest::from_request(NULL, NULL, $parameters);
                 $signature = $request->get_parameter('oauth_signature');
                 if (!is_null($signature)) {
                     $signatureMethod = new Mars_MixiLifecycleEventSignature();
                     $result = $signatureMethod->check_signature($request, NULL, NULL, $signature);
                 }
             }
             break;
         default:
             $message = sprintf('Signature format is not supported. [%s]', $type);
             throw new Mars_UnsupportedException($message);
             break;
     }
     return $result;
 }