Yii2: Authentication on Yii2 Restful Web Service – Part 3

Artikel ini adalah lanjutan dari 2 artikel sebelumnya

  1. http://www.hafidmukhlasin.com/2015/12/08/yii2-authentication-on-yii2-web-service-restful-part-1/
  2. http://www.hafidmukhlasin.com/2015/12/13/yii2-authentication-on-yii2-restful-web-service-part-2/

Silahkan dibaca dulu biar gak bingung.

Pada artikel pertama kita telah membahas tentang bagaimana membuat mekanisme login dari sisi server, yang pada implementasinya digunakan untuk mendapatkan token dari user login sebagai alat untuk otentikasi request selanjutnya, sedangkan pada artikel kedua juga telah dibahas tentang bagaimana membuat mekanisme login dari sisi client. Nah, ini adalah artikel pamungkas atau terakhir dalam trilogi restful yii2. Yaitu bagaimana membatasi suatu resource sehingga hanya yang sudah login yang boleh mengaksesnya.

Pada artikel yang lain saya juga telah menjelaskan mengenai hal ini namun belum masuk ke otentikasi http://www.hafidmukhlasin.com/2015/12/07/yii2-flexible-way-to-create-restful-web-service-on-yii-2/. Pada tutorial ini saya punya tabel example (id, name, city) yang telah terisi beberapa data sebagai resource yang akan kita sediakan untuk web service kita.

Okey langsung saja kita bikin satu controler sbb

<?php
namespace app\controllers;
use Yii;
use app\models\Example;

class ExampleController extends \yii\rest\Controller
{

    protected function verbs()
  	{
  	   return [
  	       'index' => ['GET'],
  	   ];
  	}

    public function actionIndex(){
        $examples = Example::find()->all();
        return [
			'data'=>$examples,
		];
    }
}

sekarang silahkan diakses menggunakan url `index.php?r=example/index` maka akan muncul list data example.

rest1

Sampai disini maka siapapun bisa menggunakan resource ini, nah untuk itu kita perlu fungsi untuk membatasi agar hanya user tertentu yang bisa mengaksesnya.. implementasi yang umum dilakukan adalah dengan menggunakan proteksi token, jadi hanya user dengan token tertentu yang bisa mengakses resource ini.

1. Pastikan bahwa tidak ada session diantara kita :). Yup konsep restful itu stateles artinya gak pake session. di app\config\web.php

'components' => [
	...
	'user' => [
		'identityClass' => 'app\models\User',
		'enableSession' => false,
		'loginUrl' => null,
	],
	...
]

2. Replace model user (app\models\User.php) dengan model User dari template advanced

https://github.com/yiisoft/yii2-app-advanced/blob/master/common/models/User.php

Sesuaikan namespacenya dulu yaa.. jangan asal copas :p
3. Pada model user tsb ubah bagian ini, tujuannya adalah agar bisa otentikasi cukup via token

public static function findIdentityByAccessToken($token, $type = null)
{
	//throw new NotSupportedException('"findIdentityByAccessToken" is not implemented.');
	return static::findOne(['auth_key' => $token, 'status' => self::STATUS_ACTIVE]);
}

Tokennya kita pake field auth_key, so nanti kalo praktek silahkan copy field ini sebagai token di URL
4. Modifikasi controller app\controllers\ExampleController, terapkan yii\filters\auth\QueryParamAuth, yaitu class di Yii yang ngurusin masalah otentikasi via token, taruh di behavior.

<?php
namespace app\controllers;
use Yii;
use app\models\Example;
use yii\filters\auth\QueryParamAuth;

class ExampleController extends \yii\rest\Controller
{
    public function behaviors(){
      $behaviors = parent::behaviors();
      $behaviors['authenticator'] = [
        'class' => QueryParamAuth::className(),
      ];
      return $behaviors;
    }

    ...
	// kode disini masih sama dengan sebelumnya
}

5. Selesai
Waktunya testing, coba akses menggunakan URL ini `index.php?r=example/index`, maka hasilnya

rest2

Haha ditolak ya gan.. berarti berhasil nih.. karena unauthorized. padahal sebelumnya bisa, nah gimana caranya untuk mengakses resource tsb? ya dengan menggunakan token lah.. jadi gini URLnya

`index.php?r=example/index&access-token=GANTI TOKEN ANDA`

Token didapat dari mana? ya dari proses login pada artikel sebelumnya.. kan outputnya salah satunya token, atau untuk testing silahkan copy aja dari tabel user field auth_key, maka hasilnya

rest3
Berhasil sempurna gan..

Dan meski tanpa session, kita tetep bisa mengakses data user yang mengakses web service kita menggunakan kode normal yaitu

Yii::$app->user->identity

atau buat test, silahkan ubah ExampleController actionIndex

	public function actionIndex(){

        $examples = Example::find()->all();
        return [
			'user'=>Yii::$app->user->identity,
			'data'=>$examples,
		];
    }

Coba test lagi
Selesai.

Mudah2an manfaat.

Sumber bacaan yang bisa anda implementasikan setelah 3 tutorial saya silahkan lihat ini https://github.com/Ganiks/yii2rest/blob/master/yii2-rest-api-auth-solution.md

2 Comments
  1. safira

Leave a Reply

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