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つ付いていたので削って付けなおしてます。