Slim4 Tutorial API: 3 JWT access token

Slim4 Login API and JWT access token

Pada Slim4 tutorial API 3 JWT access token kali ini, akan dibahas bagaimana cara menggunakan Slim4 JWT access token pada login API. Setelah pengguna berhasil melakukan register, selanjutnya pengguna membutuhkan suatu metode untuk mengamankan datanya dari pihak yang tidak berwenang. Login merupakan salah satu metode autentikasi yang digunakan untuk mengamankan dan memberikan akses data yang merupakan milik pengguna. Biasanya login membutuhkan username dan password sebagai salah satu bentuk pengamanan sistem. Pada web/frontend atau mobile apps pengguna biasanya memasukkan username dan password pada sebuah form view yang disediakan. Pada backend server username dan password tersebut dikirimkan melalui sebuah request, request yang dikirimkan bisa dalam format json. Selanjutnya request tersebut akan digunakan untuk metode autentikasi, jika username dan password benar maka sebuah response akan dikirim. Salah satu bentuk metode pertukaran data autentikasi antara frontend atau mobile app dengan backend adalah JSON Web Token (JWT).

JWT access token pada PHP Slim4

Salah satu package JWT access token yang bisa digunakan pada Slim4 adalah firebase/php-jwt. Package ini mendukung fungsi encode dan decode access token. Access token sendiri bisa berisi data seperti waktu dibuat, waktu kadaluarsa, dan informasi mengenai user. Instal firebase/php-jwt dengan menggunakan composer:

composer require firebase/php-jwt

Setting JWT key dan algoritma

Agar firebase/php-jwt bisa melakukan fungsi encode dan decode JWT access token dengan benar, perlu dilakukan setting secret key dan algoritma. Setting ini bertujuan agar data hasil encode berupa data enkripsi bisa dikembalikan (decode) lagi menjadi data yang benar dan sesuai aslinya (plaintext). Tambahkan secret key dan algoritma pada config/settings.php

// other code
'jwt' => [
    'key' => 'secretkey',
    'alg' => 'HS256',
]
// other code

PHP autentikasi login menggunakan JWT access token

Pada login API, sebelum memberikan respon berupa JWT access token hal yang perlu dilakukan adalah validasi request dan pengecekan terhadap user. Validasi yang dilakukan berupa pengecekan apakah email dan password valid atau tidak. Jika validasi valid, selanjutnya akan dilakukan pengecekan terhadap user. Akan dilakukan pengecekan terhadap user yang ada pada database, sistem akan menghasilkan JWT access token jika user ada. Data yang akan disimpan pada JWT access token adalah waktu dibuat, waktu kadaluarsa, waktu bisa digunakan, user id, dan email user.

// other code
use Firebase\JWT\JWT;
// other code
$app->post('/login', function (Request $request, Response $response) use ($settings) {
    $body = $request->getBody();
    $json = json_decode($body, true);
    $validator = new Validator;
    $validator->requirePresence('email', true, 'Email field is required')
        ->notEmptyString('email', 'Email is required')
        ->email('email', false, 'Email must be valid')
        ->requirePresence('password', true, 'Password field is required')
        ->notEmptyString('password', 'Password is required');
    $errors = $validator->validate($json);
    if ($errors) {
        $messages['message'] = 'Login failed';
        foreach($errors as $error) {
            $messages['error'][] = array_values($error);
        }
        $statusCode = 401;
    } else {
        $user = User::where('email', $json['email'])
            ->where('password', sha1($json['password']))
            ->where('status', 1)
            ->first();
        if ($user) {
            $iat = new DateTimeImmutable(); // issued at time
            $exp = $iat->modify('+30 minutes')->getTimestamp(); // expired
            $nbf = $iat->getTimestamp(); // not before
            $payload = [
                'iat' => $iat->getTimestamp(),
                'exp' => $exp,
                'nbf' => $nbf,
                'user_id' => $user->id,
                'email' => $user->email,
            ];
            $message['access_token'] = JWT::encode($payload, $settings['jwt']['key'], $settings['jwt']['alg']);
            $statusCode = 200;
        } else {
            $message['message'] = 'Login failed';
            $statusCode = 401;
        }
    }
    $data = json_encode($message);
    $response->getBody()->write($data);
    return $response
            ->withHeader('Content-Type', 'application-json')
            ->withStatus($statusCode);
});
// other code

Login API dengan Postman:

Slim4 login JWT access token using Postman

Decode JWT access token

Adakalanya sistem membutuhkan beberapa data pendukung untuk bisa melanjutkan prosesnya dengan benar, sebagai contoh user_id bisa digunakan untuk mengetahui pengguna yang terakhir mengubah data atau mungkin untuk bisa digunakan untuk menyimpan barang-barang belanjaan pada keranjang belanja. Salah satu cara efektif yang bisa digunakan adalah mengembalikan data (decode) JWT access token yang dihasilkan dari login API. Untuk bisa menghasilkan data yang valid, setting secret key dan algoritma yang digunakan untuk melakukan enkripsi harus sama dengan dekripsi. Penggunaan fungsi decode sebagai berikut:

use Firebase\JWT\Key;

...
$app->post('/decode', function (Request $request, Response $response) use ($settings) {
    $body = $request->getBody();
    $json = json_decode($body, true);
    $key = new Key($settings['jwt']['key'], $settings['jwt']['alg']);
    $decode = JWT::decode($json['access_token'], $key);
    $response->getBody()->write(json_encode($decode));
    return $response->withHeader('Content-Type', 'application-json');
});
...

Decode JWT access token dengan Postman:

Slim4 decode JWT access token

Code lengkap dapat dilihat melalui Github.

3 thoughts on “Slim4 Tutorial API: 3 JWT access token

  1. Pingback: Slim4 Fashion Store API: 4 Autentikasi dan middleware – PerangkatLunakKu

  2. Pingback: Slim4 Tutorial API: 4 Middleware autentikasi - PerangkatLunakKu

  3. Pingback: Tutorial PHP Backend Slim4 - PerangkatLunakKu

Tinggalkan Balasan