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>' : ''; ?>
7. Selesai
Kemana selanjutnya??
Mudah2an saya masih mood melanjutkan tutorial selanjutnya..
Dear Mas Hafid,
Dari contoh diatas, pada app\models\LoginForm.php, model Client diambil dari mana ya?
$client = new Client();
template basic & advanced yii2 secara defaut tidak memiliki model tsb..
Saya menggunakan template advanced Yii2, dan saat memodifikasi common\models\LoginForm.php seperti contoh diatas, menemui error:
Class ‘common\models\Client’ not found
use yii\httpclient\Client;
Tapi sebelumnya mas install dulu httpclient dengan composer.
Tambahkan baris ini di composer.json
“yiisoft/yii2-httpclient”: “~2.0.0″
Trus update composernya
Mas Hafid, sy sudah ikutin tutorial diatas dengan install yii sebagai client rest. Login sudah berhasil, cuman logoutnya gagal mas. Apa yg perlu sy ubah di action logoutnya?