/** * @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; }