Yii2: Authentication on Yii2 Restful Web Service – Part 2

Artikel ini adalah lanjutan dari artikel sebelumnya: http://www.hafidmukhlasin.com/2015/12/08/yii2-authentication-on-yii2-web-service-restful-part-1/
Silahkan baca dulu bagi yang belum.

Pada artikel sebelumnya kita telah membahas bagaimana menghandle authenticationnya, dan itu kita anggap sebagai aplikasi sisi servernya. Nah sekarang kita bikin aplikasi sisi clientnya, agar tidak mainstream maka saya tidak akan menggunakan angular, react atau js2 library lain buat mbikin aplikasi clientnya.. udah banyak tutorialnya.. Karena itu saya lebih memilih menggunakan yiiframework juga sebagai client.

Jadi, pada skenario ini ada dua aplikasi yii ya..
1. App as Web Service
2. App as Web Client

Oke mari kita mulai..

1. install yiiframework template basic yang nanti akan kita jadikan sebagai web clientnya

php composer.phar global require "fxp/composer-asset-plugin:~1.1.1"
php composer.phar create-project yiisoft/yii2-app-basic basic 2.0.6

2. untuk app client, kita tidak perlu database, pada app\config\web.php, silahkan dicomment db nya

//'db' => require(__DIR__ . '/db.php'),

3. pada app\models\User.php, hapus property private static $users, karena kita tidak perlu lagi

/*
private static $users = [
    '100' => [
        'id' => '100',
        'username' => 'admin',
        'password' => 'admin',
        'authKey' => 'test100key',
        'accessToken' => '100-token',
    ],
    '101' => [
        'id' => '101',
        'username' => 'demo',
        'password' => 'demo',
        'authKey' => 'test101key',
        'accessToken' => '101-token',
    ],
];
*/

4. Sebagai gantinya, masih pada file yang sama, ubah public static function findIdentity($id) sebagai berikut

public static function findIdentity($id)
{
    $session = Yii::$app->session;
    return ($session->has('user')) ? new static($session->get('user')) : null;
}

Kode diatas melakukan instant terhadap variabel user yang didapat dari session user, dimana session user tersebut didapat dari request ke web service.
5. Modifikasi fungsi login pada app\models\LoginForm
Inget pada artikel sebelumnya, url untuk service login adalah

http://path_to_your_project/web/auth/login

dengan mengirimkan dua variabel username & password
kemudian output yang akan muncul jika login sukses adalah

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

maka kita bisa modifikasi action login pada app\models\LoginForm sbb

public function login()
{
    $client = new Client();
    $response = $client->createRequest()
      ->setMethod('post')
      ->setUrl('http://localhost/project/rest/web/auth/login')
      ->setData(['username' => $this->username, 'password' => $this->password])
      ->send();
    $session = Yii::$app->session;
    //set default error, You can use flash message
    $session->set('message', 'login error kaka..');
    if ($response->isOk) {
      $status = $response->data['status'];
      $message = $response->data['message'];
      $data = $response->data['data'];
      // check login success
      if($status==='success' and !empty($data)){
        $user=[
          'id' => $data['id'],
          'username' => $data['username'],
          'authKey' => $data['token'],
          'accessToken' => $data['token'],
        ];
        // save to session for reading in model user
        $session->set('user', $user);

        // create instance form model user
        if($user = User::findIdentity($user['id'])){
          $session->remove('message');
          return Yii::$app->user->login($user, $this->rememberMe ? 3600*24*30 : 0);
        }
      }
    }
    return false;
}

6. dan yang terakhir, pada views\site\login.php tambahkan kode untuk menampilkan error message (hanya jika error)

<?php
$session = Yii::$app->session;
echo ($session->has('message')) ? '<div class="alert alert-warning">' . $session->get('message') . '</div>' : '';
?>

login-error

7. Selesai

Kemana selanjutnya??

Mudah2an saya masih mood melanjutkan tutorial selanjutnya.. :)

One Response
  1. Jun

Leave a Reply

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