Yii2: Authentication on Yii2 Restful Web Service – Part 1

Kalau sebelumnya kita belajar tentang begitu mudahnya membuat web service di Yii2 maka kali ini kita akan belajar tentang salah satu hal yang cukup penting berkaitan dengan web service yaitu tentang authentication. Intinya adalah bagaimana kita memverifikasi user yang mengakses web service kita.

Lantas, apa bedanya dengan Authentication normal? bedanya adalah auth normal bersifat stateful dimana kita bisa menggunakan session untuk menyimpan data user yang sedang login selama web browser yang merequest masih dijalankan. Coba baca lagi tentang restful web service (http://www.hafidmukhlasin.com/2015/12/08/mengenal-restful-web-service/).

Karena penjelasan tentang authentication ini sangat panjang (bukan sulit) tapi memang panjang maka saya akan bagi menjadi beberapa bagian.
1. Bagaimana membuat mekanisme login dari sisi server
2. Bagaimana membuat mekanisme login dari sisi client
3. Bagaimana membatasi suatu resource sehingga hanya yang sudah login yang boleh mengaksesnya

Kita mulai dari bagian pertama. yaitu mekanisme login dari sisi server.

Saya akan menggunakan pendekatan yang paling simple disini, yaitu:
1. client mengirimkan username n password ke server
2. server mengecek apakah ada username tsb di database dan apakah passwordnya benar
3. jika username tsb ada, maka server mengcreate token
4. Token tersebut dikirimkan ke client
5. Kemudian client menyimpan token tsb dan menggunakankannya untuk melakukan transaksi lagi ke server.
6. Selesai.

Untuk memudahkan pemahaman kita, maka poin nomer 3 diatas yaitu “maka server mengcreate token” akan diubah dengan server mengambil auth_key pada tabel user sebagai token. (kalo ingin lebih advancednya anda harus mempelajari tentang Json Web Token).

Oke kita lakukan step by stepnya.
1. Buat sebuat controller, bebas namanya.. disinialah kode auth kita letakkan
app\controllers\AuthController.php

<?php
namespace app\controllers;
use Yii;

class AuthController extends \yii\rest\Controller
{

}

2. Pada controllers tersebut buat fungsi login

public function actionLogin(){
    // Tangkap data login dari client (username & password)
    $username = !empty($_POST['username'])?$_POST['username']:'';
    $password = !empty($_POST['password'])?$_POST['password']:'';
    $response = [];
    // validasi jika kosong
    if(empty($username) || empty($password)){
      $response = [
        'status' => 'error',
        'message' => 'username & password tidak boleh kosong!',
        'data' => '',
      ];
    }
    else{
        // cari di database, ada nggak username dimaksud
        $user = \app\models\User::findByUsername($username);
        // jika username ada maka
        if(!empty($user)){
          // check, valid nggak passwordnya, jika valid maka bikin response success
          if($user->validatePassword($password)){
            $response = [
              'status' => 'success',
              'message' => 'login berhasil!',
              'data' => [
                  'id' => $user->id,
                  'username' => $user->username,
                  // token diambil dari field auth_key
                  'token' => $user->auth_key,
              ]
            ];
          }
          // Jika password salah maka bikin response seperti ini
          else{
            $response = [
              'status' => 'error',
              'message' => 'password salah!',
              'data' => '',
            ];
          }
        }
        // Jika username tidak ditemukan bikin response kek gini
        else{
          $response = [
            'status' => 'error',
            'message' => 'username tidak ditemukan dalam database!',
            'data' => '',
          ];
        }
    }

    return $response;
}

3. Tambahkan fungsi verb untuk membatasi method yang bisa digunakan untuk mengakses fungsi login yaitu POST

protected function verbs()
{
   return [
       'login' => ['POST'],
   ];
}

4. Selesai.

Waktunya testing
1. Gunakan tools buat testing misalnya: POSTMAN atau HttpMaster
2. Gunakan url http://path_to_your_project/web/auth/login
3. Set HttpMethodnya menjadi POST
4. Lalu pada header atau kalau di httpMaster pada string data, masukkan data login Anda, misal

username=admin&password=123456

5. Kemudian submit dan lihat hasilnya

{
  "status": "success",
  "message": "login berhasil!",
  "data": {
    "id": 1,
    "username": "admin",
    "token": "cYofUxpZ3CTHmO-YAx_7Cj0rWqQE1A0h"
  }
}

Jika login gagal, misal password salah maka akan muncul

{
  "status": "error",
  "message": "password salah!",
  "data": ""
}

6. Selesai..

Mudah sekali bukan? :)

Update:
Karena restful tidak menggunakan session maka kita set false saja .. app\config\web.php pada component user

'user' => [
'identityClass' => 'app\models\User',
//'enableAutoLogin' => true,
'enableSession' => false,
'loginUrl' => null,
//'authTimeout' => 60*30,
],

Leave a Reply

Your email address will not be published. Required fields are marked *