<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Kandar's Scratch</title>
	<atom:link href="http://www.kandar.info/index.php/feed" rel="self" type="application/rss+xml" />
	<link>http://www.kandar.info</link>
	<description>Start learning to write my mind</description>
	<lastBuildDate>Tue, 19 Jul 2011 00:35:49 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Aplikasi Comet Dengan Nginx HTTP Push Module</title>
		<link>http://www.kandar.info/index.php/ajax/aplikasi-comet-dengan-nginx-http-push-module</link>
		<comments>http://www.kandar.info/index.php/ajax/aplikasi-comet-dengan-nginx-http-push-module#comments</comments>
		<pubDate>Tue, 12 Jul 2011 07:44:41 +0000</pubDate>
		<dc:creator>kandar</dc:creator>
				<category><![CDATA[ajax]]></category>

		<guid isPermaLink="false">http://www.kandar.info/?p=159</guid>
		<description><![CDATA[Setelah sebelumnya kita membahas aplikasi comet pure berbasis PHP, kali ini kita akan buat aplikasi comet dengan bantuan modul Nginx_HTTP_Push_Module. Pada tutorial kali ini PHP kita gunakan sebagai interface untuk front-end. Untuk mendapat gambaran aplikasi yang akan kita buat, silahkan coba di sini http://pushmodule.slact.net/. Pertama-tama kita harus melakukan instalasi Nginx disertai dengan modul Nginx_HTTP_Push_Module. Dalam [...]]]></description>
			<content:encoded><![CDATA[<p>Setelah sebelumnya kita membahas aplikasi <a href="http://www.kandar.info/index.php/ajax/aplikasi-comet-dengan-php">comet pure berbasis PHP</a>, kali ini kita akan buat aplikasi comet dengan bantuan modul <a href="http://pushmodule.slact.net/">Nginx_HTTP_Push_Module</a>. Pada tutorial kali ini PHP kita gunakan sebagai interface untuk front-end.</p>
<p>Untuk mendapat gambaran aplikasi yang akan kita buat, silahkan coba di sini <a href="http://pushmodule.slact.net/">http://pushmodule.slact.net/</a>.</p>
<p>Pertama-tama kita harus melakukan instalasi <a href="http://wiki.nginx.org/">Nginx</a> disertai dengan modul Nginx_HTTP_Push_Module. Dalam artikel ini OS yang digunakan adalah Ubuntu 11.04. Namun tetap bisa diterapkan pada OS lainnya dengan beberapa penyesuain.<span id="more-159"></span></p>
<p>Download source Nginx_HTTP_Push_Module di <a href="https://github.com/slact/nginx_http_push_module/archives/master">https://github.com/slact/nginx_http_push_module/archives/master</a><br />
Download source Nginx dari <a href="http://wiki.nginx.org/Install">http://wiki.nginx.org/Install</a></p>
<p>extract ke dua file tadi:</p>

<div class="wp_syntax"><div class="code"><pre class="ini" style="font-family:monospace;">tar -xzvf nginx-1.0.4.tar.gz
tar -xzvf slact-nginx_http_push_module-v0.692-<span style="">18</span>-g5688154.tar.gz</pre></div></div>

<p>Install library PCRE yang dibutuhkan Nginx saat proses compile:</p>

<div class="wp_syntax"><div class="code"><pre class="ini" style="font-family:monospace;">sudo apt-get install gcc libpcre3-dev libssl-dev</pre></div></div>

<p>Masuk ke dalam folder Nginx yang sudah diekstrak:</p>

<div class="wp_syntax"><div class="code"><pre class="ini" style="font-family:monospace;">cd nginx-1.0.4</pre></div></div>

<p>Compile nginx dengan modul:</p>

<div class="wp_syntax"><div class="code"><pre class="ini" style="font-family:monospace;">sudo ./configure \
    <span style="color: #000099;">--add-module</span><span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;">/LOKASI_FOLDER/nginx_http_push_module/</span></pre></div></div>

<p>Secara default Nginx akan diinstal ke folder /usr/local/nginx/. Namun jika ingin menggunakan folder yang lain gunakan perintah:</p>

<div class="wp_syntax"><div class="code"><pre class="ini" style="font-family:monospace;">sudo ./configure \
    <span style="color: #000099;">--prefix</span><span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;">/PATH/FOLDER_TUJUAN/ \</span>
    <span style="color: #000099;">--add-module</span><span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;">/LOKASI_FOLDER/nginx_http_push_module/</span></pre></div></div>

<p>Lakukan proses make:</p>

<div class="wp_syntax"><div class="code"><pre class="ini" style="font-family:monospace;">make
sudo make install</pre></div></div>

<p>Setelah proses &#8220;make&#8221; dan &#8220;install&#8221; berhasil, edit file konfigurasi Nginx:</p>

<div class="wp_syntax"><div class="code"><pre class="ini" style="font-family:monospace;">/usr/local/nginx/conf/nginx.conf atau sesuai dengan folder yang telah ditentukan.</pre></div></div>

<p>Edit kira-kira pada line 10 dan tambahkan:</p>

<div class="wp_syntax"><div class="code"><pre class="ini" style="font-family:monospace;">pid     /var/run/nginx.pid<span style="color: #666666; font-style: italic;">;</span></pre></div></div>

<p>buat sebuah file baru sebagai startup script:</p>

<div class="wp_syntax"><div class="code"><pre class="ini" style="font-family:monospace;">sudo vim /etc/init.d/nginx</pre></div></div>

<p>Isikan seperti berikut:</p>

<div class="wp_syntax"><div class="code"><pre class="ini" style="font-family:monospace;">#! /bin/sh
&nbsp;
### BEGIN INIT INFO
# Provides:          nginx
# Required-Start:    $local_fs $remote_fs $network $syslog
# Required-Stop:     $local_fs $remote_fs $network $syslog
# Default-Start:     <span style="">2</span> <span style="">3</span> <span style="">4</span> <span style="">5</span>
# Default-Stop:      <span style="">0</span> <span style="">1</span> <span style="">6</span>
# Short-Description: starts the nginx web server
# Description:       starts nginx using start-stop-daemon
### END INIT INFO
&nbsp;
<span style="color: #000099;">PATH</span><span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;">/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin</span>
<span style="color: #000099;">DAEMON</span><span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;">/usr/sbin/nginx</span>
<span style="color: #000099;">NAME</span><span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;">nginx</span>
<span style="color: #000099;">DESC</span><span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;">nginx</span>
&nbsp;
test -x $DAEMON || exit <span style="">0</span>
&nbsp;
# Include nginx defaults if available
if <span style="color: #000066; font-weight:bold;"><span style="">&#91;</span> -f /etc/default/nginx <span style="">&#93;</span></span> <span style="color: #666666; font-style: italic;">; then</span>
	. /etc/default/nginx
fi
&nbsp;
set -e
&nbsp;
. /lib/lsb/init-functions
&nbsp;
test_nginx_config<span style="">&#40;</span><span style="">&#41;</span> <span style="">&#123;</span>
  if nginx -t $DAEMON_OPTS
  then
    return <span style="">0</span>
  else
    return $?
  fi
<span style="">&#125;</span>
&nbsp;
case <span style="color: #933;">&quot;$1&quot;</span> in
  start<span style="">&#41;</span>
	echo -n <span style="color: #933;">&quot;Starting $DESC: &quot;</span>
        test_nginx_config
	start-stop-daemon --start --quiet --pidfile /var/run/$NAME.pid \
		--exec $DAEMON -- $DAEMON_OPTS || true
	echo <span style="color: #933;">&quot;$NAME.&quot;</span>
	<span style="color: #666666; font-style: italic;">;;</span>
  stop<span style="">&#41;</span>
	echo -n <span style="color: #933;">&quot;Stopping $DESC: &quot;</span>
	start-stop-daemon --stop --quiet --pidfile /var/run/$NAME.pid \
		--exec $DAEMON || true
	echo <span style="color: #933;">&quot;$NAME.&quot;</span>
	<span style="color: #666666; font-style: italic;">;;</span>
  restart|force-reload<span style="">&#41;</span>
	echo -n <span style="color: #933;">&quot;Restarting $DESC: &quot;</span>
	start-stop-daemon --stop --quiet --pidfile \
		/var/run/$NAME.pid --exec $DAEMON || true
	sleep <span style="">1</span>
        test_nginx_config
	start-stop-daemon --start --quiet --pidfile \
		/var/run/$NAME.pid --exec $DAEMON -- $DAEMON_OPTS || true
	echo <span style="color: #933;">&quot;$NAME.&quot;</span>
	<span style="color: #666666; font-style: italic;">;;</span>
  reload<span style="">&#41;</span>
        echo -n <span style="color: #933;">&quot;Reloading $DESC configuration: &quot;</span>
        test_nginx_config
        start-stop-daemon --stop --signal HUP --quiet --pidfile /var/run/$NAME.pid \
            --exec $DAEMON || true
        echo <span style="color: #933;">&quot;$NAME.&quot;</span>
        <span style="color: #666666; font-style: italic;">;;</span>
  configtest<span style="">&#41;</span>
        echo -n <span style="color: #933;">&quot;Testing $DESC configuration: &quot;</span>
        if test_nginx_config
        then
          echo <span style="color: #933;">&quot;$NAME.&quot;</span>
        else
          exit $?
        fi
        <span style="color: #666666; font-style: italic;">;;</span>
  status<span style="">&#41;</span>
	status_of_proc -p /var/run/$NAME.pid <span style="color: #933;">&quot;$DAEMON&quot;</span> nginx &amp;&amp; exit <span style="">0</span> || exit $?
	<span style="color: #666666; font-style: italic;">;;</span>
  *<span style="">&#41;</span>
	echo <span style="color: #933;">&quot;Usage: $NAME {start|stop|restart|reload|force-reload|status|configtest}&quot;</span> &gt;&amp;<span style="">2</span>
	exit <span style="">1</span>
	<span style="color: #666666; font-style: italic;">;;</span>
esac
&nbsp;
exit <span style="">0</span></pre></div></div>

<p>Sekarang kita cek apakah Nginx sudah berjalan sesuai dengan yang kita harapkan. Nginx yang kita install berjalan di port 80, maka pastikan tidak ada aplikasi lain yang berjalan di port ini:</p>

<div class="wp_syntax"><div class="code"><pre class="ini" style="font-family:monospace;">sudo /etc/init.d/nginx start</pre></div></div>

<p>Jika pada tahap ini Nginx sudah berhasil jalan, langkah berikutnya adalah melakukan konfigurasi HTTP Push Module di dalam file konfigurasi Nginx. Berikut adalah contoh konfigurasinya:</p>

<div class="wp_syntax"><div class="code"><pre class="ini" style="font-family:monospace;">worker_processes  <span style="">1</span><span style="color: #666666; font-style: italic;">;</span>
pid /var/run/nginx.pid<span style="color: #666666; font-style: italic;">;</span>
&nbsp;
&nbsp;
events <span style="">&#123;</span>
    worker_connections  <span style="">1024</span><span style="color: #666666; font-style: italic;">;</span>
<span style="">&#125;</span>
&nbsp;
http <span style="">&#123;</span>
    include       mime.types<span style="color: #666666; font-style: italic;">;</span>
    default_type  text/plain<span style="color: #666666; font-style: italic;">;</span>
&nbsp;
    sendfile        on<span style="color: #666666; font-style: italic;">;</span>
    keepalive_timeout  <span style="">65</span><span style="color: #666666; font-style: italic;">;</span>
&nbsp;
    server <span style="">&#123;</span>
        listen       <span style="">80</span><span style="color: #666666; font-style: italic;">;</span>
        server_name  localhost<span style="color: #666666; font-style: italic;">;</span>
&nbsp;
        # Lokasi root folder aplikasi,
        # sesuaikan dengan kondisi aplikasi Anda.
        location / <span style="">&#123;</span>
	    root   /var/www/public_html<span style="color: #666666; font-style: italic;">;</span>
            index  index.html index.htm<span style="color: #666666; font-style: italic;">;</span>
            autoindex on<span style="color: #666666; font-style: italic;">;</span>
            allow all<span style="color: #666666; font-style: italic;">;</span>
        <span style="">&#125;</span>
&nbsp;
        # Blok setting HTTP_Push_Module
	location /broadcast <span style="">&#123;</span>
&nbsp;
            # Blok ini baiknya dijadikan privte
            #dan hanya bisa diakses oleh PHP.
            <span style="color: #000099;">location</span> <span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;"> /broadcast/sub <span style="">&#123;</span></span>
&nbsp;
                set $push_channel_id $arg_channel<span style="color: #666666; font-style: italic;">;</span>
                push_subscriber<span style="color: #666666; font-style: italic;">;</span>
                push_subscriber_concurrency broadcast<span style="color: #666666; font-style: italic;">;</span>
                push_channel_group broadcast<span style="color: #666666; font-style: italic;">;</span>
&nbsp;
            <span style="">&#125;</span>
&nbsp;
            # Blok ini bisa direquest langsung oleh user,
            # atau melalui PHP.
            <span style="color: #000099;">location</span> <span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;"> /broadcast/pub <span style="">&#123;</span></span>
&nbsp;
                set $push_channel_id $arg_channel<span style="color: #666666; font-style: italic;">;</span>
                push_publisher<span style="color: #666666; font-style: italic;">;</span>
                push_message_timeout 5s<span style="color: #666666; font-style: italic;">;</span>
                push_channel_group broadcast<span style="color: #666666; font-style: italic;">;</span>
                push_store_messages off<span style="color: #666666; font-style: italic;">;</span>
&nbsp;
            <span style="">&#125;</span>
	<span style="">&#125;</span>
&nbsp;
        error_page   <span style="">500</span> <span style="">502</span> <span style="">503</span> <span style="">504</span>  /50x.html<span style="color: #666666; font-style: italic;">;</span>
        <span style="color: #000099;">location</span> <span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;"> /50x.html <span style="">&#123;</span></span>
            root   html<span style="color: #666666; font-style: italic;">;</span>
        <span style="">&#125;</span>
&nbsp;
        location ~ \.php$ <span style="">&#123;</span>
            root           html<span style="color: #666666; font-style: italic;">;</span>
            fastcgi_pass   127.0.0.1:<span style="">9000</span><span style="color: #666666; font-style: italic;">;</span>
            fastcgi_index  index.php<span style="color: #666666; font-style: italic;">;</span>
            fastcgi_param  SCRIPT_FILENAME  /var/www/public_html$fastcgi_script_name<span style="color: #666666; font-style: italic;">;</span>
            include        fastcgi_params<span style="color: #666666; font-style: italic;">;</span>
        <span style="">&#125;</span>
&nbsp;
        location ~ /\.ht <span style="">&#123;</span>
            deny  all<span style="color: #666666; font-style: italic;">;</span>
        <span style="">&#125;</span>
    <span style="">&#125;</span>
<span style="">&#125;</span></pre></div></div>

<p>Restart Nginx setelah melakukan konfigurasi:</p>

<div class="wp_syntax"><div class="code"><pre class="ini" style="font-family:monospace;">sudo /etc/init.d/nginx restart</pre></div></div>

<p>Sekarang buka browser dan masukan alamat:</p>

<div class="wp_syntax"><div class="code"><pre class="ini" style="font-family:monospace;">http://localhost/broadcast/sub?channel<span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;">123</span></pre></div></div>

<p>Jika browser loading seperti tidak selesai maka bisa dipastikan Nginx sudah berjalan dengan baik. Untuk pengujian proses publish/submit kita akan membuat file test.html yang berisi form submit. Berikut adalah contohnya:</p>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">&lt;html lang=&quot;en&quot;&gt;
&lt;head&gt;
    &lt;title&gt;&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;form action=&quot;http://localhost/broadcast/pub?channel=123&quot; method=&quot;post&quot;&gt;
        &lt;textarea name=&quot;text&quot;&gt;&lt;/textarea&gt;&lt;br /&gt;
        &lt;input type=&quot;submit&quot; name=&quot;submit&quot; /&gt;
    &lt;/form&gt;
&lt;/body&gt;
&lt;/html&gt;</pre></div></div>

<p>Buka file test.html dan buka juga halaman http://localhost/broadcast/sub?channel=123 pada tab browser yang berbeda. Isi form file test.html dan submit. Jika di halaman http://localhost/broadcast/sub?channel=123 memunculkan string yang diisikan pada halaman test.html, maka konfigurasi HTTP Push Module sudah berjalan dengan baik.</p>
<p>Pada pengujian ini kita melihat nilai argument <strong>123</strong>. Ini adalah identifier unik komunikasi channel antara publisher dan subscriber. Anda bisa menentukan nilai ini sesuai dengan kebutuhan.</p>
<p>Agar Nginx bisa berinteraksi dengan PHP, dibutuhkan sebuah interface FastCGI, untuk menginstallnya silahkan ketik:</p>

<div class="wp_syntax"><div class="code"><pre class="ini" style="font-family:monospace;">sudo apt-get install php5-fpm php5-cgi php5-dev php5-curl</pre></div></div>

<p>Aktifkan interface ini:</p>

<div class="wp_syntax"><div class="code"><pre class="ini" style="font-family:monospace;">sudo service php5-fpm start</pre></div></div>

<p>Sekarang kita akan membuat file PHP sebagai front-end interface. Berikut adalah isi filenya:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #009933; font-style: italic;">/**
 * PHP Comet with Nginx Http Push Module Handler
 *
 * @author &lt;k4ndar at yahoo dot com&gt;
 */</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// Set unlimited timeout</span>
<span style="color: #990000;">set_time_limit</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// Id channel</span>
<span style="color: #000088;">$channel_id</span>             <span style="color: #339933;">=</span> <span style="color: #0000ff;">'123'</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// Private internal Nginx url</span>
<span style="color: #000088;">$nginx_url_publish</span>      <span style="color: #339933;">=</span> <span style="color: #0000ff;">'http://localhost/broadcast/pub?channel='</span><span style="color: #339933;">.</span><span style="color: #000088;">$channel_id</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$nginx_url_subscribe</span>    <span style="color: #339933;">=</span> <span style="color: #0000ff;">'http://localhost/broadcast/sub?channel='</span><span style="color: #339933;">.</span><span style="color: #000088;">$channel_id</span><span style="color: #339933;">;</span>
&nbsp;
&nbsp;
<span style="color: #666666; font-style: italic;">//Handler untuk requst publisher</span>
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'text'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #339933;">!</span> <span style="color: #990000;">empty</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'text'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #000088;">$request_headers</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
        <span style="color: #0000ff;">'Content-type: application/json; charset=UTF-8'</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'Accept: application/json'</span>
    <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'status'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$response</span> <span style="color: #339933;">=</span> send_request<span style="color: #009900;">&#40;</span><span style="color: #000088;">$nginx_url_publish</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'POST'</span><span style="color: #339933;">,</span> <span style="color: #990000;">json_encode</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_POST</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$request_headers</span>  <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #990000;">header</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Content-type: application/json'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #990000;">die</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$response</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
&nbsp;
<span style="color: #666666; font-style: italic;">//Handler untuk requst subscriber</span>
<span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #000088;">$request_headers</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
        <span style="color: #0000ff;">'Accept: application/json'</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'Connection: keep-alive'</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'Cache-Control: max-age=0'</span>
    <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #339933;">!</span> <span style="color: #000088;">$response</span> <span style="color: #339933;">=</span> send_request<span style="color: #009900;">&#40;</span><span style="color: #000088;">$nginx_url_subscribe</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'GET'</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #339933;">,</span> <span style="color: #000088;">$request_headers</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span>
        <span style="color: #000088;">$response</span> <span style="color: #339933;">=</span> <span style="color: #990000;">json_encode</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'status'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'continue'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">// Pastikan browser tidak men-cache halaman ini.</span>
    <span style="color: #990000;">header</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Content-type: application/json'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #990000;">header</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Cache-Control: no-store, no-cache, must-revalidate'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #990000;">header</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Cache-Control: post-check=0, pre-check=0'</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">FALSE</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #990000;">header</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Pragma: no-cache'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #990000;">header</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Last-Modified: '</span> <span style="color: #339933;">.</span> <span style="color: #990000;">gmdate</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'D, j M Y H:i:s'</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">' GMT'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #990000;">die</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$response</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
&nbsp;
<span style="color: #009933; font-style: italic;">/**
 * HTTP POST/GET requet menggunakan cUrl
 *
 * @param string $uri Alamat url akses API
 * @param string $method HTTP method POST | GET | PUT | DELETE
 * @param array $data Data yang dikirimkan pada saat melakukan request
 * @param array $request_headers Header string yang ingin ditambahkan saat melakukan request
 * @param bool $response_output_header Flag untuk menampilkan string header atau tidak
 * @param int $timeout Waktu maksimum hingga koneksi timeout
 * @return string jika berhasil atau false jika gagal
 */</span>
<span style="color: #000000; font-weight: bold;">function</span> send_request<span style="color: #009900;">&#40;</span> <span style="color: #000088;">$uri</span><span style="color: #339933;">,</span> <span style="color: #000088;">$method</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'GET'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$data</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$request_headers</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$timeout</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">30</span><span style="color: #339933;">,</span> <span style="color: #000088;">$response_output_header</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">false</span> <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #000088;">$request_headers</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span>	<span style="color: #339933;">=</span> <span style="color: #0000ff;">'User-Agent: Comet Client/0.1'</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$method</span>		<span style="color: #339933;">=</span> <span style="color: #990000;">strtoupper</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$method</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$url_separator</span>	<span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span> <span style="color: #990000;">parse_url</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$uri</span><span style="color: #339933;">,</span> PHP_URL_QUERY <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> ? <span style="color: #0000ff;">'&amp;'</span> <span style="color: #339933;">:</span> <span style="color: #0000ff;">'?'</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$uri</span>		<span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span> <span style="color: #000088;">$method</span> <span style="color: #339933;">==</span> <span style="color: #0000ff;">'GET'</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #339933;">!</span> <span style="color: #990000;">empty</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$data</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> ? <span style="color: #000088;">$uri</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$url_separator</span> <span style="color: #339933;">.</span> <span style="color: #990000;">http_build_query</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$data</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">:</span> <span style="color: #000088;">$uri</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$c</span>			<span style="color: #339933;">=</span> <span style="color: #990000;">curl_init</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #990000;">curl_setopt</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$c</span><span style="color: #339933;">,</span> CURLOPT_RETURNTRANSFER<span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #990000;">curl_setopt</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$c</span><span style="color: #339933;">,</span> CURLOPT_URL<span style="color: #339933;">,</span> <span style="color: #000088;">$uri</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #990000;">curl_setopt</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$c</span><span style="color: #339933;">,</span> CURLOPT_TIMEOUT<span style="color: #339933;">,</span> <span style="color: #000088;">$timeout</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$response_output_header</span><span style="color: #009900;">&#41;</span>
        <span style="color: #990000;">curl_setopt</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$c</span><span style="color: #339933;">,</span> CURLOPT_HEADER<span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #339933;">!</span> <span style="color: #990000;">empty</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$data</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #000088;">$method</span> <span style="color: #339933;">!=</span> <span style="color: #0000ff;">'GET'</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
        <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">is_array</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$data</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span>
            <span style="color: #000088;">$data</span>   <span style="color: #339933;">=</span> <span style="color: #990000;">http_build_query</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$data</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #000088;">$request_headers</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span>  <span style="color: #339933;">=</span> <span style="color: #0000ff;">'Content-Length: '</span> <span style="color: #339933;">.</span> <span style="color: #990000;">strlen</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$data</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$method</span> <span style="color: #339933;">==</span> <span style="color: #0000ff;">'POST'</span> <span style="color: #009900;">&#41;</span>
            <span style="color: #990000;">curl_setopt</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$c</span><span style="color: #339933;">,</span> CURLOPT_POST<span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$method</span> <span style="color: #339933;">==</span> <span style="color: #0000ff;">'PUT'</span> <span style="color: #339933;">||</span> <span style="color: #000088;">$method</span> <span style="color: #339933;">==</span> <span style="color: #0000ff;">'DELETE'</span> <span style="color: #009900;">&#41;</span>
            <span style="color: #990000;">curl_setopt</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$c</span><span style="color: #339933;">,</span> CURLOPT_CUSTOMREQUEST<span style="color: #339933;">,</span> <span style="color: #000088;">$method</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #990000;">curl_setopt</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$c</span><span style="color: #339933;">,</span> CURLOPT_POSTFIELDS<span style="color: #339933;">,</span> <span style="color: #000088;">$data</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #990000;">curl_setopt</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$c</span><span style="color: #339933;">,</span> CURLOPT_HTTPHEADER<span style="color: #339933;">,</span> <span style="color: #000088;">$request_headers</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000088;">$contents</span> <span style="color: #339933;">=</span> <span style="color: #990000;">curl_exec</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$c</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #990000;">curl_close</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$c</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$contents</span><span style="color: #009900;">&#41;</span>
        <span style="color: #b1b100;">return</span> <span style="color: #000088;">$contents</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">return</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Kita juga akan membuat satu file index.html beserta Javascript-nya untuk menerima interaksi dari user. Berikut adalah isi filenya:</p>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">&lt;html lang=&quot;en&quot;&gt;
&lt;head&gt;
    &lt;title&gt;Chat Comet Demo - Nginx Http Push Module&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&nbsp;
&lt;div id=&quot;result&quot;&gt;Loading...&lt;/div&gt;
&lt;textarea name=&quot;text&quot;&gt;&lt;/textarea&gt;
&lt;!-- Silahkan sesuaikan Lokasi file jQuery ini--&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;https://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js&quot;&gt;&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot;&gt;
&nbsp;
settings = {
    socket:'response.php'
};
&nbsp;
$(document).ready( function() {
&nbsp;
    // Mengirimkan text ke server ketika user menekan enter.
    $('textarea').keydown(function(event) {
        if (event.keyCode == 13) {
            event.preventDefault();
&nbsp;
            var text = $(this).val();
&nbsp;
            if( text == '' || text == null )
                return false;
&nbsp;
            var callback = function (data){};
            $.post(settings.socket,{'text':text}, callback, 'json');
&nbsp;
            // Kosongkan isi textarea.
            $(this).val('');
&nbsp;
        }
    });
&nbsp;
    // Listener untuk mendapatkan data dari server dan menampilkan data terbaru ke dalam element.
    $.listener = function(){
&nbsp;
        subscribe = {url:settings.socket};
        // Hilangkan comment di bawah jika ingin mendapatkan data langsung dari nginx tanpa lewat PHP.
        //subscribe.url = 'http://localhost/broadcast/sub?channel=123';
&nbsp;
        $.getJSON(subscribe.url, function(data) {
            if(data.status == 'continue'){
                $.listener();
            }
            else{
                $('#result').append(data.text+'&lt;br /&gt;');
                $.listener();
            }
        }).error(function() {
            $.listener();
        });
    }
&nbsp;
    // Inisail proses
    $.init = function(){
        $('#result').html('');
        $.listener();
    }
&nbsp;
    // Start aplikasi 200 ms setelah semua komponen selesai diload.
    window.onload = function() {
        setTimeout ( '$.init()', 200 );
    }
});
&lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</pre></div></div>

<p>Buka browser dan jalankan file index.html. Jika loading sudah selesai ketikkan sesuatu pada bagian textarea dan tekan enter. Jika nilai yang Anda masukkan muncul maka comet sudah berjalan dengan baik. Buka juga satu tab baru dan kembali jalan kan file index.html ini. Lihat bagimana aplikasi comet ini bekerja.</p>
<p>Untuk mendownload seluruh source code tutorial ini, silahkan klik <a href="http://kandar.info/dt/nginx_PHP_http_push.tar.gz">di sini</a>.</p>
<p>Selamat mencoba!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kandar.info/index.php/ajax/aplikasi-comet-dengan-nginx-http-push-module/feed</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Aplikasi Comet dengan PHP</title>
		<link>http://www.kandar.info/index.php/ajax/aplikasi-comet-dengan-php</link>
		<comments>http://www.kandar.info/index.php/ajax/aplikasi-comet-dengan-php#comments</comments>
		<pubDate>Fri, 01 Jul 2011 14:13:36 +0000</pubDate>
		<dc:creator>kandar</dc:creator>
				<category><![CDATA[ajax]]></category>

		<guid isPermaLink="false">http://www.kandar.info/?p=152</guid>
		<description><![CDATA[Sudah cukup lama saya mendengar tentang istilah comet ini di dalam aplikasi web. Namun baru beberapa hari belakangan tertarik untuk mencobanya lebih jauh dan kemudian menuangkannya dalam tulisan ini. Comet adalah model aplikasi web dimana client dalam hal ini web browser melakukan long HTTP requst terhadap web server untuk mendapatkan informasi terbaru atau melakukan push [...]]]></description>
			<content:encoded><![CDATA[<p>Sudah cukup lama saya mendengar tentang istilah comet ini di dalam aplikasi web. Namun baru beberapa hari belakangan tertarik untuk mencobanya lebih jauh dan kemudian menuangkannya dalam tulisan ini.</p>
<p>Comet adalah model aplikasi web dimana client dalam hal ini web browser melakukan long HTTP requst terhadap web server untuk mendapatkan informasi terbaru atau melakukan push data tanpa diminta secara eksplisit oleh browser <a href="http://en.wikipedia.org/wiki/Comet_%28programming%29">http://en.wikipedia.org/wiki/Comet_(programming)</a>. Ada banyak istilah yang digunakan untuk comet ini seperti server push, ajax push, HTTP streaming dll.<span id="more-152"></span></p>
<p>Comet berguna untuk aplikasi yang didisain agar user mendapatkan update secara real-time atau ketika seorang user memberikan input kemudian butuh untuk segera di-broadcast ke user-user lainnya. Contohnya adalah aplikasi chating, aplikasi kolaborasi, multi-player game dll. Contoh layanan yang sudah menggunakan model ini adalah Google Talk Web, Google Plus, Google Wave, Facebook, Meebo dll.</p>
<p>Web server dan bahasa pemrograman yang digunakan menjadi perhatian utama pada comet. Hal ini disebabkan server harus bisa menangani koneksi yang terus menerus (persistent) tanpa melakukan bloking terhadap koneksi yang lain. Kekhasan ini kemudian memunculkan beberapa aplikasi yang secara khusus dibuat untuk model seperti ini seperti, <a href="http://www.tornadoweb.org/">Tornado</a>, <a href="http://nodejs.org/">Node.js</a>, <a href="http://www.ape-project.org/">APE (Ajax Push Engine)</a>, <a href="http://code.google.com/appengine/docs/python/channel/">Google App Engine The Channel API</a> dll.</p>
<p>Ada anggapan bahwa PHP bukan bahasa yang tepat untuk aplikasi comet. Namun menurut saya hal ini tidak sepenuhnya benar. Contoh sukses yang menggunakan PHP untuk comet dengan sekala besar adalah <a href="http://www.meebo.com/">Meebo</a>. Yang perlu diperhatikan adalah web server apa yang akan dugunakan untuk mendampingi PHP.</p>
<p>Apache masih bisa kita gunakan pada level developement. Namun, untuk production sangat tidak disarankan untuk menggunakan Apache. Alternatif web server yang bisa kita gunakan adalah <a href="http://wiki.nginx.org/">Nginx</a>. Khusus untuk model comet ini telah tersedia modul yang bisa digunakan, yaitu <a href="http://pushmodule.slact.net/">NGiNX HTTP Push Module</a> ataupun <a href="https://github.com/wandenberg/nginx-push-stream-module">Nginx Push Stream Module</a>. Implementasi NGiNX HTTP Push Module secara khusus akan dibahas pada artikel yang lain. Selanjutnya fokus tulisan ini lebih pada pemrograman PHP sebagai broadcaster dan Javascript sebagai listener.</p>
<p>Sebelum membahas lebih jauh, berikut adalah demo dari apa yang akan kita bahas. Gunakan beberapa browser untuk melihat bagaimana aplikasinya bekerja.</p>
<p><a target="_blank" href="http://www.makenear.com/comet/chat_box">Chat Box</a><br />
<a target="_blank" href="http://www.makenear.com/comet/collaboration">Collaboration</a><br />
<a target="_blank" href="http://www.makenear.com/comet/webnews">Webnews</a> dan <a target="_blank" href="http://www.makenear.com/comet/webnews_editor">CMS-nya</a></p>
<p>Setidaknya dibutuhkan Memory Object Storage seperti <a href="http://php.net/manual/en/book.apc.php">APC</a> ataupun <a href="http://php.net/manual/en/book.memcache.php">Memcache</a> dalam tutorial ini. Pastikan environment development yang Anda gunakan sudah mendukung salah satu ekstensi ini.</p>
<p>Pertama-tama buat sebuah file dengan nama response.php yang isinya seperti berikut:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #009933; font-style: italic;">/**
 *
 * Simple comet response.
 *
 * Media yang digunakan sebagai tempat penyimpanan sementara
 * adalah APC. Object storage yang bisa digunakan selain APC
 * adalah Memcached, eAccelerator (versi Release-0.9.5 ke bawah),
 * xcache ataupun Zend Data Cache.
 *
 * Matrix fungsi antara APC dan Memcached:
 * apc_fetch() = memcache_get()
 * apc_store() = memcache_set()
 * apc_delete() = memcache_delete()
 * 
 */</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// Prefix namespace untuk penghapusan bersamaan.</span>
<span style="color: #000088;">$namespace</span>  <span style="color: #339933;">=</span> <span style="color: #0000ff;">'namespace'</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// Object key</span>
<span style="color: #000088;">$cache_key</span>  <span style="color: #339933;">=</span> <span style="color: #0000ff;">'comet_chat'</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// Client unik id</span>
<span style="color: #000088;">$client_id</span>  <span style="color: #339933;">=</span> <span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'client_id'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// Buat object namespace</span>
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #339933;">!</span> <span style="color: #000088;">$ns_key</span> <span style="color: #339933;">=</span> apc_fetch<span style="color: #009900;">&#40;</span><span style="color: #000088;">$namespace</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$ns_key</span> <span style="color: #339933;">=</span> <span style="color: #990000;">time</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    apc_store<span style="color: #009900;">&#40;</span><span style="color: #000088;">$namespace</span><span style="color: #339933;">,</span> <span style="color: #000088;">$ns_key</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// Client id dengan nilai dari namespace prefix</span>
<span style="color: #000088;">$client_id</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'client_'</span><span style="color: #339933;">.</span><span style="color: #000088;">$ns_key</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'_'</span><span style="color: #339933;">.</span><span style="color: #000088;">$client_id</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// Jika client id belum pernah ada, buat baru.</span>
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #339933;">!</span> apc_fetch<span style="color: #009900;">&#40;</span><span style="color: #000088;">$client_id</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span>
    apc_store<span style="color: #009900;">&#40;</span> <span style="color: #000088;">$client_id</span><span style="color: #339933;">,</span> <span style="color: #990000;">rand</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// Menerima request post</span>
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'text'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
&nbsp;
    apc_store<span style="color: #009900;">&#40;</span> <span style="color: #000088;">$cache_key</span><span style="color: #339933;">,</span> <span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'client_id'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">': '</span><span style="color: #339933;">.</span><span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'text'</span><span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    apc_delete<span style="color: #009900;">&#40;</span><span style="color: #000088;">$namespace</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #990000;">die</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">json_encode</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'status'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// 20 detik dari sekarang.</span>
<span style="color: #000088;">$next_time</span> <span style="color: #339933;">=</span> <span style="color: #990000;">strtotime</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'+ 20 sec'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">// Buat ulang object namespace jika belum ada</span>
    <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #339933;">!</span> <span style="color: #000088;">$ns_key</span> <span style="color: #339933;">=</span> apc_fetch<span style="color: #009900;">&#40;</span><span style="color: #000088;">$namespace</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
        <span style="color: #000088;">$ns_key</span> <span style="color: #339933;">=</span> <span style="color: #990000;">time</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        apc_store<span style="color: #009900;">&#40;</span><span style="color: #000088;">$namespace</span><span style="color: #339933;">,</span> <span style="color: #000088;">$ns_key</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">// Dapatkan client id yang sudah ditambah dengan value namespace</span>
    <span style="color: #000088;">$client_id</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'client_'</span><span style="color: #339933;">.</span><span style="color: #000088;">$ns_key</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'_'</span><span style="color: #339933;">.</span><span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'client_id'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">// Jika client dengan namespace ini tidak ada, maka</span>
    <span style="color: #666666; font-style: italic;">// client akan dikirimkan data terbaru.</span>
    <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #339933;">!</span> apc_fetch<span style="color: #009900;">&#40;</span><span style="color: #000088;">$client_id</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
        apc_store<span style="color: #009900;">&#40;</span> <span style="color: #000088;">$client_id</span><span style="color: #339933;">,</span> <span style="color: #990000;">rand</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #000088;">$respnose</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
            <span style="color: #0000ff;">'status'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">,</span>
            <span style="color: #0000ff;">'content'</span> <span style="color: #339933;">=&gt;</span> apc_fetch<span style="color: #009900;">&#40;</span><span style="color: #000088;">$cache_key</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #990000;">die</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">json_encode</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$respnose</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">// Jika waktu lebih dari 20 detik dari yg sudah ditentukan,</span>
    <span style="color: #666666; font-style: italic;">// stop eksekusi.</span>
    <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$next_time</span> <span style="color: #339933;">&lt;</span> <span style="color: #990000;">time</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
        <span style="color: #990000;">flush</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #990000;">die</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">json_encode</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'status'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'continue'</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #990000;">flush</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">die</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">json_encode</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'status'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'continue'</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Buat sebuah file simple.html yang digunakan untuk menerima sekaligus mengirimkan data ke file response.php. Berikut adalah isinya:</p>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.01//EN&quot;
    &quot;http://www.w3.org/TR/html4/strict.dtd&quot;
    &gt;
&lt;html lang=&quot;en&quot;&gt;
&lt;head&gt;
    &lt;title&gt;Chat Comet Demo&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&nbsp;
&lt;div id=&quot;result&quot;&gt;Loading...&lt;/div&gt;
&lt;textarea name=&quot;text&quot;&gt;&lt;/textarea&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;https://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js&quot;&gt;&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot;&gt;
&nbsp;
settings = {
    // Generate unik id
    client_id:new Date().getTime(),
    socket:'response.php'
};
&nbsp;
$(document).ready( function() {
&nbsp;
    // Mengirimkan text ke server ketika user menekan enter.
    $('textarea').keydown(function(event) {
        if (event.keyCode == 13) {
            event.preventDefault();
&nbsp;
            var text = $(this).val();
&nbsp;
            if( text == '' || text == null )
                return false;
&nbsp;
            var callback = function (data){};
            $.post(settings.socket+'?client_id='+settings.client_id,{'text':text}, callback, 'json');
&nbsp;
            // Kosongkan isi textarea.
            $(this).val('');
&nbsp;
        }
    });
&nbsp;
    // Listener untuk mendapatkan data dari server dan menampilkan data terbaru ke dalam element.
    $.listener = function(){
        $.getJSON(settings.socket, {client_id:settings.client_id}, function(data) {
            if(data.status == 'continue'){
                $.listener();
            }
            else{
                $('#result').append(data.content+'&lt;br /&gt;');
                $.listener();
            }
        }).error(function() {
            $.listener();
        });
    }
&nbsp;
    // Inisail proses
    $.init = function(){
        $('#result').html('');
        $.listener();
    }
&nbsp;
    // Start aplikasi 200 ms setelah semua komponen selesai diload.
    window.onload = function() {
        setTimeout ( '$.init()', 200 );
    }
});
&lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</pre></div></div>

<p>Tempatkan kedua file ini dalam direktori yang sama. Sekarang akses file simple.html dan ketikan sesuatu. Jika tidak ada masalah, kini contoh aplikasi comet sudah berjalan.</p>
<p>Terakhir pastikan web server yang digunakan sudah diset <a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec8.html">http header keep-alive</a> untuk memastikan koneksi yang digunakan tetap persistent.</p>
<p>Untuk mendownload seluruh demo yang digunakan silahkan klik <a href="http://www.makenear.com/sourcecode/comet_demo.tar.gz">di sini</a></p>
<p>Selamat ber-comet-ria!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kandar.info/index.php/ajax/aplikasi-comet-dengan-php/feed</wfw:commentRss>
		<slash:comments>19</slash:comments>
		</item>
		<item>
		<title>Mengengembangkan Single Sign On System (SSO) menggunakan OAuth 2.0</title>
		<link>http://www.kandar.info/index.php/php/mengengembangkan-single-sign-on-system-sso-menggunakan-oauth-2-0</link>
		<comments>http://www.kandar.info/index.php/php/mengengembangkan-single-sign-on-system-sso-menggunakan-oauth-2-0#comments</comments>
		<pubDate>Thu, 05 May 2011 10:12:34 +0000</pubDate>
		<dc:creator>kandar</dc:creator>
				<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.kandar.info/?p=140</guid>
		<description><![CDATA[OAuth merupakan sebuah protokol yang saat ini mulai banyak digunakan oleh penyedia layanan internet seperti Facebook, Yahoo, Twitter, Google dll. Protokol ini membantu sharing informasi dan sumberdaya pribadi seseorang dari suatu aplikasi ke aplikasi lainnya dengan cara yang lebih aman tanpa perlu user memberikan passwordnya. Untuk mendapatkan informasi ini, user terlebih dahulu harus memberikan izin [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://oauth.net/" target="_blank">OAuth</a> merupakan sebuah protokol yang saat ini mulai banyak digunakan oleh penyedia layanan internet seperti Facebook, Yahoo, Twitter, Google dll. Protokol ini membantu sharing informasi dan sumberdaya pribadi seseorang dari suatu aplikasi ke aplikasi lainnya dengan cara yang lebih aman tanpa perlu user memberikan passwordnya. Untuk mendapatkan informasi ini, user terlebih dahulu harus memberikan izin kepada aplikasi pihak ketiga yang ingin mendapatkan informasi tentang dirinya.<br />
<span id="more-140"></span><br />
<a href="http://oauth.net/2/" target="_blank">OAuth 2.0</a> adalah pengembangan dari OAuth versi 1 yang dibuat dengan tujuan untuk menyederhanakan dan mempermudah proses alur pertukaran data. Walaupun demikian OAuth 2 sama sekali berbeda dengan OAuth versi 1 sehingga aplikasi yang baru mendukung versi 1 tidak lagi bisa digunakan. Provider yang masih menggunakan OAuth versi 1 diantaranya Yahoo, Google dan Twitter. Sedangkan yang sudah mendukung versi 2 adalah Facebook, Google (experimental) dan Github. Untuk selanjutnya pembahasan dalam artikel ini hanya menitikberatkan pada OAuth 2.0.</p>
<p>Dalam proses ini setidaknya terdapat dua aplikasi yang saling berinteraksi satu sama lain. Aplikasi yang menyediakan sumberdaya disebut OAuth Provider dan yang menerima disebut OAuth client.</p>
<p>Sebelum membahas lebih lanjut, mari kita lihat bagai mana protokol ini bekerja dengan menggunakan Facebook sebagai OAuth provider.</p>
<p><a href="http://panadaframework.com/samples/oauth2" target="_blank">http://panadaframework.com/samples/oauth2</a></p>
<p>Sebagaimana kita lihat dari contoh diatas, aplikasi tersebut bisa mendapatkan informasi tentang Anda tanpa perlu lagi memberitahukan informasi apapun. Mekanisme seperti ini bisa kita manfaatkan untuk mengembangkan sistem Single Sign On pada aplikasi kita sendiri.</p>
<p><a href="http://en.wikipedia.org/wiki/Single_sign-on" target="_blank">SSO</a> umumnya digunakan pada suatu layanan yang memiliki banyak aplikasi yang masing-masing aplikasi ini berdiri sendiri. Sebagai contoh jika kita memberikan layanan blog dimana user bisa menggunakan layanan ini dengan cara memasukan username dan password, maka ketika kita memiliki layanan lain misalnya forum ada baiknya user yang ingin memanfaatkan layanan ini tidak perlu dimintakan password dan usernamenya lagi. Contoh dari layanan yang sudah menerapkan mekanisme SSO untuk semua layanannya adalah Google dan Yahoo. Silahkan buka dan login di <a href="http://www.google.com/" target="_blank">www.google.com</a>. Setelah login silahkan buka tab baru di browser dan buka halaman <a href="http://goo.gl/" target="_blank">goo.gl</a>. Sebagaimana Anda lihat, setelah berhasil login di halaman muka google.com kita juga bisa langsung menikmati layanan lainnya dari google tanpa perlu lagi memasukan username atau password.</p>
<h3>Istilah pada OAuth</h3>
<h4>Client Id dan Client Secret</h4>
<p>Untuk memanfaatkan resource dari aplikasi provider, aplikasi client harus memiliki client id dan client secret yang diberikan oleh aplikasi provider. Berikut adalah halaman untuk mendapatkan client id dan client secret untuk beberapa layanan OAuth Provider:</p>
<p>Facebook: <a href="https://www.facebook.com/developers/createapp.php" target="_blank">https://www.facebook.com/developers/createapp.php</a></p>
<p>Google: <a href="http://code.google.com/apis/console" target="_blank">http://code.google.com/apis/console</a></p>
<p>Github: <a href="http://github.com/account/applications/new" target="_blank">http://github.com/account/applications/new</a></p>
<h4>Redirect Uri</h4>
<p>Ini adalah sebuah halaman yang dipersiapkan khusus oleh aplikasi client untuk memproses callback yang diberikan aplikasi provider. Pada halaman ini aplikasi client akan mengolah informasi yang diberikan oleh aplikasi provider berupa code unik yang harus digunakan untuk proses selanjutnya.</p>
<h4>Code</h4>
<p>Code adalah sebuah string unik yang diberikan aplikasi provider kepada aplikasi client pada halaman callback yang sebelumnya sudah didefenisikan pada parameter redirect uri. Code dibutuhkan untuk kemudian ditukarkan kembali ke aplikasi provider untuk mendapatkan access token.</p>
<h4>Access Token</h4>
<p>Access token adalah sebuah string penanda izin otorisasi yang dibutuhkan aplikasi cilent untuk memanfaatkan sumberdaya seorang user yang ada di aplikasi provider. Jika client sudah mendapatkan acces token dari provider maka pertukaran data sudah bisa dilakukan misalnya untuk mendapatkan nama user, foto, email, memposting artikel ke aplikasi provider dll.</p>
<h4>Scope</h4>
<p>Scope adalah opsi tambahan untuk mendapatkan informasi spsifik pada user yang umumnya secara default tidak langsung diberikan oleh aplikasi provider.</p>
<h3>Alur Protokol</h3>
<p>Berikut adalah tahapan-tahapan yang harus dilakukan pada OAuth 2:</p>
<p style="text-align: center;">&nbsp;</p>
<div id="attachment_144" class="wp-caption aligncenter" style="width: 510px"><a href="http://www.kandar.info/wp-content/uploads/2011/05/oauth2_flow.png"><img class="size-medium wp-image-144 " title="oauth2_flow" src="http://www.kandar.info/wp-content/uploads/2011/05/oauth2_flow.png" alt="" width="500" height="427" /></a><p class="wp-caption-text">Oauth 2.0 Work Flow</p></div>
<h4>User Authentication</h4>
<p>Pertama-tama user harus login dan melakukan proses otentifikasi di aplikasi provider. Aplikasi client harus me-redirect usernya ke sebuah halaman otentifikasi yang sudah ditentukan oleh aplikasi provider. Pada saat melakukan proses ini, aplikasi client harus menyertakan parameter client_id dan redirect_uri pada alamat url halaman otentifikasi. Contohnya seperti berikut:</p>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">https://www.appprovider.com/login_page?client_id=YOUR_APP_ID&amp;redirect_uri=YOUR_URL</pre></div></div>

<p>Contoh halaman otentifikasi Facebook:</p>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">https://www.facebook.com/dialog/oauth?client_id=YOUR_APP_ID&amp;redirect_uri=YOUR_URL</pre></div></div>

<p>Contoh halaman otentifikasi Google:</p>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">https://accounts.google.com/o/OAuth 2/auth?client_id=YOUR_APP_ID&amp;redirect_uri=YOUR_URL</pre></div></div>

<p>Contoh halaman otentifikasi Github:</p>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">https://github.com/login/oauth/authorize?client_id=YOUR_APP_ID&amp;redirect_uri=YOUR_URL</pre></div></div>

<p>Jika proses login berhasil, user kemudian akan dibawa kehalaman dialog dimana dia akan diberikan pilihan apakah akan mengizinkan resource-nya diakses oleh aplikasi client atau tidak. Jika user memberikan uzin, maka selanjutnya user akan diredirect ke halaman callback aplikasi client yang nilainya sudah diisikan pada parameter redirect_uri.</p>
<p>Proses konfirmasi ini hanya dilakukan sekali saja. Jika user sudah pernah memberikan izin maka akan langsung diarahkan ke halaman callback.</p>
<p>Jika aplikasi client membutuhkan informasi tambahan yang tidak langsung disediakan oleh aplikasi client, maka pada tahap ini parameter scope bisa ditambahakan. Setiap penyedia layanan OAuth provider memiliki daftarnya sendiri-sendiri. Sebagai contoh berikut contoh penggunaan scope pada halaman otentifikasi Facebook:</p>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">https://www.facebook.com/dialog/oauth?client_id=YOUR_CLIENT_ID&amp;redirect_uri=YOUR_URL&amp;scope=email,read_stream</pre></div></div>

<p>Daftar pilihan scope Facebook bisa dilihat di halaman <a href="https://developers.facebook.com/docs/authentication/permissions" target="_blank">https://developers.facebook.com/docs/authentication/permissions</a></p>
<p>Contoh penggunaan scope pada Google</p>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">https://accounts.google.com/o/OAuth 2/auth?client_id=YOUR_CLIENT_ID&amp;redirect_uri=YOUR_URL&amp;scope=https://mail.google.com/mail/feed/atom/&amp;response_type=code</pre></div></div>

<h4>Mendapatkan Access Token</h4>
<p>Setelah user diredirect ke halaman callback aplikasi client, maka proses selanjutnya adalah memanfaatkan argument code yang disertakan pada alamat url. Contoh alamat url halaman callback yang di-redirect dari aplikasi provider:</p>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">http://www.appclient.com/callback_page?code=A_CODE_GENERATED_BY_PROVIDER</pre></div></div>

<p>Proses selanjutnya adalah mengirimkan kembali nilai variabel code ke aplikasi provider melalui hattp request untuk ditukarkan dengan akses token. Jika berhasil API aplikasi provider akan memberikan response string yang berisi access token dan berapa lama masa berlakunya.</p>
<p>String access token yang sudah didapatkan harus disimpan untuk keperluan penggunaan resource user pada aplikasi provider.</p>
<h4>Menggunakan Resource User</h4>
<p>Sampai pada tahap ini aplikasi client sudah siap untuk memanfaatkan resource yang tersedia pada aplikasi provider. Sebagai contoh jika kita ingin mendapatkan nama dan informasi tentang user maka aplikasi client harus melakukan request ke apliaksi provider dengan alamat yang sudah ditentukan olehnya dengan menyertakan access token yang sudah didapatkan sebelumnya. Sebagai contoh jika ingin mendapatkan basic info dari Facebook alamat API yang harus diakses dengan method GET adalah:</p>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">https://graph.facebook.com/me?access_token=ACCESS_TOKEN</pre></div></div>

<p>Contoh mendapatkan user info pada Gituhub:</p>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">https://github.com/api/v2/json/user/show?access_token=ACCESS_TOKEN</pre></div></div>

<p>Contoh memposting artikel di Blogger:</p>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">POST http://www.blogger.com/feeds/blogID/posts/default?oauth_token=ACCESS_TOKEN
dengan isi body post:
&nbsp;
&lt;entry xmlns='http://www.w3.org/2005/Atom'&gt;
  &lt;title type='text'&gt;Marriage!&lt;/title&gt;
  &lt;content type='xhtml'&gt;
    &lt;div xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&gt;
      &lt;p&gt;Mr. Darcy has &lt;em&gt;proposed marriage&lt;/em&gt; to me!&lt;/p&gt;
      &lt;p&gt;He is the last man on earth I would ever desire to marry.&lt;/p&gt;
      &lt;p&gt;Whatever shall I do?&lt;/p&gt;
    &lt;/div&gt;
  &lt;/content&gt;
  &lt;category scheme=&quot;http://www.blogger.com/atom/ns#&quot; term=&quot;marriage&quot; /&gt;
  &lt;category scheme=&quot;http://www.blogger.com/atom/ns#&quot; term=&quot;Mr. Darcy&quot; /&gt;
&lt;/entry&gt;</pre></div></div>

<h3>Membuat Aplikasi Client</h3>
<p>Berikut kita akan membuat contoh aplikasi client OAuth dengan menggunakan Facebook sebagai OAuth provider. Pastikan Anda telah memiliki client id dan client secret yang diberikan oleh Facebook. Silahkan mendaftar di halaman <a href="https://www.facebook.com/developers/createapp.php" target="_blank">ini</a> jika belum.</p>
<p>Pada contoh yang akan digunakan menggunakan framework Panada, namun bisa juga diimplementasikan pada framework lain atau bahkan PHP scratch. Sebagai catatan contoh yang digunakan di bawah ini ditulis sesederhana mungkin sehingga mengabaikan pakem MVC dengan tujuan untuk mempermudah penjelasan.</p>
<p>Pertama-tama kita membutuhkan dua buah file class PHP yaitu oauth2_client.php dan rest.php. Kedua file ini bisa didownload di sini:</p>
<p><a href="http://kandar.info/dt/sso_oauth2.tar.gz">http://kandar.info/dt/sso_oauth2.tar.gz</a></p>
<p>Khusus bagi Anda yang menggunakan <a href="http://panadaframework.com/" target="_blank">Panada</a>, class <a href="http://panadaframework.com/documentation/id/classes/rest.html" target="_blank">rest</a> sudah tersedia pada core library sehingga tidak perlu lagi didownload.</p>
<p>Buat sebuah controller baru bernama auth bagi Anda yang menggunakan framework atau file baru bernama auth.php bagi yang memilih scratch.</p>
<p>Letakan oauth2_client.php dan rest.php pada folder library atau vendor atau apapun namanya di dalam framework yang Anda gunakan. Sedakan pada PHP scratch letakan satu level dengan file auth.php agar lebih mudah untuk melakukan include. Jika folder document root localhost Anda berada di:</p>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">/var/www/public_html/</pre></div></div>

<p>Maka tambahkan satu folder beru bernama client, sehingga strukturnya menjadi:</p>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">/var/www/public_html/client/</pre></div></div>

<p>Berikut adalah isi controller auth pada Panada:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> Controller_auth <span style="color: #000000; font-weight: bold;">extends</span> Panada <span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> __construct<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
&nbsp;
        parent<span style="color: #339933;">::</span>__construct<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">rest</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Library_rest<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">oauth2_client</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Library_oauth2_client<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">oauth2_client</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">client_id</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'MY_CLIENT_ID'</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">oauth2_client</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">client_secret</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'MY_CLIENT_SECRET'</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">oauth2_client</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">redirect_uri</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'http://localhost/client/auth/callback'</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> index<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
&nbsp;
        <span style="color: #000088;">$provider_auth_uri</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'https://www.facebook.com/dialog/oauth'</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$more_args</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'scope'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'email'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">oauth2_client</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">user_authentication</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$provider_auth_uri</span><span style="color: #339933;">,</span> <span style="color: #000088;">$more_args</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> callback<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
&nbsp;
        <span style="color: #000088;">$code</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'code'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$provider_token_uri</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'https://graph.facebook.com/oauth/access_token'</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #000088;">$response</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">oauth2_client</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">get_access_token</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$provider_token_uri</span><span style="color: #339933;">,</span> <span style="color: #000088;">$code</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #990000;">parse_str</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$response</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #000088;">$provider_uri</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'https://graph.facebook.com/me'</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #000088;">$response</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">oauth2_client</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">access_user_resources</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$provider_uri</span><span style="color: #339933;">,</span> <span style="color: #000088;">$access_token</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #000088;">$data</span> <span style="color: #339933;">=</span> <span style="color: #990000;">json_decode</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$response</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #990000;">print_r</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$data</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Berikut isi file auth.php pada PHP scretch:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
&nbsp;
<span style="color: #b1b100;">require_once</span> <span style="color: #0000ff;">'rest.php'</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">require_once</span> <span style="color: #0000ff;">'oauth2_client.php'</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$rest</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Library_rest<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$oauth2_client</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Library_oauth2_client<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$oauth2_client</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">client_id</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'MY_CLIENT_ID'</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$oauth2_client</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">client_secret</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'MY_CLIENT_SECRET'</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$oauth2_client</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">redirect_uri</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'http://localhost/client/auth.php?callback'</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'login'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #000088;">$provider_auth_uri</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'https://www.facebook.com/dialog/oauth'</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$more_args</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'scope'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'email'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000088;">$oauth2_client</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">user_authentication</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$provider_auth_uri</span><span style="color: #339933;">,</span> <span style="color: #000088;">$more_args</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'callback'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #000088;">$code</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'code'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$provider_token_uri</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'https://graph.facebook.com/oauth/access_token'</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000088;">$response</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$oauth2_client</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">get_access_token</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$provider_token_uri</span><span style="color: #339933;">,</span> <span style="color: #000088;">$code</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #990000;">parse_str</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$response</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000088;">$provider_uri</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'https://graph.facebook.com/me'</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000088;">$response</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$oauth2_client</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">access_user_resources</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$provider_uri</span><span style="color: #339933;">,</span> <span style="color: #000088;">$access_token</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000088;">$data</span> <span style="color: #339933;">=</span> <span style="color: #990000;">json_decode</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$response</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #990000;">print_r</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$data</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Sekarang akses alamat <a href="http://localhost/client/auth">http://localhost/client/auth</a> jika Anda menggunakan framework atau alamat <a href="http://localhost/client/auth.php?login">http://localhost/client/auth.php?login</a> jika PHP scratch.</p>
<p>Jika tidak ada masalah akan muncul dump array yang berisi data personal Anda yang ada di Facebook. Data inilah yang kemudian akan kita manfaatkan untuk meng-otentifikasi user pada aplikasi kita.</p>
<p>Data ini bisa kita gunakan untuk:</p>
<ol>
<li> Melakukan pengecekan ke dalam database apakah data user ini sudah pernah tersimpan sebelumnya. Field email bisa kita gunakan sebagai identifer unik. Jika tidak ada maka simpan datanya ke dalam database.</li>
<li> Jika data sudah pernah tersimpan kita bisa langsung menyimpan nilai-nilainya ke dalam session dan memastikan user sudah terotentifikasi di aplikasi kita.</li>
</ol>
<p>Berikut contoh kode implementasi data yang sudah didapat dan di-assign menjadi session pada framework Panada:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> Controller_auth <span style="color: #000000; font-weight: bold;">extends</span> Panada <span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> __construct<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
&nbsp;
        parent<span style="color: #339933;">::</span>__construct<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">rest</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Library_rest<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">oauth2_client</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Library_oauth2_client<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">session</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Library_session<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
&nbsp;
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">oauth2_client</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">client_id</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'126220237453638'</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">oauth2_client</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">client_secret</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'d363579077a9ef22c5bbd871736212f1'</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">oauth2_client</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">redirect_uri</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'http://panadaframework.com/auth/callback'</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> index<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
&nbsp;
        <span style="color: #000088;">$provider_auth_uri</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'https://www.facebook.com/dialog/oauth'</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #000088;">$more_args</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'scope'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'email'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">oauth2_client</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">user_authentication</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$provider_auth_uri</span><span style="color: #339933;">,</span> <span style="color: #000088;">$more_args</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> callback<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
&nbsp;
        <span style="color: #000088;">$code</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'code'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$provider_token_uri</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'https://graph.facebook.com/oauth/access_token'</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #000088;">$response</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">oauth2_client</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">get_access_token</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$provider_token_uri</span><span style="color: #339933;">,</span> <span style="color: #000088;">$code</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #990000;">parse_str</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$response</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #000088;">$provider_uri</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'https://graph.facebook.com/me'</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #000088;">$response</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">oauth2_client</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">access_user_resources</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$provider_uri</span><span style="color: #339933;">,</span> <span style="color: #000088;">$access_token</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #000088;">$data</span> <span style="color: #339933;">=</span> <span style="color: #990000;">json_decode</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$response</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">session</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">set</span><span style="color: #009900;">&#40;</span>
            <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
                <span style="color: #0000ff;">'is_login'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">,</span>
                <span style="color: #0000ff;">'name'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$data</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">name</span><span style="color: #339933;">,</span>
                <span style="color: #0000ff;">'id'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$data</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">id</span><span style="color: #339933;">,</span>
            <span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">redirect</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'auth/restricted_page'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> restricted_page<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
&nbsp;
        <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #339933;">!</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">session</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">get</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'is_login'</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span>
            <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">redirect</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'auth'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'Selamat datang &lt;b&gt;'</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">session</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">get</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'name'</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">'&lt;/b&gt; | &lt;a href=&quot;'</span><span style="color: #339933;">.</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">location</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'auth/signout'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'&quot;&gt;Sign Out&lt;/a&gt;'</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> signout<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
&nbsp;
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">session</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">session_clear_all</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'Anda kini telah logout. Klik &lt;a href=&quot;'</span><span style="color: #339933;">.</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">location</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'auth'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'&quot;&gt;Sign In&lt;/a&gt; untuk kembali login.'</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Implementasi juga bisa diterapkan aplikasi non framework. Berikut isi file auth.php pada PHP scretch:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #990000;">session_start</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">require_once</span> <span style="color: #0000ff;">'rest.php'</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">require_once</span> <span style="color: #0000ff;">'oauth2_client.php'</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$rest</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Library_rest<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$oauth2_client</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Library_oauth2_client<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$oauth2_client</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">client_id</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'126220237453638'</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$oauth2_client</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">client_secret</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'d363579077a9ef22c5bbd871736212f1'</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$oauth2_client</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">redirect_uri</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'http://panadaframework.com/auth.php?callback'</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'login'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #000088;">$provider_auth_uri</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'https://www.facebook.com/dialog/oauth'</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$more_args</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'scope'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'email'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000088;">$oauth2_client</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">user_authentication</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$provider_auth_uri</span><span style="color: #339933;">,</span> <span style="color: #000088;">$more_args</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'callback'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #000088;">$code</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'code'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$provider_token_uri</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'https://graph.facebook.com/oauth/access_token'</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000088;">$response</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$oauth2_client</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">get_access_token</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$provider_token_uri</span><span style="color: #339933;">,</span> <span style="color: #000088;">$code</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #990000;">parse_str</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$response</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000088;">$provider_uri</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'https://graph.facebook.com/me'</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000088;">$response</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$oauth2_client</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">access_user_resources</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$provider_uri</span><span style="color: #339933;">,</span> <span style="color: #000088;">$access_token</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000088;">$data</span> <span style="color: #339933;">=</span> <span style="color: #990000;">json_decode</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$response</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000088;">$_SESSION</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'is_login'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$_SESSION</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'name'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$data</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">name</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$_SESSION</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'id'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$data</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">id</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #990000;">header</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Location:auth.php?restricted_page'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #990000;">exit</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'restricted_page'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #339933;">!</span> <span style="color: #000088;">$_SESSION</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'is_login'</span><span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span>
        <span style="color: #990000;">header</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Location:auth.php?login'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'Selamat datang &lt;b&gt;'</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$_SESSION</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'name'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">'&lt;/b&gt; | &lt;a href=&quot;auth.php?signout&quot;&gt;Sign Out&lt;/a&gt;'</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'signout'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #990000;">session_unset</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #990000;">session_destroy</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'Anda kini telah logout. Klik &lt;a href=&quot;auth.php?login&quot;&gt;Sign In&lt;/a&gt; untuk kembali login.'</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<h3>Membuat Aplikasi Provider</h3>
<p>Sampai pada tahap ini kita sudah berhasil membuat aplikasi OAuth client dan memanfaatkan datanya untuk otentifikasi pada aplikasi kita. Untuk mengembangakn sistem SSO pada layanan yang kita kelola sendiri, kita membutuhkan sebuah aplikasi provider. Aplikasi ini nantinya juga akan kita manfaatkan sebagai pusat pengelolaan data dari seluruh member yang terdaftar pada seluruh layanan. Kalau kita perhatikan beberapa penyedia layanan internet yang telah mengimplementasikan SSO mereka juga melakukan pengelolaan user secara terpusat. Sebagai contoh Google akan mengarahkan user yang akan login di layanan mereka ke alamat https://www.google.com/accounts/Login?continue=ALAMAT_LAYANAN_GOOGLE dan Yahoo mengarahkan ke alamat https://login.yahoo.com/config/login_verify2?.intl=us&amp;.src=KODE_LAYANAN&amp;.done=ALAMAT_LAYANAN_YAHOO.</p>
<p>Perlu diperhatikan, OAuth 2.0 mensyaratkan penggunaan SSL (https) protokol untuk penggunaan production OAuth provider. Untuk kemudahan, semua contoh aplikasi provider dalam tulisan ini hanya menggunakan http.</p>
<p>Pertama-tama siapkan sebuah folder baru di document root dengan nama provider sehingga struktrunya seperti berikut:</p>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">/var/www/public_html/provider/</pre></div></div>

<p>Kita akan membuat satu file baru yang akan diletakan di dalam folder ini. Beri nama file tersebut user.php untuk non framework dan buat controller baru bernama user untuk yang menggunakan framework.</p>
<p>Untuk mengelola user kita membutuhkan sebuah database penyimpanan, misalnya kita beri nama SSO. Berikut ini struktur tabel-tabel dan data contoh yang diperlukan:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">CREATE TABLE <span style="color: #b1b100;">IF</span> NOT EXISTS `users` <span style="color: #009900;">&#40;</span>
`id` int<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">11</span><span style="color: #009900;">&#41;</span> NOT <span style="color: #009900; font-weight: bold;">NULL</span> AUTO_INCREMENT<span style="color: #339933;">,</span>
`username` varchar<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">50</span><span style="color: #009900;">&#41;</span> NOT <span style="color: #009900; font-weight: bold;">NULL</span><span style="color: #339933;">,</span>
`password` varchar<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">32</span><span style="color: #009900;">&#41;</span> NOT <span style="color: #009900; font-weight: bold;">NULL</span><span style="color: #339933;">,</span>
`name` varchar<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">100</span><span style="color: #009900;">&#41;</span> NOT <span style="color: #009900; font-weight: bold;">NULL</span><span style="color: #339933;">,</span>
PRIMARY <span style="color: #990000;">KEY</span> <span style="color: #009900;">&#40;</span>`id`<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
INSERT INTO `users` <span style="color: #009900;">&#40;</span>`username`<span style="color: #339933;">,</span> `password`<span style="color: #339933;">,</span> `name`<span style="color: #009900;">&#41;</span> VALUES
<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'user'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'ee11cbb19052e40b07aac0ca060c23ee'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'Budi'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
CREATE TABLE `access_privileges` <span style="color: #009900;">&#40;</span>
`id` INT UNSIGNED NOT <span style="color: #009900; font-weight: bold;">NULL</span> AUTO_INCREMENT PRIMARY <span style="color: #990000;">KEY</span><span style="color: #339933;">,</span>
`user_id` INT UNSIGNED NOT <span style="color: #009900; font-weight: bold;">NULL</span><span style="color: #339933;">,</span>
`client_id` varchar<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">32</span><span style="color: #009900;">&#41;</span> NOT <span style="color: #009900; font-weight: bold;">NULL</span><span style="color: #339933;">,</span>
`code` VARCHAR<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">32</span><span style="color: #009900;">&#41;</span> NOT <span style="color: #009900; font-weight: bold;">NULL</span><span style="color: #339933;">,</span>
`access_token` VARCHAR<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">32</span><span style="color: #009900;">&#41;</span> NOT <span style="color: #009900; font-weight: bold;">NULL</span><span style="color: #339933;">,</span>
`redirect_uri` TEXT NOT <span style="color: #009900; font-weight: bold;">NULL</span><span style="color: #339933;">,</span>
`expires` BIGINT UNSIGNED NOT <span style="color: #009900; font-weight: bold;">NULL</span>
<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
CREATE TABLE `apps_clients` <span style="color: #009900;">&#40;</span>
`id` INT UNSIGNED NOT <span style="color: #009900; font-weight: bold;">NULL</span> AUTO_INCREMENT PRIMARY <span style="color: #990000;">KEY</span><span style="color: #339933;">,</span>
`client_id` VARCHAR<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">32</span><span style="color: #009900;">&#41;</span> NOT <span style="color: #009900; font-weight: bold;">NULL</span><span style="color: #339933;">,</span>
`client_secret` VARCHAR<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">32</span><span style="color: #009900;">&#41;</span> NOT <span style="color: #009900; font-weight: bold;">NULL</span><span style="color: #339933;">,</span>
`logout_url` TEXT NOT <span style="color: #009900; font-weight: bold;">NULL</span>
<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
INSERT INTO `apps_clients` <span style="color: #009900;">&#40;</span>
`id`<span style="color: #339933;">,</span> `client_id`<span style="color: #339933;">,</span> `client_secret`<span style="color: #339933;">,</span> `logout_url`<span style="color: #009900;">&#41;</span>
VALUES <span style="color: #009900;">&#40;</span><span style="color: #009900; font-weight: bold;">NULL</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'c4ca4238a0b923820dcc509a6f75849b'</span><span style="color: #339933;">,</span>
<span style="color: #0000ff;">'4fc9b72a83a99a594d40b3971874a9be'</span><span style="color: #339933;">,</span>
<span style="color: #0000ff;">'http://localhost/client/auth.php?self_logout'</span>
<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Setting konfigurasi framework yang Anda gunakan sesuai dengan environment development agar bisa terkoneksi dengan database server. Buat sebuah contorller baru bernama user atau file baru bernama user.php jika menggunakan PHP scretch. Berikut contoh isi controller-nya:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> Controller_user <span style="color: #000000; font-weight: bold;">extends</span> Panada <span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> __construct<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
&nbsp;
        parent<span style="color: #339933;">::</span>__construct<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">db</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Library_db<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">rest</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Library_rest<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">request</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Library_request<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">session</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Library_session<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
&nbsp;
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> index<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
&nbsp;
&nbsp;
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> signin<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
&nbsp;
        <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #339933;">!</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">session</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">get</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'is_provider_login'</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
            <span style="color: #000088;">$error</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #339933;">;</span>
            <span style="color: #000088;">$client_id</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'client_id'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
            <span style="color: #000088;">$redirect_uri</span> <span style="color: #339933;">=</span> <span style="color: #990000;">urldecode</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'redirect_uri'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #000088;">$parsed</span> <span style="color: #339933;">=</span> <span style="color: #990000;">parse_url</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$redirect_uri</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
            <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$parsed</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'query'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span>
                <span style="color: #990000;">parse_str</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$parsed</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'query'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$query_args</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
            <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'submit'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
&nbsp;
                <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$user</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">db</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">get_row</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'users'</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'username'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'username'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'password'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">md5</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'password'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
                    <span style="color: #000088;">$query_args</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'code'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">rand</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                    <span style="color: #000088;">$access_token</span> <span style="color: #339933;">=</span> <span style="color: #990000;">rand</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                    <span style="color: #000088;">$expires</span> <span style="color: #339933;">=</span> <span style="color: #990000;">strtotime</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'next hour'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                    <span style="color: #000088;">$parsed</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'host'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">rtrim</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$parsed</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'host'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'/'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'/'</span><span style="color: #339933;">;</span>
                    <span style="color: #000088;">$redirect_to</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$parsed</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'scheme'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'://'</span><span style="color: #339933;">.</span><span style="color: #000088;">$parsed</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'host'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
                    <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$parsed</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'path'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span>
                        <span style="color: #000088;">$redirect_to</span> <span style="color: #339933;">.=</span> <span style="color: #000088;">$parsed</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'path'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
                    <span style="color: #000088;">$redirect_to</span> <span style="color: #339933;">.=</span> <span style="color: #0000ff;">'?'</span><span style="color: #339933;">.</span><span style="color: #990000;">http_build_query</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$query_args</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
                    <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$parsed</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'fragment'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span>
                        <span style="color: #000088;">$redirect_to</span> <span style="color: #339933;">.=</span> <span style="color: #0000ff;">'#'</span><span style="color: #339933;">.</span><span style="color: #000088;">$parsed</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'fragment'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
                    <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">db</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">delete</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'access_privileges'</span><span style="color: #339933;">,</span>
                                      <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
                                        <span style="color: #0000ff;">'client_id'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$client_id</span><span style="color: #339933;">,</span>
                                        <span style="color: #0000ff;">'user_id'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$user</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">id</span>
                                        <span style="color: #009900;">&#41;</span>
                                    <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
                    <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">db</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">insert</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'access_privileges'</span><span style="color: #339933;">,</span>
                                      <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
                                        <span style="color: #0000ff;">'client_id'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$client_id</span><span style="color: #339933;">,</span>
                                        <span style="color: #0000ff;">'user_id'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$user</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">id</span><span style="color: #339933;">,</span>
                                        <span style="color: #0000ff;">'code'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$query_args</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'code'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
                                        <span style="color: #0000ff;">'access_token'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$access_token</span><span style="color: #339933;">,</span>
                                        <span style="color: #0000ff;">'redirect_uri'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$redirect_uri</span><span style="color: #339933;">,</span>
                                        <span style="color: #0000ff;">'expires'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$expires</span>
                                    <span style="color: #009900;">&#41;</span>
                                <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
                    <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">session</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">set</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'is_provider_login'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$user</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">id</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'name'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$user</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">name</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
                    <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">redirect</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$redirect_to</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #009900;">&#125;</span>
&nbsp;
                <span style="color: #000088;">$error</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'&lt;p&gt;Username atau password salah.&lt;/a&gt;'</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span>
&nbsp;
            <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$error</span><span style="color: #339933;">;</span>
            <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'&lt;form action=&quot;&quot; method=&quot;post&quot;&gt;'</span><span style="color: #339933;">;</span>
            <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'Username: &lt;input type=&quot;text&quot; name=&quot;username&quot; /&gt;&lt;br /&gt;'</span><span style="color: #339933;">;</span>
            <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'Password: &lt;input type=&quot;password&quot; name=&quot;password&quot; /&gt;&lt;br /&gt;'</span><span style="color: #339933;">;</span>
            <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'&lt;input type=&quot;submit&quot; name=&quot;submit&quot; value=&quot;Sign In&quot; /&gt;&lt;br /&gt;'</span><span style="color: #339933;">;</span>
            <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'&lt;/form&gt;'</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
&nbsp;
            <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'Hallo &lt;b&gt;'</span><span style="color: #339933;">.</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">session</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">get</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'name'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'&lt;/b&gt; Saat ini Anda sudah login di OAuth Provider | &lt;a href=&quot;signout&quot;&gt;Sign Out&lt;/a&gt;'</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> signout<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
&nbsp;
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">session</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">session_clear_all</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'Anda kini telah logout dari OAuth Provider. Silahkan login menggunakan OAuth Client Anda.'</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> access_token<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
&nbsp;
        <span style="color: #000088;">$code</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">request</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">get</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'code'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$client_id</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">request</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">get</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'client_id'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$client_secret</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">request</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">get</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'client_secret'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$redirect_uri</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">request</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">get</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'redirect_uri'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #000088;">$data</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">array</span><span style="color: #009900;">&#41;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">db</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">row</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;SELECT
                                    access_privileges.access_token, access_privileges.expires
                                FROM
                                    access_privileges, apps_clients
                                WHERE
                                    apps_clients.client_id = access_privileges.client_id AND
                                    apps_clients.client_id = '<span style="color: #006699; font-weight: bold;">$client_id</span>' AND
                                    apps_clients.client_secreet = '<span style="color: #006699; font-weight: bold;">$client_secret</span>' AND
                                    access_privileges.redirect_uri = '<span style="color: #006699; font-weight: bold;">$redirect_uri</span>' AND
                                    access_privileges.code = '<span style="color: #006699; font-weight: bold;">$code</span>'
&nbsp;
                            &quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #339933;">!</span> <span style="color: #000088;">$data</span> <span style="color: #009900;">&#41;</span>
            <span style="color: #000088;">$data</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'error'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'Argument query yang Anda berikan tidak cocok.'</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #b1b100;">echo</span> <span style="color: #990000;">urldecode</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">http_build_query</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$data</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> get_data<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
&nbsp;
        <span style="color: #000088;">$access_token</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">request</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">get</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'access_token'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #000088;">$data</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">db</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">row</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;
                            SELECT
                                users.id, users.username, users.name
                            FROM
                                access_privileges, users
                            WHERE
                                users.id = access_privileges.user_id AND
                                access_privileges.access_token = '<span style="color: #006699; font-weight: bold;">$access_token</span>'
                        &quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #339933;">!</span> <span style="color: #000088;">$data</span> <span style="color: #009900;">&#41;</span>
            <span style="color: #000088;">$data</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'error'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'Argument query yang Anda berikan tidak cocok.'</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">rest</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">wrap_response_output</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$data</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'javascript'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Dan berikut isi file user.php jika menggunakan PHP scretch:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #990000;">session_start</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$link</span> <span style="color: #339933;">=</span> <span style="color: #990000;">mysql_connect</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'localhost'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'root'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">''</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$db_selected</span> <span style="color: #339933;">=</span> <span style="color: #990000;">mysql_select_db</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'komps'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$link</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'signin'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #339933;">!</span> <span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_SESSION</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'is_provider_login'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
&nbsp;
        <span style="color: #000088;">$error</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$client_id</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'client_id'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$redirect_uri</span> <span style="color: #339933;">=</span> <span style="color: #990000;">urldecode</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'redirect_uri'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$parsed</span> <span style="color: #339933;">=</span> <span style="color: #990000;">parse_url</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$redirect_uri</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$parsed</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'query'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span>
            <span style="color: #990000;">parse_str</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$parsed</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'query'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$query_args</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'submit'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
&nbsp;
            <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$user</span> <span style="color: #339933;">=</span> <span style="color: #990000;">mysql_fetch_object</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">mysql_query</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;SELECT * FROM users WHERE username = '&quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'username'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;' AND password = '&quot;</span><span style="color: #339933;">.</span><span style="color: #990000;">md5</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'password'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;'&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
                <span style="color: #000088;">$query_args</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'code'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">rand</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #000088;">$access_token</span> <span style="color: #339933;">=</span> <span style="color: #990000;">rand</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #000088;">$expires</span> <span style="color: #339933;">=</span> <span style="color: #990000;">strtotime</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'next hour'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #000088;">$parsed</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'host'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">rtrim</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$parsed</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'host'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'/'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'/'</span><span style="color: #339933;">;</span>
                <span style="color: #000088;">$redirect_to</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$parsed</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'scheme'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'://'</span><span style="color: #339933;">.</span><span style="color: #000088;">$parsed</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'host'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
                <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$parsed</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'path'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span>
                    <span style="color: #000088;">$redirect_to</span> <span style="color: #339933;">.=</span> <span style="color: #000088;">$parsed</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'path'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
                <span style="color: #000088;">$redirect_to</span> <span style="color: #339933;">.=</span> <span style="color: #0000ff;">'?'</span><span style="color: #339933;">.</span><span style="color: #990000;">http_build_query</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$query_args</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
                <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$parsed</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'fragment'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span>
                    <span style="color: #000088;">$redirect_to</span> <span style="color: #339933;">.=</span> <span style="color: #0000ff;">'#'</span><span style="color: #339933;">.</span><span style="color: #000088;">$parsed</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'fragment'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
                <span style="color: #990000;">mysql_query</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;DELETE FROM access_privileges WHERE client_id = '<span style="color: #006699; font-weight: bold;">$client_id</span>' AND user_id = <span style="color: #006699; font-weight: bold;">$user-&gt;id</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #990000;">mysql_query</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;INSERT INTO access_privileges (client_id, user_id, code, access_token, redirect_uri, expires) VALUES ('<span style="color: #006699; font-weight: bold;">$client_id</span>', '<span style="color: #006699; font-weight: bold;">$user-&gt;id</span>', '&quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$query_args</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'code'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;', '<span style="color: #006699; font-weight: bold;">$access_token</span>', '<span style="color: #006699; font-weight: bold;">$redirect_uri</span>', '<span style="color: #006699; font-weight: bold;">$expires</span>')&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
                <span style="color: #000088;">$_SESSION</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'is_provider_login'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$user</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">id</span><span style="color: #339933;">;</span>
                <span style="color: #000088;">$_SESSION</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'name'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$user</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">name</span><span style="color: #339933;">;</span>
&nbsp;
                <span style="color: #990000;">header</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Location:'</span><span style="color: #339933;">.</span><span style="color: #000088;">$redirect_to</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span>
&nbsp;
            <span style="color: #000088;">$error</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'&lt;p&gt;Username atau password salah.&lt;/a&gt;'</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
&nbsp;
        <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$error</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'&lt;form action=&quot;&quot; method=&quot;post&quot;&gt;'</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'Username: &lt;input type=&quot;text&quot; name=&quot;username&quot; /&gt;&lt;br /&gt;'</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'Password: &lt;input type=&quot;password&quot; name=&quot;password&quot; /&gt;&lt;br /&gt;'</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'&lt;input type=&quot;submit&quot; name=&quot;submit&quot; value=&quot;Sign In&quot; /&gt;&lt;br /&gt;'</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'&lt;/form&gt;'</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
&nbsp;
        <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'Hallo &lt;b&gt;'</span><span style="color: #339933;">.</span><span style="color: #000088;">$_SESSION</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'name'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'&lt;/b&gt; Saat ini Anda sudah login di OAuth Provider | &lt;a href=&quot;?signout&quot;&gt;Sign Out&lt;/a&gt;'</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'signout'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #990000;">session_destroy</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'Anda kini telah logout dari OAuth Provider. Silahkan login menggunakan OAuth Client Anda.'</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'access_token'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #339933;">!</span> <span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'get_data'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #000088;">$code</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'code'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$client_id</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'client_id'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$client_secret</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'client_secret'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$redirect_uri</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'redirect_uri'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000088;">$data</span> <span style="color: #339933;">=</span> <span style="color: #990000;">mysql_fetch_array</span><span style="color: #009900;">&#40;</span>
                            <span style="color: #990000;">mysql_query</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;
                                SELECT
                                    access_privileges.access_token, access_privileges.expires
                                FROM
                                    access_privileges, apps_clients
                                WHERE
                                    apps_clients.client_id = access_privileges.client_id AND
                                    apps_clients.client_id = '<span style="color: #006699; font-weight: bold;">$client_id</span>' AND
                                    apps_clients.client_secreet = '<span style="color: #006699; font-weight: bold;">$client_secret</span>' AND
                                    access_privileges.redirect_uri = '<span style="color: #006699; font-weight: bold;">$redirect_uri</span>' AND
                                    access_privileges.code = '<span style="color: #006699; font-weight: bold;">$code</span>'
&nbsp;
                            &quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> MYSQL_ASSOC<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #339933;">!</span> <span style="color: #000088;">$data</span> <span style="color: #009900;">&#41;</span>
        <span style="color: #000088;">$data</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'error'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'Argument query yang Anda berikan tidak cocok.'</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">echo</span> <span style="color: #990000;">urldecode</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">http_build_query</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$data</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'get_data'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #000088;">$access_token</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'access_token'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000088;">$data</span> <span style="color: #339933;">=</span> <span style="color: #990000;">mysql_fetch_object</span><span style="color: #009900;">&#40;</span>
                        <span style="color: #990000;">mysql_query</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;
                            SELECT
                                users.id, users.username, users.name
                            FROM
                                access_privileges, users
                            WHERE
                                users.id = access_privileges.user_id AND
                                access_privileges.access_token = '<span style="color: #006699; font-weight: bold;">$access_token</span>'
                        &quot;</span><span style="color: #009900;">&#41;</span>
                    <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #339933;">!</span> <span style="color: #000088;">$data</span> <span style="color: #009900;">&#41;</span>
        <span style="color: #000088;">$data</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'error'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'Argument query yang Anda berikan tidak cocok.'</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">echo</span> <span style="color: #990000;">json_encode</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$data</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Sekarang kita coba dengan terlebih dahulu memodifikasi aplikasi client yang sebelumnya sudah kita buat. Sesuaikan alamat url provider seperti berikut ini:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #990000;">session_start</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">require_once</span> <span style="color: #0000ff;">'rest.php'</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">require_once</span> <span style="color: #0000ff;">'oauth2_client.php'</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$rest</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Library_rest<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$oauth2_client</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Library_oauth2_client<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$oauth2_client</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">client_id</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'c4ca4238a0b923820dcc509a6f75849b'</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$oauth2_client</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">client_secret</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'4fc9b72a83a99a594d40b3971874a9be'</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$oauth2_client</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">redirect_uri</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'http://localhost/client/auth.php?callback'</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'login'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #000088;">$provider_auth_uri</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'http://localhost/provider/user.php'</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$more_args</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'scope'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'email'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'signin'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'true'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000088;">$oauth2_client</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">user_authentication</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$provider_auth_uri</span><span style="color: #339933;">,</span> <span style="color: #000088;">$more_args</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'callback'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #000088;">$code</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'code'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$provider_token_uri</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'http://localhost/provider/user.php'</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000088;">$response</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$oauth2_client</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">get_access_token</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$provider_token_uri</span><span style="color: #339933;">,</span> <span style="color: #000088;">$code</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'GET'</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'access_token'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'true'</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #990000;">parse_str</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$response</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000088;">$provider_uri</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'http://localhost/provider/user.php'</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000088;">$response</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$oauth2_client</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">access_user_resources</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$provider_uri</span><span style="color: #339933;">,</span> <span style="color: #000088;">$access_token</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'GET'</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'get_data'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'true'</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000088;">$data</span> <span style="color: #339933;">=</span> <span style="color: #990000;">json_decode</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$response</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000088;">$_SESSION</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'is_login'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$_SESSION</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'name'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$data</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">name</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$_SESSION</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'id'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$data</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">id</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #990000;">header</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Location:_auth.php?restricted_page'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #990000;">exit</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'restricted_page'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #339933;">!</span> <span style="color: #000088;">$_SESSION</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'is_login'</span><span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span>
        <span style="color: #990000;">header</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Location:auth.php?login'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'Selamat datang &lt;b&gt;'</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$_SESSION</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'name'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">'&lt;/b&gt; | &lt;a href=&quot;auth.php?signout&quot;&gt;Sign Out&lt;/a&gt;'</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'signout'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #990000;">session_unset</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #990000;">session_destroy</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'Anda kini telah logout. Klik &lt;a href=&quot;auth.php?login&quot;&gt;Sign In&lt;/a&gt; untuk kembali login.'</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'self_logout'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #990000;">session_unset</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #990000;">session_destroy</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Sekarang kembali akses alamat http://localhost/client/auth.php?login dari browser Anda. Jika berhasil di browser akan menampilkan pesan &#8220;selamat datang budi&#8221;.</p>
<h3>Crossdomain Authentication</h3>
<p>Untuk pengujian lebih lanjut, kita harus pastikan bahwa mekanisme SSO yang sudah kita buat bisa berjalan pada domain yang berbeda-beda (crossdomain authentication). Untuk itu silahkan buat virtual host baru di komputer Anda dengan nama domain selain localhost, misalnya myhost. Setelah berhasil pastikan Anda menambahakan nilai:</p>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">127.0.0.1 myhost</pre></div></div>

<p>di dalam folder:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #339933;">/</span>etc<span style="color: #339933;">/</span>hosts</pre></div></div>

<p>Konfigurasi ini bertujuan ketika diakses dari browser dengan alamat http://myhost/ akan mengarahkan ke komputer yang sedang kita gunakan.</p>
<p>Setaleh dipastikan berhasil, letakkan aplikasi provider yang sudah kita buat ke folder virtual host myhost sehingga alamat url aplikasi provider-nya menjadi</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">http<span style="color: #339933;">:</span><span style="color: #666666; font-style: italic;">//myhost/provider/</span></pre></div></div>

<p>Sesuaikan kembali parameter yang ada pada code aplikasi client dan silahkan coba kembali.</p>
<h3>Single Sign On/Out</h3>
<p>Kini kedua aplikasi sudah berjalan sesuai harapan. Kita bisa melakukan otentifikasi user dari satu aplikasi ke aplikasi lainnya tanpa perlu lagi mengisikan username atau password. Namun sampai tahap ini prosesnya masih berjalan manual. User harus mengklik link terlebih dahulu untuk bisa terotentifikasi.</p>
<p>Langkah selanjutnya adalah kita akan membuat user benar-benar merasakan Single Sign On. Sebagi contoh user login di aplikasi dengan domain myshost, kemudian dia membuka halaman baru dengan domain localhost, maka kita ingin dia juga sudah terotentifikasi. Hal yang sama juga berlaku ketika user logout. Logout di satu aplikasi maka ter-logout juga di aplikasi lainnya.</p>
<p>Untuk melakukan hal ini kita akan menggunakan bantuan javascript sebagai login redirector, dan tag html img sebagai pen-triger logout.</p>
<h4>Javascript Login Redirector</h4>
<p>Buat sebuah blok baru di dalam file user.php atau controller controller user. Tugas blok ini adalah mendeteksi apakah seorang user sudah login pada aplikasi provider atau belum. Jika sudah login maka bagian ini akan mencetak output javascript yang me-redirect ke halaman login provider. Berikut contoh code-nya:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #990000;">session_start</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #990000;">header</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Content-type: text/javascript&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_SESSION</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'is_provider_login'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'top.location.href=&quot; http://myhost/provider/user.php?client_id=c4ca4238a0b923820dcc509a6f75849b&amp;redirect_uri=http://localhost/client/auth.php?callback&amp;signin=true&quot;;'</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>File ini akan dianggap file javascript oleh browser, sehingga untuk meload-nya kita gunakan tag &lt;script&gt; seperti berikut:</p>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">&lt;script type=&quot;text/javascript&quot; src=&quot;http://myhost/provider/user.php?redirector&quot;&gt;&lt;/script&gt;</pre></div></div>

<p>Letakkan script ini disetiap halaman aplikasi clent yang ingin login secara otomatis. Gunakan script ini hanya dalam kondisi user belum login di aplikasi client.</p>
<h4>Img Logout Triger</h4>
<p>Terakhir untuk &#8216;memakasa&#8217; aplikasi client melakukan logout tambahkan code berikut di bagian logout aplikasi provider:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'signout'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #990000;">session_destroy</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000088;">$result</span> <span style="color: #339933;">=</span> <span style="color: #990000;">mysql_query</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">&quot;SELECT logout_url FROM apps_clients&quot;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$row</span> <span style="color: #339933;">=</span> <span style="color: #990000;">mysql_fetch_object</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$result</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'&lt;img src=&quot;'</span><span style="color: #339933;">.</span><span style="color: #000088;">$row</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">logout_url</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'&quot; width=&quot;0&quot; height=&quot;0&quot; alt=&quot;&quot; /&gt;'</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Sebagaimana kita lihat untuk melakukan logout client aplikasi provider membutuhkan alamat url &#8216;self logout&#8217; dari client. Nilai ini harus diisikan ketika akan menambahkan aplikasi client baru.</p>
<p>Untuk memusatkan proses logout, semua client harus melakukan logout di aplikasi provider dengan cara memberikan link logout ke halaman logout provider.</p>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">&lt;a href=&quot;http://myhost/provider/user.php?signout&amp;redirect_to=http://localhost/client/auth.php?signout&quot;&gt;Logout&lt;/a&gt;</pre></div></div>

<p>Untuk melihat demo dari artikel ini, buka halaman <a href="http://panadaframework.com/samples/provider/user" target="_blank">Provider</a> dan halaman <a href="http://kandar.info/demo/oauth2/client/auth.php" target="_blank">Client</a> pada tab yang berbeda. Login di halaman Provider, kemudian buka tab halaman Client dan refrash.</p>
<p>Lakukan logout di salah satu halaman dan lakukan refresh di halaman yang lain untuk memastikan sudah ter-logout.</p>
<p>Klik <a href="http://kandar.info/dt/sso_oauth2.tar.gz">disini</a> untuk mendownload script lengkapnya.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kandar.info/index.php/php/mengengembangkan-single-sign-on-system-sso-menggunakan-oauth-2-0/feed</wfw:commentRss>
		<slash:comments>41</slash:comments>
		</item>
		<item>
		<title>Membuat Web Framework Sendiri Menggunakan Ruby</title>
		<link>http://www.kandar.info/index.php/ruby/membuat-web-framework-sendiri-menggunakan-ruby</link>
		<comments>http://www.kandar.info/index.php/ruby/membuat-web-framework-sendiri-menggunakan-ruby#comments</comments>
		<pubDate>Thu, 31 Mar 2011 14:35:42 +0000</pubDate>
		<dc:creator>kandar</dc:creator>
				<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://www.kandar.info/?p=135</guid>
		<description><![CDATA[Belakangan saya sedang mencari tutorial membuat aplikasi web menggunakan bahasa pemrogramman Ruby namun tanpa framework apapun. Dari hasil pencarian di Google hasilnya kurang memuaskan. Sebagian besar tutorial mengajarkan menggunakan Rails. Tidak heran hasil pencarian menunjukan demikian mengingat Ruby on Rails adalah framework yang sangat populer. Rails ataupun framework yang lainnya adalah bagus. Namun ketika kita [...]]]></description>
			<content:encoded><![CDATA[<p>Belakangan saya sedang mencari tutorial membuat aplikasi web menggunakan bahasa pemrogramman <a href="http://www.ruby-lang.org/id/">Ruby</a> namun tanpa framework apapun. Dari hasil pencarian di Google hasilnya kurang memuaskan. Sebagian besar tutorial mengajarkan menggunakan Rails. Tidak heran hasil pencarian menunjukan demikian mengingat Ruby on Rails adalah framework yang sangat populer. Rails ataupun framework yang lainnya adalah bagus. Namun ketika kita bisa membuat aplikasi dari dasar tanpa menggunakan framework apapun, akan lebih mudah untuk kemudian menggunakan framework manapun. Hal ini lah yang kemudian mendorong saya membuat tulisan ini.<span id="more-135"></span></p>
<p>Dari beberapa referensi yang terkumpul, saya akan coba buat dalam satu tutorial dengan harapan akan memudahkan teman-teman developer yang ingin membuat aplikasi web menggunakan Ruby dari nol. Dalam tutorial ini saya menggunakan sistem operasi Ubuntu. Silahkan sesuaikan dengan kondisi OS yang Anda gunakan.</p>
<p>Semua modul dalam tutorial ini sudah tersedia dalam instalasi Ruby jika Anda menginstal dengan lengkap. Modul-modul yang dibutuhkan selain core Ruby adalah rack untuk web server development dan erb untuk templating, serta cgi.</p>
<h2>Instalasi</h2>
<p>Untuk instalasi paket full Ruby di Ubuntu silahkan ketikan perintah:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">sudo apt<span style="color:#006600; font-weight:bold;">-</span>get install ruby<span style="color:#006600; font-weight:bold;">-</span>full</pre></div></div>

<p>Untuk memastikan Ruby sudah terinstall dengan baik silahkan ketik:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">ruby <span style="color:#006600; font-weight:bold;">-</span>v</pre></div></div>

<p>Kemudian ketikkan perintah di bawah ini untuk memastikan modul rack tersedia:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">rackup <span style="color:#006600; font-weight:bold;">-</span>v</pre></div></div>

<p>Jika semuanya tidak ada masalah, sekarang waktunya untuk memulai pembuatan aplikasi. Agar aplikasi kita mudah untuk dideploy di server production yang umumnya menggunakan <a href="http://www.modrails.com/">Passanger</a> baik itu di Apache maupun di Nginx, kita akan mengikuti protocol yang disyaratkan oleh Passanger yaitu: buat dua buah folder masing-masing bernama <strong>public</strong> dan <strong>temp</strong> dan buat sebuah file bernama <strong>config.ru</strong>.</p>
<p>Buka file config.ru dan isikan:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> Gear
    <span style="color:#9966CC; font-weight:bold;">def</span> call<span style="color:#006600; font-weight:bold;">&#40;</span>env<span style="color:#006600; font-weight:bold;">&#41;</span>
        <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">200</span>, <span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#996600;">&quot;Content-Type&quot;</span> =<span style="color:#006600; font-weight:bold;">&amp;</span>gt; <span style="color:#996600;">&quot;text/html&quot;</span><span style="color:#006600; font-weight:bold;">&#125;</span>, <span style="color:#996600;">'hello world'</span><span style="color:#006600; font-weight:bold;">&#93;</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
run Gear.<span style="color:#9900CC;">new</span></pre></div></div>

<p>Di dalam terminal pindah ke root folder aplikasi Anda dan ketikkan:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">rackup config.<span style="color:#9900CC;">ru</span></pre></div></div>

<p>Buka browser dan masukkan alamat:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">http:<span style="color:#006600; font-weight:bold;">//</span>localhost:<span style="color:#006666;">9292</span></pre></div></div>

<h2>Komponen Dasar</h2>
<p>Jika berjalan lancar browser akan menampilkan pesan &#8220;hello world&#8221;. Jika bagian ini sudah berhasil, maka selanjutnya adalah membuat komponen pembantu untuk aplikasi. Buka kembali file config.ru dan rubah isinya hingga menjadi seperti berikut:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#008000; font-style:italic;"># Modul erb dibutuhkan untuk templating</span>
<span style="color:#008000; font-style:italic;"># Modul cgi dibutuhkan untuk parsing query string</span>
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'erb'</span>
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'cgi'</span>
&nbsp;
<span style="color:#008000; font-style:italic;"># Class Constructor akan menjadi parent dari</span>
<span style="color:#008000; font-style:italic;"># setiap halaman controller yang bertugas untuk</span>
<span style="color:#008000; font-style:italic;"># mensuplai segala kebutuhan dari masing-masing controller</span>
<span style="color:#9966CC; font-weight:bold;">class</span> Controller
&nbsp;
    <span style="color:#9966CC; font-weight:bold;">def</span> initialize env
        <span style="color:#0066ff; font-weight:bold;">@envs</span> = env
    <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
    <span style="color:#9966CC; font-weight:bold;">def</span> view<span style="color:#006600; font-weight:bold;">&#40;</span>file, data = <span style="color:#0000FF; font-weight:bold;">false</span><span style="color:#006600; font-weight:bold;">&#41;</span>
&nbsp;
        template_string = <span style="color:#CC00FF; font-weight:bold;">File</span>.<span style="color:#9900CC;">read</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">'views/'</span> <span style="color:#006600; font-weight:bold;">+</span> file <span style="color:#006600; font-weight:bold;">+</span> <span style="color:#996600;">'.html'</span><span style="color:#006600; font-weight:bold;">&#41;</span>
        template = <span style="color:#CC00FF; font-weight:bold;">ERB</span>.<span style="color:#9900CC;">new</span> template_string
        <span style="color:#0000FF; font-weight:bold;">return</span> template.<span style="color:#9900CC;">result</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#CC0066; font-weight:bold;">binding</span><span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
    <span style="color:#9966CC; font-weight:bold;">def</span> model file
        <span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'models/'</span> <span style="color:#006600; font-weight:bold;">+</span> file <span style="color:#006600; font-weight:bold;">+</span> <span style="color:#996600;">'.rb'</span>
        mod = file.<span style="color:#9900CC;">capitalize</span>
        <span style="color:#CC00FF; font-weight:bold;">Kernel</span>.<span style="color:#9900CC;">const_get</span><span style="color:#006600; font-weight:bold;">&#40;</span>mod<span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">new</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
    <span style="color:#9966CC; font-weight:bold;">def</span> POST
        q = <span style="color:#0066ff; font-weight:bold;">@envs</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">'rack.input'</span><span style="color:#006600; font-weight:bold;">&#93;</span>.<span style="color:#CC0066; font-weight:bold;">gets</span>
        <span style="color:#0000FF; font-weight:bold;">self</span>.<span style="color:#9900CC;">parse_query</span> q
    <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
    <span style="color:#9966CC; font-weight:bold;">def</span> GET
        q = <span style="color:#0066ff; font-weight:bold;">@envs</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">'QUERY_STRING'</span><span style="color:#006600; font-weight:bold;">&#93;</span>
        <span style="color:#0000FF; font-weight:bold;">self</span>.<span style="color:#9900CC;">parse_query</span> q
    <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
    <span style="color:#9966CC; font-weight:bold;">def</span> parse_query <span style="color:#CC0066; font-weight:bold;">string</span>
        <span style="color:#CC00FF; font-weight:bold;">CGI</span>.<span style="color:#9900CC;">parse</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#CC0066; font-weight:bold;">string</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#008000; font-style:italic;"># Hash[*string.split(/=|&amp;amp;/)].inspect</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#008000; font-style:italic;"># Class ini akan dieksekusi pertama kali</span>
<span style="color:#008000; font-style:italic;"># oleh reck webserver</span>
<span style="color:#9966CC; font-weight:bold;">class</span> Gear
    <span style="color:#9966CC; font-weight:bold;">def</span> call<span style="color:#006600; font-weight:bold;">&#40;</span>env<span style="color:#006600; font-weight:bold;">&#41;</span>
&nbsp;
        url = env<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">'PATH_INFO'</span><span style="color:#006600; font-weight:bold;">&#93;</span>
        url.<span style="color:#9900CC;">slice</span>!<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">0</span><span style="color:#006600; font-weight:bold;">&#41;</span>
&nbsp;
        <span style="color:#008000; font-style:italic;"># Defenisikan nama controller dan method default</span>
        controller = <span style="color:#996600;">'home'</span>
        method = <span style="color:#996600;">'index'</span>
&nbsp;
        <span style="color:#008000; font-style:italic;"># Split url string berdasarkan pemisah '/'</span>
        url_spl = url.<span style="color:#CC0066; font-weight:bold;">split</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">'/'</span><span style="color:#006600; font-weight:bold;">&#41;</span>
&nbsp;
        <span style="color:#008000; font-style:italic;"># Dapatkan nama controller</span>
        <span style="color:#9966CC; font-weight:bold;">if</span> url_spl.<span style="color:#9966CC; font-weight:bold;">include</span>? url_spl<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">0</span><span style="color:#006600; font-weight:bold;">&#93;</span>
          controller = url_spl<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">0</span><span style="color:#006600; font-weight:bold;">&#93;</span>
        <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
        <span style="color:#008000; font-style:italic;"># Pastikan apakah file controller tersedia</span>
        <span style="color:#9966CC; font-weight:bold;">if</span> <span style="color:#9966CC; font-weight:bold;">not</span> <span style="color:#CC00FF; font-weight:bold;">File</span>.<span style="color:#9900CC;">file</span>? <span style="color:#996600;">'controllers/'</span> <span style="color:#006600; font-weight:bold;">+</span> controller <span style="color:#006600; font-weight:bold;">+</span> <span style="color:#996600;">'.rb'</span>
          <span style="color:#0000FF; font-weight:bold;">return</span> <span style="color:#0000FF; font-weight:bold;">self</span>.<span style="color:#9900CC;">error_404</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">'controller not exists'</span><span style="color:#006600; font-weight:bold;">&#41;</span>
        <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
        url_spl.<span style="color:#9900CC;">delete_at</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">0</span><span style="color:#006600; font-weight:bold;">&#41;</span>
&nbsp;
        <span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'controllers/'</span> <span style="color:#006600; font-weight:bold;">+</span> controller <span style="color:#006600; font-weight:bold;">+</span> <span style="color:#996600;">'.rb'</span>
&nbsp;
        <span style="color:#008000; font-style:italic;"># Dapatkan nama method</span>
        <span style="color:#9966CC; font-weight:bold;">if</span> url_spl.<span style="color:#9966CC; font-weight:bold;">include</span>? url_spl<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">0</span><span style="color:#006600; font-weight:bold;">&#93;</span>
          method = url_spl<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">0</span><span style="color:#006600; font-weight:bold;">&#93;</span>
          url_spl.<span style="color:#9900CC;">delete_at</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">0</span><span style="color:#006600; font-weight:bold;">&#41;</span>
        <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
        <span style="color:#008000; font-style:italic;"># Perbesar huruf pertama dari controller untuk menjadi nama class</span>
        controller = controller.<span style="color:#9900CC;">capitalize</span>
&nbsp;
        instance = <span style="color:#CC00FF; font-weight:bold;">Kernel</span>.<span style="color:#9900CC;">const_get</span><span style="color:#006600; font-weight:bold;">&#40;</span>controller<span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">new</span> env
&nbsp;
        <span style="color:#008000; font-style:italic;"># Pastikan method tersedia</span>
        <span style="color:#9966CC; font-weight:bold;">if</span> <span style="color:#9966CC; font-weight:bold;">not</span> instance.<span style="color:#9900CC;">respond_to</span>? method
          <span style="color:#0000FF; font-weight:bold;">return</span> <span style="color:#0000FF; font-weight:bold;">self</span>.<span style="color:#9900CC;">error_404</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">'methond not exists'</span><span style="color:#006600; font-weight:bold;">&#41;</span>
        <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
        <span style="color:#008000; font-style:italic;"># Semua sudah tersedia, tampilkan isi method</span>
&nbsp;
        <span style="color:#9966CC; font-weight:bold;">if</span> url_spl.<span style="color:#9900CC;">size</span> <span style="color:#006600; font-weight:bold;">&amp;</span>gt; <span style="color:#006666;">0</span>
          output_str = instance.<span style="color:#9900CC;">method</span><span style="color:#006600; font-weight:bold;">&#40;</span>method<span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">call</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">*</span>url_spl<span style="color:#006600; font-weight:bold;">&#41;</span>
        <span style="color:#9966CC; font-weight:bold;">else</span>
          output_str = instance.<span style="color:#9900CC;">method</span><span style="color:#006600; font-weight:bold;">&#40;</span>method<span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">call</span>
        <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
        <span style="color:#0000FF; font-weight:bold;">self</span>.<span style="color:#9900CC;">output</span><span style="color:#006600; font-weight:bold;">&#40;</span>output_str<span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
    <span style="color:#9966CC; font-weight:bold;">def</span> error_404<span style="color:#006600; font-weight:bold;">&#40;</span>message = <span style="color:#996600;">''</span><span style="color:#006600; font-weight:bold;">&#41;</span>
        <span style="color:#0000FF; font-weight:bold;">self</span>.<span style="color:#9900CC;">output</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">'Page not found! '</span> <span style="color:#006600; font-weight:bold;">+</span> message, <span style="color:#006666;">404</span><span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
    <span style="color:#9966CC; font-weight:bold;">def</span> output<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#CC0066; font-weight:bold;">string</span>, code = <span style="color:#006666;">200</span><span style="color:#006600; font-weight:bold;">&#41;</span>
        <span style="color:#9966CC; font-weight:bold;">if</span> <span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#CC0066; font-weight:bold;">string</span>.<span style="color:#0000FF; font-weight:bold;">nil</span>? <span style="color:#9966CC; font-weight:bold;">or</span> <span style="color:#CC0066; font-weight:bold;">string</span> == <span style="color:#006666;">0</span><span style="color:#006600; font-weight:bold;">&#41;</span>
            <span style="color:#CC0066; font-weight:bold;">string</span> = <span style="color:#996600;">'output empty'</span>
        <span style="color:#9966CC; font-weight:bold;">end</span>
        <span style="color:#006600; font-weight:bold;">&#91;</span>code, <span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#996600;">&quot;Content-Type&quot;</span> =<span style="color:#006600; font-weight:bold;">&amp;</span>gt; <span style="color:#996600;">&quot;text/html&quot;</span><span style="color:#006600; font-weight:bold;">&#125;</span>, <span style="color:#CC0066; font-weight:bold;">string</span><span style="color:#006600; font-weight:bold;">&#93;</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
run Gear.<span style="color:#9900CC;">new</span></pre></div></div>

<p>Di atas adalah core sitem MVC sederhana untuk aplikasi kita. Untuk itu kita membutuhkan setidaknya tiga folder baru yang masing-masing kita beri nama <strong>models</strong>, <strong>views</strong> dan <strong>controllers</strong>.</p>
<p>Dengan pola MVC di atas, struktur url website kita menjadi:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">http:<span style="color:#006600; font-weight:bold;">//</span>localhost:<span style="color:#006666;">9292</span><span style="color:#006600; font-weight:bold;">/</span>nama_controller<span style="color:#006600; font-weight:bold;">/</span>nama_method<span style="color:#006600; font-weight:bold;">/</span>argumen_1<span style="color:#006600; font-weight:bold;">/</span>argumen_2</pre></div></div>

<h2>Contrloller</h2>
<p>Masuk ke dalam folder controllers, buat sebuah file baru dan beri nama home.rb yang isinya:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> Home <span style="color:#006600; font-weight:bold;">&amp;</span>lt; Controller
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> initialize env
    <span style="color:#9966CC; font-weight:bold;">super</span> env
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> index
    <span style="color:#996600;">'Ini adalah output dari method index di dalam calss Home'</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>Kemudian akses browser dengan alamat:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">http:<span style="color:#006600; font-weight:bold;">//</span>localhost:<span style="color:#006666;">9292</span><span style="color:#006600; font-weight:bold;">/</span>home<span style="color:#006600; font-weight:bold;">/</span>index</pre></div></div>

<p>Di sini <strong>index</strong> adalah method default yang artinya, jika tidak ada argumen setelah nama controller pada url, maka method ini yang akan dieksekusi. Dengan demikian hasil yang sama akan didapat dengan url:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">http:<span style="color:#006600; font-weight:bold;">//</span>localhost:<span style="color:#006666;">9292</span><span style="color:#006600; font-weight:bold;">/</span>home</pre></div></div>

<p>Sama halnya dengan <strong>index</strong>, <strong>home</strong> juga menjadi nama default untuk nama controller jika tidak ada argumen yang menyebutkan nama controller. Urlnya bisa menjadi:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">http:<span style="color:#006600; font-weight:bold;">//</span>localhost:<span style="color:#006666;">9292</span><span style="color:#006600; font-weight:bold;">/</span>home</pre></div></div>

<p>Untuk membuat controller lainnya, Anda cukup membuat sebuah file baru di dalam folder controllers dan buat sebuah class dengan nama yang sama seperti nama file. Contohnya saya akan membuat controller foo, berikut adalah isi dari file foo.rb saya:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> Foo <span style="color:#006600; font-weight:bold;">&amp;</span>lt; Controller
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> initialize env
    <span style="color:#9966CC; font-weight:bold;">super</span> env
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> index
    <span style="color:#996600;">'Ini adalah output dari method index di dalam calss Foo'</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> hello
    <span style="color:#996600;">'Hello from foo'</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>Kemudian akses browser dengan alamat:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">http:<span style="color:#006600; font-weight:bold;">//</span>localhost:<span style="color:#006666;">9292</span><span style="color:#006600; font-weight:bold;">/</span>foo</pre></div></div>

<p>atau:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">http:<span style="color:#006600; font-weight:bold;">//</span>localhost:<span style="color:#006666;">9292</span><span style="color:#006600; font-weight:bold;">/</span>foo<span style="color:#006600; font-weight:bold;">/</span>hello</pre></div></div>

<h2>View</h2>
<p>Untuk membuat sebuah template atau view, masuk ke dalam folder vews dan buat sebuah file html, misalnya hello.html yang isinya:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">&nbsp;
    Nama saya <span style="color:#006600; font-weight:bold;">&amp;</span>lt;<span style="color:#006600; font-weight:bold;">%</span>= data<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">'name'</span><span style="color:#006600; font-weight:bold;">&#93;</span> <span style="color:#006600; font-weight:bold;">%&amp;</span>gt;
&nbsp;
&nbsp;
&nbsp;
&nbsp;
<span style="color:#006600; font-weight:bold;">&lt;</span>h3<span style="color:#006600; font-weight:bold;">&gt;</span>Nama saya <span style="color:#006600; font-weight:bold;">&amp;</span>lt;<span style="color:#006600; font-weight:bold;">%</span>= data<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">'name'</span><span style="color:#006600; font-weight:bold;">&#93;</span> <span style="color:#006600; font-weight:bold;">%&amp;</span>gt;<span style="color:#006600; font-weight:bold;">&lt;/</span>h3<span style="color:#006600; font-weight:bold;">&gt;</span>
&nbsp;
&nbsp;
 </pre></div></div>

<p>Kemudian di dalam controller isikan seperti berikut:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> Foo <span style="color:#006600; font-weight:bold;">&amp;</span>lt; Controller      <span style="color:#9966CC; font-weight:bold;">def</span> initialize env     <span style="color:#9966CC; font-weight:bold;">super</span> env   <span style="color:#9966CC; font-weight:bold;">end</span>      <span style="color:#9966CC; font-weight:bold;">def</span> index     <span style="color:#996600;">'Ini adalah output dari method index di dalam calss Foo'</span>   <span style="color:#9966CC; font-weight:bold;">end</span>      <span style="color:#9966CC; font-weight:bold;">def</span> hello<span style="color:#006600; font-weight:bold;">&#40;</span>name = <span style="color:#996600;">'kandar'</span><span style="color:#006600; font-weight:bold;">&#41;</span>     args = <span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#996600;">'name'</span> =<span style="color:#006600; font-weight:bold;">&amp;</span>gt; name<span style="color:#006600; font-weight:bold;">&#125;</span>
    <span style="color:#0000FF; font-weight:bold;">self</span>.<span style="color:#9900CC;">view</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">'hello'</span>, args<span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>Akses browser dengan alamat:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">http:<span style="color:#006600; font-weight:bold;">//</span>localhost:<span style="color:#006666;">9292</span><span style="color:#006600; font-weight:bold;">/</span>foo<span style="color:#006600; font-weight:bold;">/</span>hello
http:<span style="color:#006600; font-weight:bold;">//</span>localhost:<span style="color:#006666;">9292</span><span style="color:#006600; font-weight:bold;">/</span>foo<span style="color:#006600; font-weight:bold;">/</span>hello<span style="color:#006600; font-weight:bold;">/</span>budi
http:<span style="color:#006600; font-weight:bold;">//</span>localhost:<span style="color:#006666;">9292</span><span style="color:#006600; font-weight:bold;">/</span>foo<span style="color:#006600; font-weight:bold;">/</span>hello<span style="color:#006600; font-weight:bold;">/</span>jhon</pre></div></div>

<h2>Model</h2>
<p>Sama seperti controller, untuk membuat model Anda cukup membuat sebuah file di dalam folder models, dan buat sebuah class dengan nama yang sama dengan nama file. Contohnya: my_data.rb yang isinya:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> My_data
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> samples
    <span style="color:#996600;">'ini data dari model My_data'</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>Untuk me-load class model ke dalam controller, caranya adalah:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> Foo <span style="color:#006600; font-weight:bold;">&amp;</span>lt; Controller
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> initialize env
    <span style="color:#9966CC; font-weight:bold;">super</span> env
    <span style="color:#0066ff; font-weight:bold;">@my_data</span> = <span style="color:#0000FF; font-weight:bold;">self</span>.<span style="color:#9900CC;">model</span> <span style="color:#996600;">'my_data'</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> index
    <span style="color:#996600;">'Ini adalah output dari method index di dalam calss Foo'</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> data_from_model
    <span style="color:#0066ff; font-weight:bold;">@my_data</span>.<span style="color:#9900CC;">samples</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>Kemudian akses browser:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">http:<span style="color:#006600; font-weight:bold;">//</span>localhost:<span style="color:#006666;">9292</span><span style="color:#006600; font-weight:bold;">/</span>foo<span style="color:#006600; font-weight:bold;">/</span>data_from_model</pre></div></div>

<p>Class model diperuntukan untuk menangani semua proses yang terkait dengan data. Untuk melakukan koneksi ke database, Anda membutuhkan driver dari database yang akan digunakan. Sebagi contoh saya akan menggunakan mysql maka isi file model saya:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'mysql'</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">class</span> My_data
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> initialize
    <span style="color:#0066ff; font-weight:bold;">@connection</span> = Mysql.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span>hostname, username, password, databasename<span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> samples
    <span style="color:#0066ff; font-weight:bold;">@connection</span>.<span style="color:#9900CC;">query</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">'SELECT * FROM my_table'</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>Aplikasi selesai. Kini Anda tidak perlu lagi bergantung pada framework apapun untuk membuat aplikasi web menggunakan Ruby, selamat mencoba!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kandar.info/index.php/ruby/membuat-web-framework-sendiri-menggunakan-ruby/feed</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Make Your web.py Python Framework more MVC Style</title>
		<link>http://www.kandar.info/index.php/python/make-your-web-py-python-framework-more-mvc-style</link>
		<comments>http://www.kandar.info/index.php/python/make-your-web-py-python-framework-more-mvc-style#comments</comments>
		<pubDate>Mon, 28 Mar 2011 11:02:26 +0000</pubDate>
		<dc:creator>kandar</dc:creator>
				<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://www.kandar.info/?p=127</guid>
		<description><![CDATA[So its python time. Lets talk a bit about web.py. It is a extremely simple Python web developement framework. I show you the reason by creating some &#8220;Hello World&#8221; application below. First, you have to import the core modules in your python file. Then create some routing rule for your web&#8217;s url. Next, create a [...]]]></description>
			<content:encoded><![CDATA[<p>So its python time. Lets talk a bit about web.py. It is a extremely simple Python web developement framework. I show you the reason by creating some &#8220;Hello World&#8221; application below.</p>
<p>First, you have to import the core modules in your python file. Then create some routing rule for your web&#8217;s url. Next, create a web.py instance. After that, create a class that reprisent your application. And last, run the web.py object. So here the sampe code from my index.py file:<span id="more-127"></span></p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">import</span> web
&nbsp;
urls = <span style="color: black;">&#40;</span>
    <span style="color: #483d8b;">'/(.*)'</span>, <span style="color: #483d8b;">'hello'</span>
<span style="color: black;">&#41;</span>
app = web.<span style="color: black;">application</span><span style="color: black;">&#40;</span>urls, <span style="color: #008000;">globals</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> hello:        
    <span style="color: #ff7700;font-weight:bold;">def</span> GET<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, name<span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> name: 
            name = <span style="color: #483d8b;">'World'</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #483d8b;">'Hello, '</span> + name + <span style="color: #483d8b;">'!'</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">if</span> __name__ == <span style="color: #483d8b;">&quot;__main__&quot;</span>:
    app.<span style="color: black;">run</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></div></div>

<p>If you have enother calss all you have to do just routit on urls variable just like:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;">urls = <span style="color: black;">&#40;</span>
    <span style="color: #483d8b;">'/index'</span>, <span style="color: #483d8b;">'index'</span>,
    <span style="color: #483d8b;">'/home'</span>, <span style="color: #483d8b;">'home'</span>,
    <span style="color: #483d8b;">'/user'</span> <span style="color: #483d8b;">'user'</span>
<span style="color: black;">&#41;</span>
&nbsp;
...
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> index:
&nbsp;
...
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> home:
&nbsp;
...
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> <span style="color: #dc143c;">user</span>:</pre></div></div>

<p>This is good for small number class. But what if you have lot of class, are your still wanna put it in the single file? I thinks is a bad idea. Then I have an idea. What if we put each class in a single file and we called it a controller, like lot of other framework? So the application urls would be look like:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;">http://www.<span style="color: black;">myapplication</span>.<span style="color: black;">com</span>/my_controller/my_method/my_arguments</pre></div></div>

<p>Before we continue, you may try the demo that I hosted in Google App Engine.</p>
<p><a href="http://kandarpy.appspot.com/">http://kandarpy.appspot.com/</a></p>
<p>For the view system, web.py already have a templating so we don&#8217;t have to wory for this.</p>
<p>First, install web.py. Check <a href="http://webpy.org/install">http://webpy.org/install</a> for detail installation. Then set your default python page become like this:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">import</span> web
<span style="color: #ff7700;font-weight:bold;">import</span> web_controller
&nbsp;
urls = <span style="color: black;">&#40;</span>
  <span style="color: #483d8b;">'/(.*)'</span>, <span style="color: #483d8b;">'Gear'</span>
<span style="color: black;">&#41;</span>
&nbsp;
hendler = web_controller.<span style="color: black;">Handler</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> Gear:
    <span style="color: #ff7700;font-weight:bold;">def</span> GET<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, args = <span style="color: #008000;">False</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">return</span> hendler.<span style="color: black;">control</span><span style="color: black;">&#40;</span>args<span style="color: black;">&#41;</span>
&nbsp;
app = web.<span style="color: black;">application</span><span style="color: black;">&#40;</span>urls, <span style="color: #008000;">globals</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>, autoreload=<span style="color: #008000;">False</span><span style="color: black;">&#41;</span>
main = app.<span style="color: black;">cgirun</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></div></div>

<p>The class name is optional, so you can named it with anythings you like. The important part is:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">import</span> web_controller</pre></div></div>

<p>and</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;">urls = <span style="color: black;">&#40;</span>
  <span style="color: #483d8b;">'/(.*)'</span>, <span style="color: #483d8b;">'Gear'</span>
<span style="color: black;">&#41;</span></pre></div></div>

<p>This parameter mean that all request will goes to &#8216;Gear&#8217; class.</p>
<p>Download the controller modul form http://kandarpy.appspot.com/sources/web_controller. Create &#8220;controllers&#8221;, &#8220;views&#8221; and &#8220;modules&#8221; folder in your root application folder.</p>
<p>Create index.html file in your views folder. Its look like:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;">$def <span style="color: #ff7700;font-weight:bold;">with</span> <span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
Hello World<span style="color: #66cc66;">!</span></pre></div></div>

<p>Create default controller file called home.py in your controllers folder.</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">import</span> web
&nbsp;
views = web.<span style="color: black;">template</span>.<span style="color: black;">render</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'views/'</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> Home:
    <span style="color: #ff7700;font-weight:bold;">def</span> index<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, <span style="color: #66cc66;">*</span>args<span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">return</span> views.<span style="color: black;">index</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></div></div>

<p>Oke now is time to test your applications. If nothing&#8217;s wrong, your web browser will display &#8220;Hello World!&#8221;.</p>
<p>How to load a model class? Its easy. Create a new file in your model folder. Lets we named it data_sample.py. In this file you wanna import db moduls from web.py so it will look some things like this:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">import</span> web
&nbsp;
db = web.<span style="color: black;">database</span><span style="color: black;">&#40;</span>dbn=<span style="color: #483d8b;">'mysql'</span>, <span style="color: #dc143c;">user</span>=<span style="color: #483d8b;">'username'</span>, pw=<span style="color: #483d8b;">'password'</span>, db=<span style="color: #483d8b;">'database'</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> Data_sample:
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> get_data<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        data = db.<span style="color: #dc143c;">select</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'my_table'</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> data</pre></div></div>

<p>now, import your model file into controller:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">import</span> web
<span style="color: #ff7700;font-weight:bold;">import</span> models.<span style="color: black;">data_sample</span>
&nbsp;
views = web.<span style="color: black;">template</span>.<span style="color: black;">render</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'views/'</span><span style="color: black;">&#41;</span>
my_data = models.<span style="color: black;">data_sample</span>.<span style="color: black;">Data_sample</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> Home:
    <span style="color: #ff7700;font-weight:bold;">def</span> index<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, <span style="color: #66cc66;">*</span>args<span style="color: black;">&#41;</span>:
        posts = my_data.<span style="color: black;">get_data</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> views.<span style="color: black;">index</span><span style="color: black;">&#40;</span>posts<span style="color: black;">&#41;</span></pre></div></div>

<p>And last, your view file will look:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;">$def <span style="color: #ff7700;font-weight:bold;">with</span> <span style="color: black;">&#40;</span>posts<span style="color: black;">&#41;</span>
&nbsp;
&nbsp;
&nbsp;
&nbsp;
    Welcome
&nbsp;
&nbsp;
&nbsp;
<span style="color: #66cc66;">&lt;</span>ul<span style="color: #66cc66;">&gt;</span>
$for post <span style="color: #ff7700;font-weight:bold;">in</span> posts:
&nbsp;
&nbsp;
&nbsp;
	<span style="color: #66cc66;">&lt;</span>li <span style="color: #008000;">id</span>=<span style="color: #483d8b;">&quot;t$post.id&quot;</span><span style="color: #66cc66;">&gt;</span>$post.<span style="color: black;">title</span><span style="color: #66cc66;">&lt;</span>/li<span style="color: #66cc66;">&gt;</span>
&nbsp;
&nbsp;
 
<span style="color: #66cc66;">&lt;</span>/ul<span style="color: #66cc66;">&gt;</span></pre></div></div>

<p>Thats it, now your web.py become more MVC style. You can copy all this samples in <a href="http://kandarpy.appspot.com/">http://kandarpy.appspot.com/</a> any questions?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kandar.info/index.php/python/make-your-web-py-python-framework-more-mvc-style/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Panada 0.2.1 Telah Rilis</title>
		<link>http://www.kandar.info/index.php/panada/panada-0-2-1-telah-rilis</link>
		<comments>http://www.kandar.info/index.php/panada/panada-0-2-1-telah-rilis#comments</comments>
		<pubDate>Sun, 20 Feb 2011 08:11:20 +0000</pubDate>
		<dc:creator>kandar</dc:creator>
				<category><![CDATA[Panada]]></category>

		<guid isPermaLink="false">http://www.kandar.info/?p=121</guid>
		<description><![CDATA[Hari ini, secara resmi Panada versi 0.2.1 dirilis. Untuk mendownloadnya silahkan klik di sini. Selain melakukan perbaikan dari bug-bug yang ditemukan sebelumnya, beberapa fitur-fitur baru juga telah ditambahkan pada versi ini. Fitur baru ini antara lain: Sub Controller Feature ini memungkinkan pemanggilan controller dilakukan dari dalam sebuah controller. Hal ini berguna jika suatu controller ingin [...]]]></description>
			<content:encoded><![CDATA[<p>Hari ini, secara resmi <a href="http://panadaframework.com/">Panada</a> versi 0.2.1 dirilis. Untuk mendownloadnya silahkan klik <a href="http://github.com/k4ndar/Panada/archives/master">di sini</a>. Selain melakukan perbaikan dari bug-bug yang ditemukan sebelumnya, beberapa fitur-fitur baru juga telah ditambahkan pada versi ini. Fitur baru ini antara lain:<span id="more-121"></span></p>
<h4>Sub Controller</h4>
<p>Feature ini memungkinkan pemanggilan controller dilakukan dari dalam sebuah controller. Hal ini berguna jika suatu controller ingin menggunakan sumber daya (resources) yang ada pada controller lain. Lebih lanjut mengenai fitur ini bisa dilihat pada halaman dokumentasi mengenai <a href="http://panadaframework.com/documentation/id/references/controller.html#sub_controller">Sub Controller</a>.</p>
<h4>Alias Controller dan Alias Method</h4>
<p>Alias controller adalah pengembangan dari fitur short_url yang sudah ada pada versi sebelumnya. Fasilitas ini digunakan jika suatu controler tidak ingin disebut secara eksplisit. Informasi selengkapnya ada di halaman <a href="http://panadaframework.com/documentation/id/references/controller.html#alias_controller">Alias Controller</a>. Sedangkan alis method adalah fitur baru yang prinsip kerjanya sama seperti alias controller, namun berlaku di level method. Diskusi lebih jauh silahkan lihat di <a href="http://panadaframework.com/documentation/id/references/controller.html#alias_method">sini</a>.</p>
<h4>Error Handler</h4>
<p>Versi sebelumnya, setiap error ditangani langusng oleh PHP. Pada versi kali ini, kecuali Fatal Error, error yang muncul akan ditangani oleh Panada. Hal ini bertujuan untuk mempermudah dalam melakukan debugging pada proses development.</p>
<h4>Filter Input</h4>
<p>Dari sisi keamanan, kini telah ditambahkan fitur Filer Input. Bagian ini menggunakan fungsi filter_input() yang ada pada PHP mulai versi 5.2 ke atas. Dengan demikian, Panada versi 0.2.1 membutuhkan paling tidak PHP versi 5.2. Cara penggunaannya bisa dilihat di halaman <a href"http://panadaframework.com/documentation/id/classes/request.html">Request</a>.</p>
<h4>Load View</h4>
<p>Mulai versi ini, Panada menggunakan cara yang berbeda dalam memanggil file view dari versi sebelumnya. Jika sebelumnya adalah <b>$this->view(&#8216;NAMA_FILE&#8217;, $array_data)</b>, kini menjadi <b>$this->view_NAMA_FILE($array_data)</b>. Hal ini untuk lebih menguatkan penggunaan konsep OOP di Panada. Panduan penggunaan ada di halaman <a href="http://panadaframework.com/documentation/id/references/view.html">View</a>.</p>
<h4>Dokumentasi Offline</h4>
<p>Kini dokumentasi juga tersedia secara offline. Dokumentasi disertakan disetiap source yang didownload. Selain itu, terinspirasi dengan dokumentasi yang ada di PHP, di setiap halaman juga disertakan bagian diskusi. Diskusi yang ada di versi online juga akan tampil di halaman versi offline jika komputer yang digunakan terhubung dengan internet. Aplikasi diskusi/komentar menggunakan layanan <a href="http://disqus.com/">Disqus</a>.</p>
<p>Selain fitur-fitur baru, beberapa library dilakukan perbaikan dan juga penambahan baru. Di antaranya:</p>
<h4>Library Config</h4>
<p>Untuk menghindari penggunaan $GLOBALS variabel yang ada di versi sebelumnya, kini digunakan Library Config untuk menangani konfigurasi aplikasi. Cara melakukan konfigurasi ada di halaman <a href="http://panadaframework.com/documentation/id/config.html">ini</a>.</p>
<h4>Library Memcached</h4>
<p>Pada versi ini Panada secara natif telah mendukung penggunaan Memcached. Cara menggunakannya bisa dilihat di halaman <a href="http://panadaframework.com/documentation/id/classes/memcached.html">Library Memcached</a>.</p>
<h4>Library Mongodb</h4>
<p>Selain Memcached, MongoDB juga sudah didukung. MongoDB adalah database NOSQL yang bisa membantu kinerja aplikasi yang berbasis database menjadi lebih cepat. Keterangan lebih lanjut bisa dilihat di halaman <a href="http://panadaframework.com/documentation/id/classes/mongodb.html">Library Mongodb</a>.</p>
<h4>Library APC</h4>
<p>APC adalah object caching yang disedikan secara natif oleh PHP. Penggunaan ekstensi APC dapat meningkatkan kinerja aplikasi secara signifikan. Cara penggunaan APC di Panada bisa dilihat di halaman ini <a href="http://panadaframework.com/documentation/id/classes/apc.html">Library APC</a>.</p>
<p>Selain itu perbaikan juga dilakukan pada library db dengan tujuan untuk meningkatkan efisiensi penggunaan koneksi ke MySQL server.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kandar.info/index.php/panada/panada-0-2-1-telah-rilis/feed</wfw:commentRss>
		<slash:comments>25</slash:comments>
		</item>
		<item>
		<title>Panada Benchmark</title>
		<link>http://www.kandar.info/index.php/panada/panada-benchmark</link>
		<comments>http://www.kandar.info/index.php/panada/panada-benchmark#comments</comments>
		<pubDate>Fri, 18 Feb 2011 09:37:45 +0000</pubDate>
		<dc:creator>kandar</dc:creator>
				<category><![CDATA[Panada]]></category>

		<guid isPermaLink="false">http://www.kandar.info/?p=114</guid>
		<description><![CDATA[Sebagaimana yang umum dilakukan, salah satu unsur penilaian sebuah framework adalah performa kecepatan dalam melakukan suatu tugas. Walaupun bukan satu-satunya unsur penilaian untuk menyatakan bagus atau tidaknya sebuah framework, namun kecepatan bisa menggambarkan bagaimana sebuah framework bisa bekerja secara efisien. Grafik di bawah, menggambarkan bagaimana Panada bisa menyelesaikan suatu tugas dalam satuan waktu tertentu dibandingkan [...]]]></description>
			<content:encoded><![CDATA[<p>Sebagaimana yang umum dilakukan, salah satu unsur penilaian sebuah framework adalah performa kecepatan dalam melakukan suatu tugas. Walaupun bukan satu-satunya unsur penilaian untuk menyatakan bagus atau tidaknya sebuah framework, namun kecepatan bisa menggambarkan bagaimana sebuah framework bisa bekerja secara efisien.</p>
<p>Grafik di bawah, menggambarkan bagaimana Panada bisa menyelesaikan suatu tugas dalam satuan waktu tertentu dibandingkan dengan framework-framework populer yang ada saat ini. Benchmark berikut mengikuti cara yang digunakan Yii dalam melakukan benchmark. Untuk membaca lebih lanjut bisa dilihat di halaman <a href="http://www.yiiframework.com/performance">Performance of Yii</a>.<span id="more-114"></span></p>
<p>Tujuan dari benchmark ini adalah untuk membandingakan minimal overhead dari setiap framework, oleh karenanya pembuatan aplikasi harus dibuat seminimal mungkin, untuk itu aplikasi yang dibuat adalah &#8220;Hello World&#8221;. Untuk memastikan aplikasi bekerja seminimal mungkin, feature-feature seperti session dan database dinonaktifkan. Informasi lebih lanjut mengenai benchmark aplikasi, silahkan lihat di halaman <a href="http://code.google.com/p/phpmark/">phpmark project</a>.</p>
<p>Perhitungan didasarkan pada penilaian &#8220;banyaknya request yang bisa diterima dalam setiap detik&#8221; atau &#8220;request per second&#8221;. Artinya, semakin tinggi nilai yang didapat, nilainya semakin baik. Untuk mendapatkan data ini tools yang duganakan adalah ApacheBench dengan perintah:</p>
<pre>ab -t 30 -c 10 URL</pre>
<p>Untuk menghindari interference, maka setiap selesai melakukan banchmark sebuah framework dilakukan restart pada service Apache web server. Setiap framework dilakukan testing sebanyak tiga kali. Dari tiga kali pengujian diambil nilai yang paling tinggi. Berikut adalah spek komputer yang digunakan untuk banckmark:</p>
<ul>
<li>Operating System: Ubuntu 10.04 LTS Lucid Lynx</li>
<li>Web Server: Apache httpd 2.2.14</li>
<li>PHP: 5.3.2</li>
<li>CPU: AMD Turion(tm) 64 Mobile Technology MK-38</li>
<li>Main Memory: 1.2 GB</li>
<li>Hard Drive: 80 GB SATA</li>
</ul>
<p>Berikut adalah hasilnya:</p>
<div id="attachment_116" class="wp-caption aligncenter" style="width: 586px"><a href="http://www.kandar.info/wp-content/uploads/2011/02/panada_benchmark.jpg"><img class="size-full wp-image-116    " title="Hasil benchmark Panada" src="http://www.kandar.info/wp-content/uploads/2011/02/panada_benchmark.jpg" alt="" width="576" height="226" /></a><p class="wp-caption-text">Hasil benchmark Panada terhadap framework lain</p></div>
]]></content:encoded>
			<wfw:commentRss>http://www.kandar.info/index.php/panada/panada-benchmark/feed</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>Kenapa Panada?</title>
		<link>http://www.kandar.info/index.php/panada/kenapa-panada</link>
		<comments>http://www.kandar.info/index.php/panada/kenapa-panada#comments</comments>
		<pubDate>Sun, 13 Feb 2011 07:17:13 +0000</pubDate>
		<dc:creator>kandar</dc:creator>
				<category><![CDATA[Panada]]></category>

		<guid isPermaLink="false">http://www.kandar.info/?p=106</guid>
		<description><![CDATA[Kenapa musti bikin Framework lagi kalau banyak Framework yang bagus-bagus? Kira-kira seperti itu pertanyaan yang muncul dari dalam diri saya sendiri, dan kurang-lebih, juga datang dari teman-taman sekitar. Diantara semua jawaban yang coba saya cari, mungkin satu jawaban yang paling mendasar adalah &#8220;masih kurang puas&#8221;. Ya, sepertinya ini adalah jawaban yang paling pas dari pertanyaan [...]]]></description>
			<content:encoded><![CDATA[<p>Kenapa musti bikin Framework lagi kalau banyak Framework yang bagus-bagus? Kira-kira seperti itu pertanyaan yang muncul dari dalam diri saya sendiri, dan kurang-lebih, juga datang dari teman-taman sekitar. Diantara semua jawaban yang coba saya cari, mungkin satu jawaban yang paling mendasar adalah &#8220;masih kurang puas&#8221;.<span id="more-106"></span></p>
<p>Ya, sepertinya ini adalah jawaban yang paling pas dari pertanyaan di atas. Sebelumnya saya sempat beberapa kali mencoba untuk membuat sebuah Framework, namun tidak membuahkan hasil. Sebelum memulai mengerjakan Panada, saya sempat berencana untuk membuat sebuah toko online, Martwe namanya. Domainnya pun sudah dibeli dan bisa di akses di <a href="http://martwe.com/">http://martwe.com/</a>. Domain parkingnya masih numpang di hosting milik seorang teman di kantar. Dan teman kantor ini pulalah yang cukup tahu banyak mengenai projek ini.</p>
<p>Rencana saya ketika itu, sebelum sampai pada proses pengerjaan Martwe saya akan buat sebuah Framework dulu sebagai landasannya. Framework ini saat itu saya beri nama Martgear. Bagian inilah yang kemudian membawa saya untuk menggali lebih jauh Frmework-Framework yang sudah ada, salah satunya adalah <a href="http://codeigniter.com/">CodeIgniter</a>. CodeIgniter merupakan Framework yang paling sering saya gunakan, terutama untuk menyelesaikan pekerjaan-pekerjaan di kantor. Namun, yang ada saat itu bukannya membuat Framework baru, tapi justru hanya &#8216;comot&#8217; sana sini dari CodeIgniter. Mulai dari index.php, routing, Core System dan sampai ke Contoroller dan View, semuanya di ambil dari CI. &#8220;Ini namanya bukan bikin baru, tapi co-pas dari CI&#8221;, dalam hati saya. Kalau memang semua sama, kenapa tidak sekalain saya gunakan CI? toh sudah teruji bukan?</p>
<p>Martgear gagal, saya tidak puas karena memang bukan hasil pemikiran saya sendiri. Yang saya maksud pemikiran sendiri di sini adalah, membuat suatu Core Sistem Framework yang belum atau berbeda dari yang sudah ada. Dari sekian banyak Framework yang ada saat ini, semuanya memiliki Core System yang berbeda. Walaupun sebagian besar di antaranya memiliki patern yang sama, yaitu M-V-C. Core System adalah bagaimana suatu request diproses mulai dari penerima request (file index.php misalnya), diproses hingga sampai ke file Controller dan View yang kemudian ditampilkan ke si pengirim request. Keunikan Core System ini lah yang menjadi salah satu pembeda antara satu Framework dengan Framework lainnya. Efektifitas dan evisiensi pada Core System akan menjadikan suatu Framework bisa lebih cepat dari Frmework yang lain.</p>
<p>Berdasarkan informasi yang cukup banyak di internet, CodeIgniter merupakan Framework yang paling banyak digunakan. Selain karena ringan dan cepat, panduan dan dokumentasi yang disediakan juga sangat jelas. Sehingga sangat membantu para developer untuk mempelajarinya. Termasuk saya ketika pertama kali menggunakan. Namun demikian, saya merasa CI masih terlalu &#8220;gemuk&#8221;. Pada saat saya menulis artikel ini, ukuran CodeIgniter2 yang sudah diexstrak sekitar 3.9 MB. Dengan ukuran seperti ini, saya merasa terlalu mubazir karena lebih banyak bagian yang tidak saya gunakan dari semua file-file itu. Saya sadari memang, bahwa sebuah Framework sebisa mungkin menyediakan hampir semua tools sehingga mempermudah pekerjaan penggunanya. Dengan alasan ini, argumen CI terlalu gemuk, sudah terpatahkan sebenarnya. Untuk menyiasati agar tidak terlalu besar, saya pernah mencoba untuk mengurangi file-file core CI yang saya gunakan sehingga menjadi lebih light, namun tetap ini tidak membuat saya puas.</p>
<p>Hal lainnya yang juga mengganjal adalah, CI menurut saya kurang &#8220;straight to the point&#8221; dalam mengambil resources seperti library, model ataupun View. Ketika sebuah Controller membutuhkan sebuah library misalnya, maka paling tidak dia juga harus meload sebuah class Load. Saya membayangkan seandainya hal ini bisa di-bypass, pasti akan lebih cepat.</p>
<p>Di luar dari alasan ini, banyak hal yang saya kagumi dari CI. Salah satunya adalah pengelolaan antara Core System, Controller, Libraries dan View. Semuanya tersusuan secara rapih dan terstruktur. Terinpirasi dari hal inilah kemudian saya terapkan struktur yang sama di Panada.</p>
<p>Untuk alasan ramping, saya sempat mencoba beberapa Framework, <a href="http://project.madeam.com/projects/madeam">Madeam</a> di antaranya. Namun kandas, karena tidak semudah penggunaan CI. Saya juga sempat mencoba <a href="kohanaframework.org/">Kohana</a>, yang ukurannya hanya sekitar 1.7 MB, tapi lagi-lagi tidak memenuhi harapan saya.</p>
<p>Dengan prinsip &#8220;straight to the point&#8221; ini, maka saya coba membuat sebuah Core System sendiri. Saya pelajari lagi hal-hal apa saja yang ada di PHP 5 yang bisa saya manfaatkan. Yang saya inginkan dari Core System ini adalah, semua bisa dilakukan tanpa perlu melakukan banyak proses. Satu feature yang sangat menarik di PHP 5 adalah <a href="http://php.net/manual/en/language.oop5.autoload.php">__autoload()</a>. __autoload() adalah sebuah fungsi yang kita buat sendiri, di mana PHP mem-passing nama class yang sedang dipanggil ke dalam fungsi ini. Fungsi inilah yang kemudian menjadi processor utama dari seluruh Core System. Semua pembabakan Controller ataupun Library dilakukan secara cepat pada bagian ini.</p>
<p>Lalu bagaiman dengan View? semula View adalah salah satu method pada class Panada, di mana class Controller menjadi inheritance dari class ini, sehingga bisa langsung dimanfaatkan Controller untuk menampilkan file View. Namun hal ini saya ubah di versi 0.1.2. Dengan memanfaatkan feature magic method, untuk mengirimkan infromasi ke file View, mulai digunakan method __call() yang diletakkan di dalam class Panada. Prinsip kerjanya sama dengan fungsi __autoload() di mana PHP mem-passing argumen, dan kitalah yang melakukan sisanya.</p>
<p>Saya kurang terlalu pandai untuk mendeskripsikan dalam bahasa tulisan mengenai teknis proses bagaimana Core System Panada bekerja. Anda saya persilahkan langsung untuk melihatnya di halaman <a href="https://github.com/k4ndar/Panada/blob/master/panada/gear.php">gear.php</a>. File gear.php ini lah yang menjadi Core System di Panada. Seya berusaha untuk memberikan komentar sejelas mungkin agar mudah dipahami. Dengan begitu, saya berharap Anda bisa memberikan masukan agar Core System ini ataupun bagian yang lainnya bisa bekerja lebih baik, lebih efisien dan pada akhirnya bisa lebih cepat.</p>
<p>Untuk memenuhi &#8220;straight to the point&#8221; saya berharap proses yang dilakukan bisa lebih cepat. Oleh karenaya, saya selalu melakukan banchmark setiap kali melakukan suatu perubahan atau penambahan. Saya akan buat sebuah tulisan tersendiri mengenai Banchmark Panada terhadap Framework lain untuk meliahat seberapa cepat proses yang sama dilakukan oleh Panada.</p>
<p>Kali ini saya cukup puas dari apa yang saya sudah kerjakan di Panada. Tinggal tugas selanjutnya adalah mengembangkan lebih lanjut agar bisa dimanfaatkan oleh developer-developer lain untuk penggunaan aplikasi yang lebih luas.</p>
<p>Terakhir mengenai nama Panada itu sendiri. Saya sangat kagum terhadap projek-projek open source lokal yang umumnya juga menggunakan nama lokal. Sebut saja projek <a href="http://www.blankonlinux.or.id/">BlankOn</a>, <a href="http://id.wikipedia.org/wiki/Singkong_Linux/">Singkong</a> dll. Terinspirasi dari hal-hal ini, maka saya juga ingin memiliki nama Indonesia pada projek ini. Di kantor tempat saya bekerja, ada seorang penjual kue yang hampir setiap hari datang untuk menjajakan makanan ringan. Dari penjual kue ini, satu kue yang selalu saya cari adalah kue Panada. Kue asli asal Manado, Sulawesi Utara ini menurut saya sangat enak. Tidak terlalu besar namun memiliki isi yang berkualitas dan cukup komplit. Tidak perlu berfikir panjang, maka nama kue inilah yang saya abadikian untuk dijadikan nama sebuah Framework.</p>
<p>Jadi silahkan cicipi, rasakan dan nikmati &#8220;hidangan&#8221; khas Indonesia ini. Mudah-mudahan Anda menyukainya sehingga bisa menceritakan ke teman-teman Anda yang lain sehingga Panada tidak hanya disukai di Indonesia, tetapi juga di seluruh dunia, Amin.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kandar.info/index.php/panada/kenapa-panada/feed</wfw:commentRss>
		<slash:comments>44</slash:comments>
		</item>
		<item>
		<title>Configuring Nginx, MySQL and PHP  with FastCGI (spawn-fcgi) On Ubuntu 9.10</title>
		<link>http://www.kandar.info/index.php/linux/configuring-nginx-mysql-and-php-with-fastcgi-spawn-fcgi-on-ubuntu-910</link>
		<comments>http://www.kandar.info/index.php/linux/configuring-nginx-mysql-and-php-with-fastcgi-spawn-fcgi-on-ubuntu-910#comments</comments>
		<pubDate>Sun, 29 Nov 2009 03:01:30 +0000</pubDate>
		<dc:creator>kandar</dc:creator>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[fastcgi]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.kandar.info/?p=97</guid>
		<description><![CDATA[As lots of blogs and tutorial wrote, Nginx (pronounced &#8220;engine x&#8221;) is a high-performance HTTP server. The most great and important feature from Nginx is low resource consumption. So that, you can allocated your RAM Memory to other process such as MySQL or Memcached. This tutorial shows how you can install Nginx on an Ubuntu [...]]]></description>
			<content:encoded><![CDATA[<p>As lots of blogs and tutorial wrote, Nginx (pronounced &#8220;engine x&#8221;) is a high-performance HTTP server. The most great and important feature from Nginx is low resource consumption. So that, you can allocated your RAM Memory to other process such as MySQL or Memcached.  This tutorial shows how you can install Nginx on an Ubuntu 9.10 server with PHP5 support through FastCGI (spawn-fcgi).</p>
<p>Spawn FastCGI (spawn-fcgi) (http://redmine.lighttpd.net/projects/spawn-fcgi) is a project  originally to support Lihttpd. On lots of tutorial and how to, if we want to configuring Nginx and FastCGI, we have also install lighttpd to get  spawn-fcgi package. At that time there was still no standalone package for  spawn-fcgi. Fortunately since version 9.10 ( or 9.04) Ubuntu provide a standalone spawn-fcgi on  they&#8217;re repository. So that, you don&#8217;t have to install Lighttpd anymore. Lets start it!<span id="more-97"></span></p>
<p>Install package that we need for Nginx and PHP:</p>
<p>sudo apt-get install php5-cgi nginx spawn-fcgi</p>
<p>Start your Nginx server:</p>
<p>sudo service nginx start</p>
<p>Open your browser and point the adders to your IP or Hostname nginx server. If you see a page said &#8220;Welcome to nginx&#8221; it mean you are succeed installing nginx.</p>
<p>Now open nginx configuration file. Type:</p>
<p>vim /etc/nginx/sites-available/default</p>
<p>See part some things like this (on my ubuntu this is start on line 47):</p>
<p>#location ~ \.php$ {</p>
<p>#fastcgi_pass   127.0.0.1:9000;</p>
<p>#fastcgi_index  index.php;</p>
<p>#fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;</p>
<p>#includefastcgi_params;</p>
<p>#}<br />
Uncomment and edit it so its look like this:</p>
<p>location ~ \.php$ {<br />
fastcgi_pass   127.0.0.1:9000;<br />
fastcgi_index  index.php;<br />
fastcgi_param  SCRIPT_FILENAME  /var/www/nginx-default$fastcgi_script_name;<br />
include fastcgi_params;<br />
}</p>
<p>now save it.</p>
<p>Start your FastCGI. To start a PHP FastCGI daemon listening on port 9000 on localhost and running as the user and group www-data, we run the following command:</p>
<p>sudo spawn-fcgi -a 127.0.0.1 -p 9000 -u www-data -g www-data -f /usr/bin/php5-cgi -P /var/run/fastcgi-php.pid</p>
<p>Restart your nginx<br />
sudo service nginx restart</p>
<p>Now create phpinfo.php to test your server. Type:</p>
<p>vi /var/www/nginx-default/info.php</p>
<p>and fill this line:</p>
<p>&lt;?php<br />
phpinfo();<br />
?&gt;</p>
<p>Save it.</p>
<p>Now call that file in a browser (e.g. http://192.168.0.100/info.php).</p>
<p>As you see, PHP5 is working, and it&#8217;s working through FastCGI, as shown in the Server API line.</p>
<p>To make your nginx start every boot, type this:</p>
<p>sudo update-rc.d nginx defaults</p>
<p>To start FastCGI every boot, open rc.local file:</p>
<p>sudo vim /etc/rc.local</p>
<p>add this before exit line:</p>
<p>/usr/bin/spawn-fcgi -a 127.0.0.1 -p 9000 -u www-data -g www-data -f /usr/bin/php5-cgi -P /var/run/fastcgi-php.pid</p>
<p>Its time to instal MySQL.</p>
<p>sudo apt-get install mysql-server mysql-client php5-mysql</p>
<p>You will be asked to provide a password for the MySQL root user</p>
<p>When its done, you have to restart nginx once again.</p>
<p>sudo service nginx restart</p>
<p>call info file in a browser again. If your see word mysql in page appeared it mean you have done your works!</p>
<p>You should check these cool tutorial:</p>
<p><a href="http://www.howtoforge.com/installing-nginx-with-php5-and-mysql-support-on-ubuntu-8.10" target="_blank">http://www.howtoforge.com/installing-nginx-with-php5-and-mysql-support-on-ubuntu-8.10</a></p>
<p><a href="http://chrisjohnston.org/2009/setting-up-a-lemp-stack-ubuntu-904" target="_blank">http://chrisjohnston.org/2009/setting-up-a-lemp-stack-ubuntu-904</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.kandar.info/index.php/linux/configuring-nginx-mysql-and-php-with-fastcgi-spawn-fcgi-on-ubuntu-910/feed</wfw:commentRss>
		<slash:comments>24</slash:comments>
		</item>
		<item>
		<title>Integrasikan Single Sign On (SSO) Facebook Connect dengan Website Berbasis PHP</title>
		<link>http://www.kandar.info/index.php/php/integrasikan-single-sign-on-sso-facebook-connect-dengan-website-berbasis-php</link>
		<comments>http://www.kandar.info/index.php/php/integrasikan-single-sign-on-sso-facebook-connect-dengan-website-berbasis-php#comments</comments>
		<pubDate>Sun, 15 Nov 2009 07:23:40 +0000</pubDate>
		<dc:creator>kandar</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[facebook]]></category>
		<category><![CDATA[single sign on]]></category>
		<category><![CDATA[sso]]></category>

		<guid isPermaLink="false">http://www.kandar.info/?p=74</guid>
		<description><![CDATA[UPDATE: Semenjak Facebook meluncurkan Facebook Graph, yang menggunakan Oauth sebgai mekanisme otentifikasinya, Artikel ini sudah tidak relevan lagi. Untuk membaca lebih jauh tentang otentifikasi Facebook menggunakan Oauth 2.0 silahkan baca di link berikut http://developers.facebook.com/docs/api#authorization Facebook merupakan website jejaring sosial terbesar saat ini. Berdasarakan data Alexa Facebook menempati peringkat ke dua terbesar di seluruh dunia setelah [...]]]></description>
			<content:encoded><![CDATA[<pre>
UPDATE: Semenjak Facebook meluncurkan Facebook Graph, yang menggunakan Oauth sebgai mekanisme otentifikasinya, Artikel ini sudah tidak relevan lagi. Untuk membaca lebih jauh tentang otentifikasi Facebook menggunakan Oauth 2.0 silahkan baca di link berikut <a href="http://developers.facebook.com/docs/api#authorization">http://developers.facebook.com/docs/api#authorization</a>
</pre>
<p>Facebook merupakan website jejaring sosial terbesar saat ini. Berdasarakan data Alexa Facebook menempati peringkat ke dua terbesar di seluruh dunia setelah Google. Untuk di Indonesia sendiri Facebook menjadi website yang paling banyak dikunjungi.</p>
<p>Salah satu penyebab yang menjadikan Facebook begitu digemari oleh setiap orang adalah banyaknya applikasi yang bisa digunakan baik untuk kepentingan serius (seperti applikasi survey atau group) maupun sekedar mencari hiburan dengan bermain game. Banyaknya applikasi ini dimungkinkan karena Facebook membuka platform applikasinya sehingga bisa dipelajari dan digunakan oleh setiap developer applikasi.</p>
<p><span id="more-74"></span>Facebook Connect merupakan salah satu bagian dari platform ini dimana developer bisa menggunakannya untuk mengintegrasikan proses login dan mendapatkan data user untuk dimanfaatkan pada website kita. Dengan Facebook Connect user hanya cukup login seperti biasa di halaman login Facebook dan selebihnya Facebook akan mengirimkan data-data apa saja yang diperlukan untuk website kita.</p>
<p>Bagai mana caranya menggunakan Facebook Connect ini? Berikut adalah panduannya.</p>
<p><a href="http://www.kandar.info/demo/facebook-connect/" target="_blank">DEMO<br />
</a> | <a href="http://www.mediafire.com/file/52tdguogd01/facebook-connect.tar.gz" target="_blank">DOWNLOAD SOURCECODE</a></p>
<p>Yang pertama kali perlu Anda lakukan adalah membuat applikasi di halaman ini <a href="http://developers.facebook.com/setup.php" target="_blank">http://developers.facebook.com/setup.php</a>. Anda bisa mengikuti wizard yang ada atau bisa juga membaca panduannya di sini <a href="http://developers.facebook.com/get_started.php" target="_blank">http://developers.facebook.com/get_started.php</a>. Setelah selesai Anda akan mendapatkan API Key dan Application Secret. Kemudian Anda juga mebutuhkan Facebook PHP Client Library yang bisa didownload di sini <a href="http://svn.facebook.com/svnroot/platform/clients/packages/facebook-platform.tar.gz" target="_blank">http://svn.facebook.com/svnroot/platform/clients/packages/facebook-platform.tar.gz</a>.</p>
<p>Catatan: penulis melakukan modifikasi pada Library ini yaitu pada file facebook.php baris 238. Hal ini untuk memperbaiki penghapusan cookie pada saat logut.</p>
<p>Gunakanlah API Key dan Application Secret untuk mengisi nilai pada variable $appapikey dan $appsecret pada file config.php. Anda juga harus mengisikan nilai url path pada varible $this_root berikut adalah contohnya:</p>
<p>Berikut ini adalah fungsi untuk melakukan inisialisasi class facebook:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">function</span> _fbc_make_client<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">global</span> <span style="color: #000088;">$appapikey</span><span style="color: #339933;">,</span> <span style="color: #000088;">$appsecret</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">return</span> <span style="color: #000000; font-weight: bold;">new</span> Facebook<span style="color: #009900;">&#40;</span><span style="color: #000088;">$appapikey</span><span style="color: #339933;">,</span><span style="color: #000088;">$appsecret</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'connect.facebook.com'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Untuk memudahkan dalam mendapatkan object hasil dari class facebook, gunakan fungsi berikut ini:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">function</span> fbc_facebook_client<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  static <span style="color: #000088;">$facebook</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #339933;">;</span>
  <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$facebook</span> <span style="color: #339933;">===</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$facebook</span> <span style="color: #339933;">=</span> _fbc_make_client<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
  <span style="color: #b1b100;">return</span> <span style="color: #000088;">$facebook</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Untuk mendapatkan objek api client gunakan fungsi berikut:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">function</span> fbc_api_client<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #b1b100;">return</span> fbc_facebook_client<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>api_client<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Fungsi berikut ini digunakan untuk melakukan koneksi ke Facebook API tanpa haru menyertakan session user:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">function</span> fbc_anon_api_client<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #000088;">$client</span> <span style="color: #339933;">=</span> _fbc_make_client<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #000088;">$client</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>user <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
  <span style="color: #000088;">$client</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>api_client<span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>session_key <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #339933;">;</span>
  <span style="color: #b1b100;">return</span> <span style="color: #000088;">$client</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>api_client<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Berikut ini fungsi untuk mendefenisikan data apa saja yang akan kita minta ke Facebook:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">function</span> fbc_userinfo_keys<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #b1b100;">return</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'name'</span><span style="color: #339933;">,</span>
               <span style="color: #0000ff;">'first_name'</span><span style="color: #339933;">,</span>
               <span style="color: #0000ff;">'last_name'</span><span style="color: #339933;">,</span>
               <span style="color: #0000ff;">'proxied_email'</span><span style="color: #339933;">,</span>
               <span style="color: #0000ff;">'profile_url'</span><span style="color: #339933;">,</span>
				<span style="color: #0000ff;">'locale'</span><span style="color: #339933;">,</span>
				<span style="color: #0000ff;">'affiliations'</span><span style="color: #339933;">,</span>
				<span style="color: #0000ff;">'pic_square'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Untuk mendapatkan data user gunakan fungsi berikut ini:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">function</span> fbc_user<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #000088;">$fbuid</span> <span style="color: #339933;">=</span> fbc_facebook_client<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>get_loggedin_user<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$userinfo</span> <span style="color: #339933;">=</span> fbc_anon_api_client<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>users_getInfo<span style="color: #009900;">&#40;</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$fbuid</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
                                                   fbc_userinfo_keys<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$userinfo</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$userinfo</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">return</span> <span style="color: #000088;">$userinfo</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Contoh menggunakan fungsi di atas untuk mendapatkan data user adalah:</p>
<p>Contoh mendapatkan user id adalah:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$user_id</span> <span style="color: #339933;">=</span> fbc_facebook_client<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>get_loggedin_user<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Semua fungsi-fungsi di atas kita satukan pada halaman config.php</p>
<p>Berikutnya adalah membuat halaman index.php. Padahalaman ini kita include-kan file config.php. Setelah itu dilakukan pengecekan apakah user sudah terotentifikasi atau belum. Jika belum tampilkan link login dan jika sudah redirect user ke halaman home.php. Link login akan meredirect user ke halaman login pada website Facebook. Berikut adalah kode sumbernya:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #0000ff;">';
echo '</span>Click <span style="color: #339933;">&lt;</span>a href<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;index.php?login&quot;</span><span style="color: #339933;">&gt;</span>here<span style="color: #339933;">&lt;/</span>a<span style="color: #339933;">&gt;</span> to login with your Facebook account<span style="color: #339933;">.</span><span style="color: #0000ff;">';
echo '</span><span style="color: #0000ff;">';
?&amp;gt;</span></pre></div></div>

<p>Berikut ini adalah kode sumber untuk halaman home.php:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">logout<span style="color: #009900;">&#40;</span><span style="color: #000088;">$this_root</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'Harap tunggu...'</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000088;">$userinfo</span> <span style="color: #339933;">=</span> fbc_user<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
?<span style="color: #339933;">&amp;</span>gt<span style="color: #339933;">;</span>
&nbsp;
Welcome <span style="color: #339933;">&lt;</span>a href<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;&amp;lt;?php echo <span style="color: #006699; font-weight: bold;">$userinfo</span>['profile_url'];?&amp;gt;&quot;</span><span style="color: #339933;">&gt;&lt;/</span>a<span style="color: #339933;">&gt;</span> <span style="color: #339933;">&lt;</span>a href<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;?logout&quot;</span><span style="color: #339933;">&gt;</span>Logout<span style="color: #339933;">&lt;/</span>a<span style="color: #339933;">&gt;</span>
&nbsp;
<span style="color: #339933;">&lt;</span>img src<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;&amp;lt;?php echo <span style="color: #006699; font-weight: bold;">$userinfo</span>['pic_square'];?&amp;gt;&quot;</span> alt<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;&quot;</span> <span style="color: #339933;">/&gt;</span></pre></div></div>

<p>Pada contoh ini data user langsung digunakan untuk menampilkan informasi pada browser yang menyatakan ia telah login. Anda bisa memanfaatkan data yang diberikan Facebook dan menyimpannya ke dalam database applikasi Anda. Dengan begikut ketika user kembali login di lain waktu Anda hanya cukup melakukan pengecekan berdasarkan id-nya saja.</p>
<p>Mudah-mudahan panduan sederhana ini bisa bermanfaat buat teman-teman developer sekalian, selamat mencoba.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kandar.info/index.php/php/integrasikan-single-sign-on-sso-facebook-connect-dengan-website-berbasis-php/feed</wfw:commentRss>
		<slash:comments>20</slash:comments>
		</item>
	</channel>
</rss>

