Implementasi Http Basic Auth Pada RESTful Yii2

Bagi yang sedang belajar membuat web service dengan yii framework (Yii2), di sini saya akan coba share contoh sederhana membuat web service dengan meng-implementasi metode ‘http basic auth‘. Secara default, metode autentikasi yang bisa kita pakai pada web service yang dibangun menggunakan framework yii2 selain basic auth adalah query parameter dan OAuth2. Namun pada postingan kali ini, kita akan mempelajari salah satu metode yang cukup simple dulu yaitu http basic auth. Bagaimana caranya? cukup mudah agan-agan… yang paling penting, agan-agan sudah punya basic tentang yiiframework versi 2 dan beberapa teori tentang web service karena di sini saya tidak akan menjelaskan tentang dasar teori Yii2 dan web service… Oke, kita langsung saja.. cekidoottttt.

Create projek baru

Pertama-tama, silahkan buat projek baru menggunakan yii2 basic. Kita beri nama app nya dengan nama ‘api’.

composer create-project --prefer-dist yiisoft/yii2-app-basic api

Buat database

Selanjutnya kita buat database dengan nama yiiapi, dan tabel post untuk sample. Silahkan copas skrip sql di bawah ini.

CREATE TABLE `post` (
`id` INT NOT NULL AUTO_INCREMENT ,
`tanggal` DATE NOT NULL ,
`judul` VARCHAR(100) NOT NULL ,
`isi` TEXT NOT NULL ,
`user` VARCHAR(25) NOT NULL , PRIMARY KEY (`id`)
) ENGINE = InnoDB;

lalu isi data sample (tabel post)

INSERT INTO `post` (`id`, `tanggal`, `judul`, `isi`, `user`) VALUES (NULL, '2018-09-24', 'Tes post', 'ini adalah isi post', 'abah')

Update config database di config/db.php, sesuaikan akun database dengan yang punya agan masing-masing..

db config yii2

Generate Model

Selanjutnya, kita generate model post menggunakan Gii, silahkan masuk ke url  http://localhost/api/web/index.php?r=gii. Pilih model generator.

Post.php

model generator

Buat controller tanpa http basic auth

Lalu kita buat PostController.php secara manual ya.., silahkan copas skrip di bawah ini

<?php

namespace app\controllers;

class PostController extends \yii\rest\ActiveController
{
  public $modelClass = 'app\models\Post';
    

}

Simpan di folder ‘controllers‘ ya, nah sampai sini kita mempunyai 2 tambahan file yaitu Post.php dan PostController.php. Kemudian, kita akan menambahkan beberapa konfigurasi di file config. Silahkan buka file web.php yang terdapat di dalam folder config.

Update bagian urlManager menjadi seperti di bawah ini.

'urlManager' => [
            'enablePrettyUrl' => true,
            'showScriptName' => true,
            'enableStrictParsing' => true,
            'rules' => [
                ['class' => 'yii\rest\UrlRule', 'controller' => 'post']
            ],
        ],

lalu tambahkan parser pada bagian request untuk memparsing data json saat mengirim data.

'parsers' => [
  'application/json' => 'yii\web\JsonParser',
]

Sekarang kita coba… buka postman, kalau yang belum ada silahkan install dulu atau pakai yang biasa agan pakai..

Masukan url http://localhost/api/web/index.php/posts pada address bar dengan verb GET

test api basic auth

Jreng..jreng..jreeenggg….sudah bisa get data, sekarang kita coba untuk POST data.

test api

Superb sekali, sudah bisa post data juga.. Kok bisa? Kalau agan perhatikan, class PostController.php yang kita buat di atas meng-extend dari class \yii\rest\ActiveController, secara default jika kita memakai class ini maka action CRUD (create, read, update, delete) itu sudah tersedia otomatis jadi kita tinggal pakai saja. Lalu bagaimana jika kita ingin membuat action yang lain atau mengcustom action yang ada? Selain \yii\rest\ActiveController ternyata yii2 juga menyediakan class yang lain yaitu yii\rest\Controller yang bisa kita pakai untuk membuat controller REST, bedanya dengan yang pertama adalah kita harus membuat tiap action pada controller secara manual, ini cocok jika api yang akan kita bangun agak sedikit kompleks. Untuk lebih detail silahkan baca-baca di sini.

 

Implementasi http basic auth

Nah seperti yang agan lihat, sample di atas masih tanpa autentikasi (No Auth)..

test http basic auth yii2

Lantas, bagaimana cara kita meng-implementasi  http basic auth pada PostController yang telah kita buat di atas ? Caranya mudah, pertama-tama tambahkan behavior pada PostController untuk mengaktifkan http basic auth.

use yii\filters\auth\HttpBasicAuth;
public function behaviors()
{
  $behaviors = parent::behaviors();
  $behaviors['authenticator'] = [
    'class' => HttpBasicAuth::className(),
  ];
  return $behaviors;
}

Skrip di atas secara default akan megimplementasi autentikasi berdasarkan accessToken yaitu akan memanggil fungsi findIdentityByAccessToken() pada model User.php.

Jika kita test kembali api post pada postman maka sekarang server akan memberikan respon ‘Unauthorized‘ karena kita perlu mengirimkan accessToken setiap melakukan request untuk proses autentikasi.

Unauthorized

Jika kita lihat pada model User.php bawaan nya yii, terdapat info user yang dihardcode untuk sample implementasi login dan kita akan gunakan user dummy tersebut untuk kebutuhan testing (kalau aplikasi real tentunya akan menggunakan database).

user dummy yii2

Kita gunakan accessToken 100-token, silahkan buka lagi postman nya lalu ubah authorization type menjadi basic auth, dan isikan token pada kolom username. Kemudian send request lagi.

basic auth yii2

Maka kali ini server akan merespon dengan mengirimkan data post yang ada di database. Bagaimana jika kita ingin mengubah proses autentikasi menggunakan username dan password? bukan menggunakan access token? Ini juga cukup mudah dilakukan, kita tinggal mendefinisikan fungsi autentikasi yang akan dipakai pada behaviour PostController.

  public function behaviors()
  {
    $behaviors = parent::behaviors();
    $behaviors['authenticator'] = [
      'class' => HttpBasicAuth::className(),
      //definisikan fungsi yg akan dipakai untuk otentikasi
      'auth' => function ($username, $password) {
        $user = User::findByUsername($username);
        if(!is_null($user)){
          if ($user->validatePassword($password)) {
            return $user;
          }
        }
        
        return null;
      },
    ];
    return $behaviors;
  }

Sekarang silahkan coba masukan username : admin dan password : admin. 

auth dengan username dan password

 

Bagaimana hasilnya? Selamat mencoba…

 


Baca juga tutorial yii lainnya :

>> Membuat generator invoice sederhana

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *