Slim4 Tutorial API: 4 Middleware autentikasi

Slim4 autentikasi pada middleware

Pada Slim4 Tutorial API middleware autentikasi akan dibahas bagaimana melakukan pengecekan identitas berdasarkan JWT access token. Metode ini merupakan salah satu proses untuk membuktikan diri atau identitas. Hal ini bertujuan memberikan akses sesuai dengan hak pengguna. Salah satu metode autentikasi adalah JWT access token pada login API. Data yang bersifat umum/public tidak diperlukan autentikasi, akan tetapi untuk mengakses data bersifat pribadi maka perlu dilakukan autentikasi untuk mencegah orang yang tidak berhak mengakses data tersebut.

Slim4 Autentikasi pada Middleware

Middleware setiap framework memiliki cara kerja dan proses yang berbeda-beda. Pada Slim4, proses dilakukan dengan melakukan manipulasi antara request yang masuk dan response yang keluar. Singkatnya, bisa digunakan sebelum atau sesudah memanggil route. Berdasarkan dokumentasi, ada beberapa cara yang bisa dilakukan dalam menerapkan middleware yaitu pada level aplikasi, group, dan route.

// Add Middleware On App
$app->add(new ExampleMiddleware());

// Add Middleware On Group
$app->group('/', function () { ... })->add(new ExampleMiddleware());

// Add Middleware On Route
$app->get('/', function () { ... })->add(new ExampleMiddleware());

JWT access token sebagai authorization header

JWT access token yang dihasilkan dari login API akan digunakan sebagai salah satu media autentikasi. Proses ini akan digunapan pada authorization bearer token (authorization header) saat mengirimkan request. Selanjutnya, frontend atau mobile apps akan menggunakan metode ini sebagai media autentikasi. Sebelum proses autentikasi dimulai, terlebih dahulu tambahkan kode pada public/.htaccess untuk membaca authorization header.


...
RewriteRule .* - [env=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

Selanjutnya pada file public/index.php buat fungsi untuk middleware:

...
use Psr\Http\Server\RequestHandlerInterface as RequestHandler;
...
$authMiddleware = function (Request $request, RequestHandler $handler) use ($settings) {
    try {
        $message = [];
        if ($request->hasHeader('Authorization')) {
            $header = $request->getHeader('Authorization');
            if (!empty($header)) {
                $bearer = trim($header[0]);
                preg_match('/Bearer\s(\S+)/', $bearer, $matches);
                $token = $matches[1];
                $key = Key($settings['jwt']['key'], $settings['jwt']['alg']);
                $data = JWT::decode($token, $key);
                $dateTime = new DateTimeImmutable();
                $now = $dateTime->getTimestamp();

                if ($now > $data->nbf && $now < $data->exp) {
                    $request = $request->withAttribute('user_id', $data->user_id);
                    $request = $request->withAttribute('email', $data->email);
                } else {
                    $message['message'] = 'Token expired';
                }
            }
        } else {
            $message['message'] = 'Unauthorized access';
            $response = new \Slim\Psr7\Response();
            $response->getBody()->write(json_encode($message));
            return $response->withHeader('Content-Type', 'application-json')
                ->withStatus(401);
        }
    } catch (\Exception $e) {
        $message['message'] = $e->getMessage();
        $response = new \Slim\Psr7\Response();
        $response->getBody()->write(json_encode($message));
        return $response->withHeader('Content-Type', 'application-json')
            ->withStatus(401);
    }

    $response = $handler->handle($request);
    return $response;
};
...

Autentikasi middleware pada route

Autentikasi middleware pada Slim4 dapat digunakan pada route. Caranya yaitu dengan menambahkan ->add($authMiddleware) sesuai dengan contoh yang sudah diberikan di atas. Buat sebuah route dengan endpoint /identity. Route ini akan digunakan untuk menampilkan identitas dari user yang sudah melakukan login.

...
$app->get('/identity', function (Request $request, Response $response) {
    $user = User::where('id', $request->getAttribute('user_id'))
        ->where('email', $request->getAttribute('user_email'))
        ->first();
    $response->getBody()->write(json_encode($user));
    return $response->withHeader('Content-Type', 'application/json')
        ->withStatus(200);
})->add($authMiddleware);
...

Ketika mengakses route localhost/fashion-store-slim4/public/identity tanpa authorization bearer token maka sistem akan menolak dan memunculkan pesan Unauthorized access

Slim4 autentikasi middleware unauthorized access

Tambahkan access token yang didapat dari login API pada authorization bearer token. Penggunaan authorization pada Postman sebagai berikut:

Slim4 autentikasi middleware user identity API

Code lengkap dapat dilihat melalui Github.

3 thoughts on “Slim4 Tutorial API: 4 Middleware autentikasi

  1. Pingback: Slim4 Fashion Store API: 5 Order API Menggunakan Database Transaction – PerangkatLunakKu

  2. Pingback: Slim4 Tutorial API: 5 Database Transaction - PerangkatLunakKu

  3. Pingback: Tutorial PHP Backend Slim4 - PerangkatLunakKu

Tinggalkan Balasan