Thursday, May 11, 2017

Default Authentification Laravel 5.4

Leave a Comment
Umumnya pada setiap pekerjaan atau proyek aplikasi web akan membutuhkan authentifikasi pengguna / sistem login sebelum dapat mengakses fitur aplikasi selain untuk alasan keamanan juga. Tutorial kali ini saya akan membahas bagaimana cara mengaktifkan modul authentifikasi default laravel, cukup dengan beberapa perintah, laravel sudah menyediakan mulai dari login akun pengguna, pendaftaran akun pengguna, sampai dengan fitur untuk mereset password jika lupa dan mengirim email untuk mendapatkan token untuk reset password. Kita akan melanjutkan project social yang sebelumnya sudah kita buat, untuk cara instalasi dan membuat project laravel bisa lihat di postingan saya sebelumnya hello laravel.

Konfigurasi Database

Langkah pertama adalah membuat database baru, laravel mendukung beberapa database diantaranya SQLite, MySQL, PostgreSQL dan SQL Server. Untuk tutorial ini saya menggunakan database MySQL. Buat database baru di PhpMyAdmin atau console, nama database terserah, saya membuatnya dengan nama social_db
membuat database baru di mysql
Membuat Database Baru di MySQL
Setelah database dibuat, langkah selanjutnya adalah konfigurasi database di laravel. Buka project social di IDE kesayangan anda. Buka file .env di root project, sesuaikan konfigurasi database anda.
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=social_db
DB_USERNAME=adit
DB_PASSWORD=adit
Untuk dapat melihat konfigurasi database secara lengkap ada di file config/database.php

Migration

Secara default, laravel menyediakan 2 file schema database dapat di lihat di direktori/folder database/migrations, schema database gampangnya adalah blueprint dari pembuatan table pada database. Migration pada laravel adalah proses mengubah / migrasi dari schema menjadi tabel-tabel database. Kita akan migrasikan 2 schema : create_users_table dan create_password_resets_table.
  • Buka terminal / command prompt dan ubah ke direktori atau folder root project social
  • Jalankan perintah : php artisan migrate
Migrasi Schema ke Database
  • Lihat hasil migrate, pastikan semua migrasi berjalan sukses, jika sukses periksa database social_db, tabel-tabel dari proses migrasi berhasil dibuat.
Table berhasil di buat
  • Jika muncul error "Specified key was too long; max key length is 767 bytes", berarti versi MySQL anda di bawah 5.7, laravel versi 5.4 mengubah default collationnya menjadi utf8mb4, karena di versi ini support untuk emoji which is membutuhkan karakter string lebih banyak. Cara mengatasinya, buka file AppServiceProvider.php yang terletak pada direktori app/Providers, kemudian modifikasi seperti berikut :
    <?php
    ...
    use Illuminate\Support\Facades\Schema;
    ...
    public function boot(){
        Schema::defaultStringLength(191);
    }
    

Generate Auth Scaffolding

Setelah tabel-tabel database selesai dibuat, kita akan mengenerate auth scaffolding bawaan laravel, laravel akan mengenerate Controller, Route, Model, dan View secara otomatis. 
  • Buka terminal / command prompt dan ubah ke direktori atau folder root project social
  • Jalankan perintah : php artisan make:auth
Generate Auth Scaffolding
  • Jika berhasil, aplikasi bisa langsung di test.

Testing

  • Buka terminal / command prompt dan ubah ke direktori atau folder root project social
  • Jalankan perintah : php artisan serve untuk menjalankan server lokal pada port 8000
  • Buka browser ketikkan alamat http://localhost:8000 atau http://127.0.0.1:8000.

Screenshots

Landing Page

Login

Homepage setelah login
Register


Download source code

  • Source code artikel ini dapat di download di github.
Read More...

Tuesday, May 9, 2017

Hello Laravel!

Leave a Comment
laravel logo
Halo sobat blogger, semoga kalian semua masih diberikan kesehatan oleh Allah SWT, amiin. Pada kesempatan kali ini saya akan membahas PHP framework yang cukup terkenal, Laravel. Ya, Laravel yang katanya Framework For Web Artisan (Framework untuk para seniman web). Laravel ini dibuat oleh Taylor Otwell yg basicnya dia itu programmer .net. Yang menurut saya cukup menarik dari framework ini adalah sintaksnya yg simple, human readable, ekspresif banget. Selain itu Laravel juga menyediakan fitur-fitur yg sering digunakan dalam web project seperti migration (seperti version control pada database), autentifikasi, form validation, semuanya disediakan Laravel out of the box. Jika ingin membuat Oauth2 server Laravel sudah menyediakan package Passport, membuat multiple social network login (Facebook, Twitter, G+, etc)? gampang banget, Laravel punya package yang namanya Socialite.

Kebutuhan Server (Requirements)

Untuk dapat menjalankan Laravel, dapat menggunakan Homestead, Valet (Khusus pengguna Mac) atau dapat menjalankan dengan spesifikasi berikut:
  • PHP minimum versi 5.6.4 atau lebih tinggi
  • Ekstensi PHP :
    • OpenSSL
    • PDO
    • Mbstring
    • Tokenizer
    • XML
  • Composer (Dependency manager for PHP)

Instalasi Laravel

Pastikan composer telah terinstall baik pada komputer anda, ada 2 cara untuk instalasi Laravel :
  • Via Laravel Installer
    • Buka terminal / command prompt dan ubah ke direktori yang diinginkan untuk menyimpan project.
    • Ketikkan perintah :
      composer global require "laravel/installer"
    • Untuk membuat project baru cukup ketikkan : laravel new <nama_project>
      laravel new social
    • Tunggu sampai download project selesai
  • Via Composer Create-Project
    • Buka terminal / command prompt dan ubah ke direktori yang diinginkan untuk menyimpan project.
    • Ketikkan perintah : composer create-project --prefer-dist laravel/laravel <nama_project>
      composer create-project --prefer-dist laravel/laravel social
    • Tunggu sampai download project selesai
  • Via Github
    • Download .zip source code laravel
    • Ekstrak folder master.zip. 
    • Buka terminal / command prompt dan ubah ke direktori folder hasil ekstrak.
    • Ketikkan perintah :
      composer update
    • Tunggu sampai proses update selesai.
instalasi laravel
Instalasi Laravel Sukses

Testing Local Server 



laravel local server
Running Laravel Local Server
"Good programmer write code for machine, great programmer write code for other programmer"
Read More...

Wednesday, October 19, 2016

Tutorial OAuth2 dengan CodeIgniter

3 comments
Pada kesempatan kali ini, saya akan membahas cara menggunakan OAuth (Open standard for Authentification) versi 2 pada framework CodeIgniter. Sebelumnya apa itu OAuth2? OAuth2 merupakan pengembangan dari OAuth versi pertama, yaitu sebuah protokol atau framework untuk mengamankan resource (biasanya webservice) dengan mengotorisasi penggunanya sebelum dapat menggunakan resource tersebut.

Persiapan :

Langkah-Langkah :

Ekstrak CodeIgniter 3.1.0.zip, letakkan di document root web server anda, rename foldernya menjadi ci-oauth2

Ekstrak library OAuth2 Server CodeIgniter dan rename nama foldernya menjadi oauth2, letakkan folder tersebut pada direktori library CodeIgniter (application/libraries/)

Kita akan melakukan instalasi oauth2-server-php dengan composer, buka terminal / console, ubah directory ke application/libararies/oauth2, ketikkan :
composer install
Install OAuth2 Server PHP via Composer
Bagi yang kesulitan menginstall via composer,  saya memberikan link lengkap source code di bagian akhir artikel ini.

Buat library CodeIgniter dengan nama Server.php (application/libraries/Server.php), ketikkan listing perintah berikut:
<?php
/**
* @package     Server.php
* @author      Aditya Nursyahbani
* @link        http://www.aditya-nursyahbani.net/2016/10/tutorial-oauth2-dengan-codeigniter.html
* @copyright   Copyright(c) 2016
* @version     1.0.0
**/
date_default_timezone_set('Asia/Jakarta');

class Server{
 function __construct($config=array()){
  require_once(__DIR__.'/../config/database.php');       
  require_once(__DIR__.'/../libraries/oauth2/src/OAuth2/Autoloader.php'); 
  $config = $db['oauth'];
  
  OAuth2Autoloader::register();
  $this->storage = new OAuth2StoragePdo(array('dsn' => $config["dsn"], 'username' => $config["username"], 'password' => $config["password"]));
  $this->server = new OAuth2Server($this->storage, array('allow_implicit' => true));
  $this->request = OAuth2Request::createFromGlobals();
  $this->response = new OAuth2Response();
 }

 /**
 * client_credentials
 */
 public function client_credentials(){
  $this->server->addGrantType(new OAuth2GrantTypeClientCredentials($this->storage, array(
      "allow_credentials_in_request_body" => true
  )));
  $this->server->handleTokenRequest($this->request)->send();
 }

 /**
 * password_credentials
 */
 public function password_credentials(){
  $users = array("adit" => array("password" => 'pass', 'first_name' => 'homeway', 'last_name' => 'yao'));
  $storage = new OAuth2StorageMemory(array('user_credentials' => $users));
  $this->server->addGrantType(new OAuth2GrantTypeUserCredentials($storage));
  $this->server->handleTokenRequest($this->request)->send();
 }

 /**
 * refresh_token
 */
 public function refresh_token(){
  $this->server->addGrantType(new OAuth2GrantTypeRefreshToken($this->storage, array(
   "always_issue_new_refresh_token" => true,
   "unset_refresh_token_after_use" => true,
   "refresh_token_lifetime" => 2419200,
  )));
  $this->server->handleTokenRequest($this->request)->send();
 }

 /**
 * limit scope
 */
 public function require_scope($scope=""){
  if (!$this->server->verifyResourceRequest($this->request, $this->response, $scope)) {
      $this->server->getResponse()->send();
      die;
  }
 }

 public function check_client_id(){
  if (!$this->server->validateAuthorizeRequest($this->request, $this->response)) {
      $this->response->send();
      die;
  }
 }

 public function authorize($is_authorized){
  $this->server->addGrantType(new OAuth2GrantTypeAuthorizationCode($this->storage));
  $this->server->handleAuthorizeRequest($this->request, $this->response, $is_authorized);
  if ($is_authorized) {
     $code = substr($this->response->getHttpHeader('Location'), strpos($this->response->getHttpHeader('Location'), 'code=')+5, 40);
     header("Location: ".$this->response->getHttpHeader('Location'));
    }
  $this->response->send();
 }

 public function authorization_code(){
  $this->server->addGrantType(new OAuth2GrantTypeAuthorizationCode($this->storage));
  $this->server->handleTokenRequest($this->request)->send();
 }
}
 /**
 * password_credentials
 */
 public function password_credentials(){
  $users = array("user" => array("password" => 'pass', 'first_name' => 'aditya', 'last_name' => 'nursyahbani'));
  $storage = new OAuth2\Storage\Memory(array('user_credentials' => $users));
  $this->server->addGrantType(new OAuth2\GrantType\UserCredentials($storage));
  $this->server->handleTokenRequest($this->request)->send();
 }

 /**
 * refresh_token
 */
 public function refresh_token(){
  $this->server->addGrantType(new OAuth2\GrantType\RefreshToken($this->storage, array(
   "always_issue_new_refresh_token" => true,
   "unset_refresh_token_after_use" => true,
   "refresh_token_lifetime" => 2419200,
  )));
  $this->server->handleTokenRequest($this->request)->send();
 }

 /**
 * limit scope
 */
 public function require_scope($scope=""){
  if (!$this->server->verifyResourceRequest($this->request, $this->response, $scope)) {
      $this->server->getResponse()->send();
      die;
  }
 }

 public function check_client_id(){
  if (!$this->server->validateAuthorizeRequest($this->request, $this->response)) {
      $this->response->send();
      die;
  }
 }

 public function authorize($is_authorized){
  $this->server->addGrantType(new OAuth2\GrantType\AuthorizationCode($this->storage));
  $this->server->handleAuthorizeRequest($this->request, $this->response, $is_authorized);
  if ($is_authorized) {
     $code = substr($this->response->getHttpHeader('Location'), strpos($this->response->getHttpHeader('Location'), 'code=')+5, 40);
     header("Location: ".$this->response->getHttpHeader('Location'));
    }
  $this->response->send();
 }

 public function authorization_code(){
  $this->server->addGrantType(new OAuth2\GrantType\AuthorizationCode($this->storage));
  $this->server->handleTokenRequest($this->request)->send();
 }
}

Ekstrak file Codeigniter Rest Client sesuai dengan direktorinya masing pada folder ci-oauth2

Pada artikel ini menggunakan database mysql, buat tabel database dengan nama oauth2, buka phpmyadmin/consol dan import file oauth2.sql dan country.sql ke tabel oauth2.

Konfigurasi koneksi database dengan codeigniter, buka file database.php yang terletak pada direktori application/config. Tambahkan baris berikut:

$db['oauth'] = array(
 'dsn' => 'mysql:dbname=oauth2;host=127.0.0.1',
 'hostname' => 'localhost',
 'username' => 'USERNAME_DB_HERE',
 'password' => 'PASSWORD_DB_HERE',
 'database' => 'oauth2',
 'dbdriver' => 'pdo',
 'dbprefix' => '',
 'pconnect' => FALSE,
 'db_debug' => (ENVIRONMENT !== 'production'),
 'cache_on' => FALSE,
 'cachedir' => '',
 'char_set' => 'utf8',
 'dbcollat' => 'utf8_general_ci',
 'swap_pre' => '',
 'encrypt' => FALSE,
 'compress' => FALSE,
 'stricton' => FALSE,
 'failover' => array(),
 'save_queries' => TRUE
);
Buat direktori dengan nama Oauth2 pada direktori application/controllers, buat controller-controller berikut:
Authorize.php
<?php
/**
* @package     Authorize.php
* @author      Aditya Nursyahbani
* @link        http://www.aditya-nursyahbani.net/2016/10/tutorial-oauth2-dengan-codeigniter.html
* @copyright   Copyright(c) 2016
* @version     1.0.0
**/

defined('BASEPATH') OR exit('No direct script access allowed');

class Authorize extends CI_Controller {
    function __construct(){
        @session_start();
        parent::__construct();
        $this->load->library("Server", "server");
    }

    function index(){
        $scope = $this->input->get("scope");
        $state = $this->input->get("state");
        $client_id = $this->input->get("client_id");
        $redirect_uri = $this->input->get("redirect_uri");
        $response_type = $this->input->get("response_type");

        if(!isset($_POST["authorized"])){
            $this->server->check_client_id();
            $data = array(
                "scope" => $scope,
                "state" => $state,
                "client_id" => $client_id,
                "redirect_uri" => $redirect_uri,
                "response_type" => $response_type,
            );
            $this->load->view("oauth2/authorize", $data);
        }else{
            $authorized = $this->input->post("authorized");
            if($authorized === "yes"){
                $this->server->authorize(($authorized === "yes"));
            }else{
                echo "error";
            }
        }
    }

    function token(){
        $this->server->authorization_code("yes");
    }
}

ClientCredentials.php
<?php
/**
* @package     ClientCredentials.php
* @author      Aditya Nursyahbani
* @link        http://www.aditya-nursyahbani.net/2016/10/tutorial-oauth2-dengan-codeigniter.html
* @copyright   Copyright(c) 2016
* @version     1.0.0
**/

defined('BASEPATH') OR exit('No direct script access allowed');

class ClientCredentials extends CI_Controller {
    function __construct(){
        @session_start();
        parent::__construct();
        $this->load->library("Server", "server");
    }    

    function index(){
        $this->server->client_credentials();
    }
}

PasswordCredentials.php
<?php
/**
* @package     PasswordCredentials.php
* @author      Aditya Nursyahbani
* @link        http://www.aditya-nursyahbani.net/2016/10/tutorial-oauth2-dengan-codeigniter.html
* @copyright   Copyright(c) 2016
* @version     1.0.0
**/
defined('BASEPATH') OR exit('No direct script access allowed');

class PasswordCredentials extends CI_Controller {
    function __construct(){
        @session_start();
        parent::__construct();
        $this->load->library("Server", "server");
    }    

    function index(){
        $this->server->password_credentials();
    }
}

RefreshToken.php
<?php
/**
* @package     RefreshToken.php
* @author      Aditya Nursyahbani
* @link        http://www.aditya-nursyahbani.net/2016/10/tutorial-oauth2-dengan-codeigniter.html
* @copyright   Copyright(c) 2016
* @version     1.0.0
**/
defined('BASEPATH') OR exit('No direct script access allowed');

class RefreshToken extends CI_Controller {
    function __construct(){
        @session_start();
        parent::__construct();
        $this->load->library("Server", "server");
    }    

    function index(){
        $this->server->refresh_token();
    }
}

Test.php
<?php
/**
* @package     Test.php
* @author      Aditya Nursyahbani
* @link        http://www.aditya-nursyahbani.net/2016/10/tutorial-oauth2-dengan-codeigniter.html
* @copyright   Copyright(c) 2016
* @version     1.0.0
**/

defined('BASEPATH') OR exit('No direct script access allowed');

class Test extends CI_Controller {
    function __construct(){
        @session_start();
        parent::__construct();
    }

    function index(){
     $this->load->view("oauth2/api");
    }

}

Buatlah direktori dengan nama oauth2 pada direktori application/views kemudian buatlah view berikut didalam direktori oauth2 :
api.php
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>CodeIgniter OAuth2 Tutorial</title>
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
    <meta name="description" content="CodeIgniter OAuth2 Tutorial">
    <meta property="og:type" content="website">
    <meta property="og:title" content="CodeIgniter OAuth2 Tutorial">
    <meta property="og:url" content="http://homeway.me">
    <meta property="og:site_name" content="CodeIgniter OAuth2 Tutorial">
    <meta property="og:description" content="CodeIgniter OAuth2 Tutorial">
    <meta name="twitter:title" content="@adit_gudhel">
    <link rel="publisher" href="aditya nursyahbani">
    <link href="http://cdn.bootcss.com/bootstrap/3.3.4/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>

<div class="row">
    <div class="col-md-2"></div>
    <div class="col-md-8">
        <br><br>
        <form class="form-inline">
            <h1>1. Request Access Token (Grant Type)</h1><br><br>

            <div class="form-group">
                <label for="Credentials"><h3>Resource Owner Password Credentials:</h3><br>
                    <div>Param:<code>{ grant_type: "password", username: "adit", password: "pass", client_id: 'client', client_secret:'mysecret', scope:'country' }</code></div><br>
                    <div>Result:<code id="return-PasswordCredentials"></code></div><br>
                </label><br>
                <a id="btn-PasswordCredentials" class="btn btn-success">Get PasswordCredentials</a><br>
            </div>
            <br><br>

            <div class="form-group">
                <label for="ClientCredentials"><h3>Client Credentials: </h3><br>
                    <div>Param:<code>{client_id: 'client', client_secret:'mysecret', grant_type:'client_credentials', scope:'country'}</code></div><br>
                    <div>Result:<code id="return-ClientCredentials"></code></div><br>
                </label><br>
                <a id="btn-ClientCredentials" class="btn btn-success">Get ClientCredentials</a>
            </div>
            <br><br>

            <div class="form-group">
                <label for="authorize">
                    <h3>Access_token(Authorization Code):</h3>
                    <div>Param:<code>{code: "Authorize code", client_id: 'client', client_secret:'mysecret', password:'pass', grant_type: 'authorization_code', scope:'country'}</code></div><br>
                    <div>Result:<code id="return-Authorize"></code></div><br>
                    <div>Link Auth <a target="_blank" href="/ci-oauth2/oauth2/authorize?response_type=code&client_id=client&redirect_uri=http://www.aditya-nursyahbani.net&state=xyz&scope=country">/ci-oauth2/oauth2/authorize?response_type=code&client_id=client&redirect_uri=<?=base_url('oauth2/test');?>&state=xxx&scope=country</a></div><br>
                </label><br>
                <input type="text" class="form-control" id="authorize-code" placeholder="Authorize code">
                <a id="btn-authorize" class="btn btn-success">Get Authorize Access Token</a>
            </div>

            <br><br>
            <div class="form-group">
                <label for="authorize">
                    <h3>Implicit Grant:</h3><br>
                    <div>Authorization Code Access Token</div><br>
                </label>
            </div>

            <br><br><br>
            <h1>2. Access Token </h1>
            <br><br><br>

            <div class="form-group">
                <label for="refresh-token">
                    <h3>Refresh Access Token</h3><br>
                    <div>Param:<code>{refresh_token: "Refresh Token", client_id: 'client', client_secret:'mysecret', grant_type:'refresh_token', scope:'country'}</code></div>
                    <div>Result: <code id="return-refresh-token"></code></div><br>
                </label><br>
                <input type="text" class="form-control refresh-token" id="old_token" placeholder="Refresh Token">
                <a id="btn-refresh" class="btn btn-success">From Refresh Token Get Access Token</a>
            </div>
            <br><br><br><br>

            <div class="form-group">
                <label for="resource">
                    <h3>From Access Token get Resource</h3><br>
                    <div>Param:<code>{ access_token: "Access Token"}</code></div><br>
                    <div>Result: <code id="return-resource"></code></div><br>
                </label><br>
                <input type="text" class="form-control token" id="resource" placeholder="Resource">
                <a id="btn-resource" class="btn btn-success">Get Resource</a>
                <a id="btn-resource-limit" class="btn btn-success">Get Resource With Scope Error</a>
            </div>
            <br><br>
        </form>
    </div>
</div>

<script src="http://cdn.bootcss.com/jquery/1.11.2/jquery.min.js"></script>
<script>
$(document).ready(function(){
    $("#btn-refresh").click(function (e){
        var data = {refresh_token: $("#old_token").val(), client_id: 'client', client_secret:'mysecret', grant_type:'refresh_token', scope:'country'};
        
        $.post('/ci-oauth2/oauth2/RefreshToken', data, function (d){
            console.log("Get Token => ", d);
            $('#return-refresh-token').html(JSON.stringify(d));
        });
    }); 

    $('#btn-authorize').click(function (e){
        var data = {code: $("#authorize-code").val(), client_id: 'client', client_secret:'mysecret', redirect_uri:"http://www.aditya-nursyahbani.net", grant_type: 'authorization_code', scope:'country'};
        $.post('/ci-oauth2/oauth2/authorize/token', data, function (d){
            $(".refresh-token").val(d.refresh_token);
            console.log("Get Authorize Access Token => ", d);
            $('#return-Authorize').html(JSON.stringify(d));
        },"json");
    });

    $('#btn-resource').click(function (e){
        var data = { access_token: $("#resource").val()};
        
        $.post('/ci-oauth2/api/countries', data, function (d){
            console.log("Get Authorize => ", d);
            $('#return-resource').html(JSON.stringify(d));
        },"json");      
    });

    $('#btn-resource-limit').click(function (e){
        var data = { access_token: $("#resource").val()};
        
        $.post('/ci-oauth2/oauth2/resource/limit', data, function (d){
            console.log("Get Authorize => ", d);
            $('#return-resource').html(JSON.stringify(d));
        },"json");      
    });

    $('#btn-PasswordCredentials').click(function (e){
        var data = { grant_type: "password", username: "adit", password: "pass", client_id: 'client', client_secret:'mysecret', scope:'country' };
        $.post('/ci-oauth2/oauth2/PasswordCredentials', data, function (d){
            console.log("Get Access Token from client credentials => ", d);
            $(".refresh-token").val(d.refresh_token);
            $(".token").val(d.access_token);
            $('#return-PasswordCredentials').html(JSON.stringify(d));
        },"json");
    });

    $("#btn-ClientCredentials").click(function (e){
        var data = {client_id: 'client', client_secret:'mysecret', grant_type:'client_credentials', scope:'country'};
        $.post('/ci-oauth2/oauth2/ClientCredentials', data, function (d){
            //d = d.JSON.parse(d);
            console.log("Get Access Token from password credentials => ", d);
            $(".token").val(d.access_token);
            $('#return-ClientCredentials').html(JSON.stringify(d));
        }, "json");
    });
});
</script>

authorize.php
<?php
$action = "/ci-oauth2/oauth2/Authorize?response_type=".$response_type."&client_id=".$client_id."&redirect_uri=".$redirect_uri."&state=".$state."&scope=".$scope;
?>

<body>
<div style="text-align:center;">
  <form method="post">
       <div class="oauth_content" node-type="commonlogin">
         <p class="oauth_main_info">Authorisasi?  <a href="http://www.aditya-nursyahbani.net/"  target="_blank" class="app_name">Ditya's Life</a></p>
   <input name="authorized" value="yes" hidden>
   <button>submit</button>
  </div>
    </form>
  
    </div>
</body>
</html>

Finally buatlah controller dengan nama Api.php fungsinya untuk membuat service-service apa saja yg mau diprovide / disediakan oleh web service, pada artikel ini kita mengambil contoh listing nama-nama negara. Ketikkan listing program berikut:

<?php
/**
* @package     Api.php
* @author      Aditya Nursyahbani
* @link        http://www.aditya-nursyahbani.net/2016/10/tutorial-oauth2-dengan-codeigniter.html
* @copyright   Copyright(c) 2016
* @version     1.0.0
**/

defined('BASEPATH') OR exit('No direct script access allowed');

require(APPPATH . 'libraries/REST_Controller.php');
 
class Api extends REST_Controller {

 function __construct(){
        @session_start();
        parent::__construct();
        $this->load->library("Server", "server");
     $this->server->require_scope("country");

        $this->load->database('oauth');
     $this->load->model('country_model');
    }

 function country_get(){
  if(!$this->get('id')) {
            $this->response(NULL, 400);
        }
 
        $country = $this->country_model->get($this->get('id'));
         
        if($country) {
            $this->response($country, 200); // 200 being the HTTP response code
        } else {
            $this->response(NULL, 404);
        }
 } 

 function countries_post(){
  $country = $this->country_model->get_all();
         
        if($country) {
            $this->response($country, 200); // 200 being the HTTP response code
        } else {
            $this->response(NULL, 404);
        }
 } 

}

Untuk mencoba oauth2nya ketikkan alamat http://localhost/ci-oauth2/oauth2/test


Download full source code pada artikel ini :

Read More...

Sunday, October 16, 2016

Install mcrypt di Mac OS X Sierra

Leave a Comment
Belum lama ini apple merilis sistem operasi baru (Operation System) Mac OS X Sierra. Banyak fitur-fitur baru yang ditawarkan dalam sierra ini. Bagi para developer Web, ternyata web server apache bawaan OS ini adalah versi 2.4 dengan PHP versi 5.6.24. Masalah yang sering timbul ketika update OS X salah satunya adalah service MySQL yang harus dikonfigurasi lagi karena tidak autostart (berjalan otomatis), sehingga perlu di konfigurasi lagi daemon mysqlnya supaya di load saat OS X startup.

Penasaran dengan OS X Sierra ini, akhirnya saya melakukan upgrade OS Macbook Pro. Selain harus mengkonfigurasi ulang service mysql, permasalahan yg timbul adalah extension Mcrypt atau extension yang biasa digunakan untuk mengenkripsi dan merupakan requirement jika kita mengembangkan web dengan framework Laravel ternyata tidak built in di PHP 5.6.24.

Untuk itu, kita harus melakukan compile dan build extension mcrypt secara manual agar dapat di load di PHP. Berikut ini merupakan langkah-langkanya agar ekstensi / library mcrypt dapat di jalankan:

Install Command Line Tools

caranya buka terminal / console ketikkan perintah berikut :
xcode-select --install

Disabled SIP / rootless

nonaktifkan System Integrity Protection (SIP) untuk mengijinkan akses terhadap folder sistem yg diproteksi. Kita tidak dapat menonaktifkan SIP ini dengan normal boot harus dari recovery boot. Berikut ini caranya:
  • Restart Mac OS X
  • Masuk ke Recovery Booting (pada saat bunyi startup chime, tekan Command + R secara bersamaan sampai masuk ke recovery booting)
  • Pilih Utilities -> Terminal
  • Ketika masuk jendela terminal, ketikkan :
csrutil disable

Download libmcrypt dan PHP

Download libmcrypt 2.5.8 dan PHP 5.6.24 sesuai dengan versi php built in.
Buat folder atau direktori mcrypt di home directory dan pindahkan hasil download ke dalam folder itu.
cd ~/
mkdir mcrypt
cd mcrypt
Ekstrak hasil download dan remove file gz
tar -zxvf libmcrypt-2.5.8.tar.gz
tar -zxvf php-5.6.24.tar.gz
rm *.gz

Konfigurasi libmcrypt

cd libmcrypt-2.5.8
./configure
make
sudo make install

Install Autoconf

cd ~/mcrypt
curl -0 http://ftp.gnu.org/gnu/autoconf/autoconf-latest.tar.gz
cd autoconf-2.69/
./configure
make install
sudo make install

Compile ekstensi libmcrypt pada PHP

cd ../php-5.6.24/ext/mcrypt/
/usr/bin/phpize
Kira-kira outputnya seperti ini :
PHP Api Version: 20131106
Zend Module Api No: 20131226
Zend Extension Api No: 220131226
./configure
make
sudo make install
Hasilnya kira-kira seperti ini:
Installing shared extensions: /usr/lib/php/extension/no-debug-non-zts-220131226

Mengaktifkan mcrypt di ekstensi PHP (mcrypt.so)

Buka php ini (/etc/php.ini), pastikan extension_dl = on dan tambahkan baris berikut di akhir file:
extension=mcrypt.so
Jika file php.ini tidak ada, lakukan hal berikut:
sudo cp /etc/php.ini.default /etc/php.ini
sudo chmod u+w /etc/php.ini

Finally restart apache

sudo service apache2 restart


Read More...

Sunday, November 3, 2013

Konfigurasi dan Instalasi Squid Proxy Server di Windows

Leave a Comment
squid proxy serverSetelah beberapa bulan udah jarang banget ngeblog, tiba-tiba hari ini gw kangen ngeblog. Pada blog post kali ini gw akan membahas tentang proxy server. Software proxy server yg akan kita gunakan adalah Squid Proxy Server (Squid 2.7 Stable8) dan kita akan mencoba instalasi dan konfigurasi pada platform Windows. Sebelum masuk ke pembahasan, apa sih proxy server itu...

Proxy server adalah sebuah server atau program komputer yang berperan sebagai penghubung antara suatu komputer dengan jaringan internet. Atau dalam kata lain, server proksi adalah suatu jaringan yang menjadi perantara antara jaringan lokal dan jaringan internet. Proxy server dapat berupa suatu sistem komputer ataupun sebuah aplikasi yang bertugas menjadi gateway atau pintu masuk yang menghubungan komputer kita dengan jaringan luar.

Proxy Server
Proxy Server
Nah, sampai sini udah pada ngerti kan apa itu proxy server. Banyak manfaat yang dapat kita peroleh jika menggunakan proxy server. Berikut manfaat proxy server itu sendiri :
  • Mempercepat load page / halaman web yang sering diakses. Squid proxy server dapat melakukan caching web pages atau menyimpan isi dari halaman-halaman yang sering dikunjungi sehingga dapat mempercepat loading halaman web dan juga dapat menghemat bandwidth internet anda.
  • Content filtering. Dengan menggunakan squid proxy server kita juga memfilter content / memblokir situs-situs pornografi atau situs-situs berbahaya berdasarkan domain, IP ataupun keyword suatu URL.
  • Squid proxy server juga dapat mengatur kontrol daftar akses / access list, mengalokasi kan bandwith dan membatasi size download.

Instalasi dan Konfigurasi

  • Download terlebih dahulu Squid 2.7 Stable8.zip untuk sistem operasi Windows.
  • Ekstrak folder squid dari file Squid 2.7 Stable8.zip dan letakkan pada direktori c:\
  • Sebelum menginstall squid, lakukan konfigurasi squid terlebih dahulu. File-file konfigurasi squid terletak pada direktori C:\squid\etc\. Terdapat 4 file didalam direktori tersebut
    • cachemgr.conf.default
    • mime.conf.default
    • squid.conf.default
    • squid_radius_auth.conf.default.
  •  Hapus / Rename semua file dengan ekstensi .default menjadi .conf sehingga semua file menjadi :
    • cachemgr.conf
    • mime.conf
    • squid.conf
    • squid_radius_auth.conf

Konfigurasi Squid

Buka file squid.conf yang terletak pada direktori C:\squid\etc\ dengan menggunakan Notepad atau text editor lainnya.

1. Setting port squid proxy

Gunakan fungsi Search/Find pada text editor anda, cari dengan kata kunci TAG: http_port. Tentukan no. port yang akan digunakan untuk proxy server, port yang umumnya digunakan adalah port 3128 atau anda juga dapat merubahnya dengan no. port lain.
Sintaks: http_port [no.port] atau http_port [hostname:no.port]
Contoh: http_port 3128 atau http_port localhost:3128 atau http_port 127.0.0.1:3128
# TAG: http_port
# Usage: port [options]
#  hostname:port [options]
#  1.2.3.4:port [options]
#
# The socket addresses where Squid will listen for HTTP client
...
# If you run Squid on a dual-homed machine with an internal
# and an external interface we recommend you to specify the
# internal address:port in http_port. This way Squid will only be
# visible on the internal address.
#
# Squid normally listens to port 3128
http_port 3128

2. Setting Daftar Akses / Access List (acl) dan http_access

ACL digunakan untuk membuat suatu rule/aturan yg akan diterapkan. Gunakan fungsi Search/Find pada text editor anda, cari dengan kata kunci TAG: acl. Karena jaringan di rumah saya menggunakan IP standar 192.168.1.0/24. Maka saya definisikan IP jaringan saya dengan nama_acl my_network (sesuaikan dengan IP jaringan anda).
Sintaks: acl [nama_acl] [tipe_acl] [argument/file]
Contoh: acl my_network src 192.168.1.0/24
# TAG: acl
#  TAG: acl
# Defining an Access List
#
#    Every access list definition must begin with an aclname and acltype, 
#    followed by either type-specific arguments or a quoted filename that
#    they are read from.
#
...
#Recommended minimum configuration:
acl all src all
acl manager proto cache_object
acl localhost src 127.0.0.1/32
acl to_localhost dst 127.0.0.0/8 0.0.0.0/32
#
# Example rule allowing access from your local networks.
# Adapt to list your (internal) IP networks from where browsing
# should be allowed
acl localnet src 10.0.0.0/8 # RFC1918 possible internal network
acl localnet src 172.16.0.0/12 # RFC1918 possible internal network
acl localnet src 192.168.0.0/16 # RFC1918 possible internal network
acl my_network src 192.168.1.0/24
#

Setelah mendefinisikan access list, langkah selanjutnya adalah pemberian akses (Allow atau Deny) acl yang telah dibuat sebelumnya. Gunakan kembali fungsi find/search pada text editor anda dan cari TAG: http_access. Tambahkan sintaks http_access allow localhost dan http_access allow my_network tepat dibawah sintaks http_access allow localnet untuk memberikan ijin akses internet (http) ke localhost (127.0.0.1) dan IP jaringan kita yg telah didefinisikan pada acl.
#  TAG: http_access
# Allowing or Denying access based on defined access lists
#
# Access to the HTTP port:
# http_access allow|deny [!]aclname ...
#
...
#Recommended minimum configuration:
#
# Only allow cachemgr access from localhost
http_access allow manager localhost
http_access deny manager
# Deny requests to unknown ports
http_access deny !Safe_ports
# Deny CONNECT to other than SSL ports
http_access deny CONNECT !SSL_ports
#
...
# INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS

# Example rule allowing access from your local networks.
# Adapt localnet in the ACL section to list your (internal) IP networks
# from where browsing should be allowed
http_access allow localnet
http_access allow localhost
http_access allow my_network

# And finally deny all other access to this proxy
http_access deny all
#

3. Setting DNS (Domain Name Server)

Untuk konfigurasi DNS sesuaikan dengan DNS ISP anda. Untuk alamat DNS Server yang menggunakan Speedy dapat dilihat disini. Konfigurasi DNS bisa anda cari pada TAG: dns_nameservers. Pada tutorial ini saya menggunakan DNS Speedy sebagai DNS primarynya dan OpenDNS untuk DNS secondarynya.
Sintaks: dns_nameservers [DNS Primary] [DNS Secondary]
Contoh: dns_nameservers 202.134.2.5 208.67.222.222
#  TAG: dns_nameservers
# Use this if you want to specify a list of DNS name servers
# (IP addresses) to use instead of those given in your
# /etc/resolv.conf file.
# On Windows platforms, if no value is specified here or in
# the /etc/resolv.conf file, the list of DNS name servers are
# taken from the Windows registry, both static and dynamic DHCP
# configurations are supported.
#
# Example: dns_nameservers 10.0.0.1 192.172.0.4
#
dns_nameservers 202.134.2.5 208.67.222.222
#
Read More...