‘CakePHP’ タグのついている投稿

リバースProxy環境でのmixiアプリのOAuth

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


CakePHPのPaginator逆ルーティング設定をビューで行う

CakePHP 1.2で、/hoge/Controller/page:1とかにしたページングがしたかったので調べた。

超参考になったのはこちらの記事。スライドの26~27ページあたり。逆ルーティング。

極める routes.php (CakePHP 1.2) : akiyan.com

routes.phpでゴチャゴチャにしたURLに対してもPaginatorにOptionsを渡してやればできるという話だったので実験。

Controllerのvar $paginateに書いてみたのだけどなぜか効かない…

色々試した末、viewに書くことで解決。

<?php
$paginator->options(array('url'=>array(
    'controller' => 'pages',
    'action' => 'display',
    'target' => 'hoge',
)));
?>

routesはこれ。

Router::connect('/hoge/pages/*', array('controller' => 'pages', 'action' => 'display', 'target' => 'hoge'));

これはこれで使い勝手いいかもしれんね。