サンゴラボ

4年目ソシャゲエンジニア

CodeIgniterでAjaxを使う

Ajaxを使うときに、いつも忘れていて調べることから始まるので、ブログに簡単なサンプルをまとめておく。

CodeIgniterの出力クラスを使えば、簡単にJSONを返すコントローラが作れる。FuelPHPならRestコントローラで楽勝。

サーバ側(コントローラ)

ajax.php

<?php
class Ajax extends CI_Controller{

    public function __construct(){
        parent::__construct();
    }

    public function index(){

        // サーバ側でもってるデータ
        $array = array(
            array('framework' => 'codeigniter', 'lang' => 'php',),
            array('framework' => 'fuelphp',     'lang' => 'php',),
        );

        //postで送られてきたデータ
        $post_data = $this->input->post('number');

        //postデータをもとに$arrayからデータを抽出
        $data = $array[$post_data];
		
        //$dataをJSONにして返す
        $this->output
             ->set_content_type('application/json')
             ->set_output(json_encode($data));
    }
}

クライアント側(ビュー)

ajax_client.php

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Ajaxのサンプル</title>
<style></style>
<script src="http://code.jquery.com/jquery-1.8.2.min.js"></script>
<script>
$(function(){
    $('button').on('click', function(){

        //クリックされたボタンのid属性を取得
        var button_id = $(this).attr('id');

        //Ajax	
        $.ajax({
            type: 'post', // HTTPメソッド(CodeIgniterだとgetは捨てられる)
            url: 'http://localhost/codeigniter/index.php/ajax', //リクエストの送り先URL(適宜変える)
            data: {'number': button_id}, //サーバに送るデータ。JSのオブジェクトで書ける
            dataType: 'json', //サーバからくるデータの形式を指定

            //リクエストが成功したらこの関数を実行!!
            success: function(data){
                alert('フレームワーク:' + data.framework + ', 言語:' + data.lang);
            }
        });
    });
});
</script>
</head>
<body>
    <button id="0">ボタン1</button>
    <button id="1">ボタン2</button>
</body>
</html>

サーバ側ではAPIを作る感じかな。
あと、ちゃんとモデルに切り分けたいね。

FuelPHPのページネーションのURLにGETパラメータが付加できない

FuelPHPのPaginationクラスを使っていて、いろいろ調べたのでメモ。

今のPaginationクラス(1.3/master)ではページネーションのURLにGETパラメータをうまいこと付加できないらしい。

検索してみると、困っている方がちらほらといます。

ページネーションのURLを
seg1/seg2/page_number/?param=hoge
みたいな感じにしたいのに
seg1/seg2/?param=hoge/page_number/
のように、ページ数のセグメントがURLの最後に付加されてしまうとのこと。

実際にコアのソース(fuel/core/classes/pagination.php)を見て見ると、確かにそうなってるので、GETパラメータを使いたい場合はコアを置き換えるしかなさそうです。

幸い上の1つ目の公式フォーラムのリンクに参考になりそうなソースが載っています。中に人にgithubでpull request送ってと言われてますが、今のところ変化ないので送ってないみたいですね。

認証と認可、OAuthとか

業界的にOAuth知らないとこの先生き残れなそうなので現在勉強中です。
OAuthについて調べてると、認証と認可という単語がたくさん出てきてごっちゃになるので、言葉の定義から整理してみました。

■認証と認可の違い

参考:認証と認可の違い

簡単にまとめると

  • 認証(Authentication):本人確認
  • 認可(Authorization):リソースへのアクセス権限の付与

認証と認可は全然違うことがわかった!英単語も違う。また、認可するには認証が必要ということも理解した。

■認証には2種類ある

参考:認証には2種類ある

上で認証をAuthenticationとしてたけど、実は情報セキュリティにおける認証には2つあるらしい。

  • Authentication(2者間認証)

認証者と被認証者が事前に共有している情報を確認すること。ユーザIDとパスワードによるログインなど

  • Certification(3者間認証)

認証局が発行した証明書により持ち主の正当性を確認すること。

日本語ではどちらも認証なので、ややこしいことになってる。

■OAuth

参考:APIアクセス権を委譲するプロトコル、OAuthを知る

OAuthはAPIアクセス権を委譲するプロトコルである。リソースへのアクセス権限の付与なので、OAuthは認可の技術ということになる。

OAuthのプロトコルについては参考記事で十分に説明されているので割愛。

通常のOAuthでは、サービスプロバイダ、コンシューマ、ユーザの3者が登場する。OAuthプロトコルで定義されているのは、APIへの接続内容をサービスプロバイダ側で確認するのに必要なトークンの発行とそのやりとりの方法だけである。また、認可の技術なので、認証が必要になるのだが、認証手段については定義されていない。

■2-legged OAuthと3-legged OAuth

ここらへんから複雑になってくる。僕の理解では

  • 2-legged OAuth:2者間でのAPI認可フロー
  • 3-legged OAuth:3者間でのAPI認可フロー

つまり、OAuthを使った3者(サービスプロバイダ、コンシューマ、ユーザ)によるAPI認可フローのことを3-legged OAuthと呼ぶ。そして、ユーザを省いた2者間でのAPI認可フローのことを2-legged OAuthと呼ぶ。

2-legged OAuthの実装については以下がとても参考になる。3-legged OAuthはわからんw