CakePHPでmixiアプリのOAuthを処理させる方法は以下のサイト参照。ホントにシンプルでわかりやすい解説。
[cakephp] mixiアプリのOAuthのリクエストを受け取る – 「のーぶるじゃすぱー」略して「のぶじゃす」のBLOG
通常の環境ではこのまま実装すればOK。
で、このあとロードバランサーの入ったサーバに持ってきたらOAuthが正しく認証されない。
OAuthRequestのhttp_urlを見てみると、
http://192.168.0.2:8001:80//api/hoge/hoge/…
という悲しいことになっていて、これがどうも問題のようだと。というか、ホスト:ポート:ポートってどういうことだ…
本来ならもちろん、
http://mixiapp.sample.com:80/api/hoge/hoge/…
みたいなアドレスになっていないといけない。
ちなみに送信側はmixiアプリのサンプルそのまんまな感じのJavaScript
var params = {}; params[gadgets.io.RequestParameters.REFRESH_INTERVAL] = 0; params[gadgets.io.RequestParameters.AUTHORIZATION] = gadgets.io.AuthorizationType.SIGNED; params[gadgets.io.RequestParameters.CONTENT_TYPE] = gadgets.io.ContentType.TEXT; var url = "http://mixiapp.sample.com/api/hoge/hoge/"; gadgets.io.makeRequest(url, func, params);
解決策は
function validateOAuth () { $get = $_GET; unset($get['url']); $http_url = 'http://mixiapp.sample.com:80/' . ltrim($_SERVER['REQUEST_URI'],'/'); $request = OAuthRequest::from_request(null, $http_url, array_merge($get, $_POST)); if ($_GET['oauth_consumer_key'] == 'mixi.jp') { @$signature_valid = $this->MixiAppliOauth->check_signature($request, null, null, $get["oauth_signature"]); } if ($signature_valid == true || Configure::read('debug')) { $this->oauth_valid = true; $this->viewer_id = $get['opensocial_viewer_id']; $this->owner_id = $get['opensocial_owner_id']; return $get; } return false; }
というように、from_requestの第二引数にURLを指定してやればOK。なぜかスラッシュが2つ付いていたので削って付けなおしてます。