m.techreview.click
  • Website
  • Indonesia
  • Laravel
  • Hosting
  • AI
  • Bisnis
No Result
View All Result
m.techreview.click
  • Website
  • Indonesia
  • Laravel
  • Hosting
  • AI
  • Bisnis
No Result
View All Result
m.techreview.click
No Result
View All Result
Home API

Membuat API RESTful dengan Laravel Passport: Integrasi Aplikasi yang Aman

Elara by Elara
July 3, 2025
in API, Aplikasi, Authentication, Keamanan, Laravel
0
Share on FacebookShare on Twitter

Di era digital yang serba terhubung ini, API (Application Programming Interface) menjadi jembatan penting antara berbagai aplikasi dan sistem. Jika Anda seorang developer yang ingin membangun aplikasi web atau mobile yang kompleks dan terintegrasi, maka membuat API RESTful dengan Laravel Passport adalah langkah cerdas. Laravel Passport menyediakan cara yang elegan dan aman untuk mengautentikasi dan mengotorisasi akses ke API Anda. Dalam artikel ini, kita akan membahas secara mendalam tentang cara membuat API RESTful dengan Laravel Passport, mulai dari persiapan hingga implementasi, dan bagaimana ini memungkinkan integrasi aplikasi yang aman.

1. Mengapa Memilih Laravel Passport untuk Keamanan API RESTful?

Sebelum membahas lebih lanjut tentang cara implementasinya, penting untuk memahami mengapa Laravel Passport menjadi pilihan yang tepat untuk mengamankan API RESTful Anda. Laravel Passport adalah paket OAuth2 yang lengkap, dirancang khusus untuk Laravel. OAuth2 adalah standar industri untuk delegasi akses yang aman. Berikut beberapa keuntungan menggunakan Laravel Passport:

  • Keamanan Terjamin: Passport menyediakan mekanisme autentikasi dan otorisasi yang kuat, melindungi data sensitif dan mencegah akses yang tidak sah.
  • Implementasi Mudah: Laravel Passport menyederhanakan proses implementasi OAuth2, menghilangkan kompleksitas yang biasanya terkait dengan protokol ini.
  • Fleksibilitas Tinggi: Passport mendukung berbagai jenis grant (misalnya, password grant, authorization code grant, client credentials grant) yang dapat disesuaikan dengan kebutuhan aplikasi Anda.
  • Integrasi Mulus dengan Laravel: Passport terintegrasi secara alami dengan framework Laravel, memanfaatkan fitur-fitur bawaan seperti middleware dan authentication guard.
  • Kemudahan Manajemen Token: Passport menyediakan alat yang mudah digunakan untuk mengelola token akses dan refresh token.

Dengan memilih Laravel Passport, Anda tidak hanya mendapatkan keamanan yang lebih baik tetapi juga menghemat waktu dan upaya dalam pengembangan API RESTful yang aman.

2. Persiapan Awal: Konfigurasi Laravel dan Database

Sebelum mulai mengimplementasikan Laravel Passport, ada beberapa langkah persiapan yang perlu dilakukan:

Related Post

Belajar Membuat Fitur Login dan Register di Laravel: Keamanan Aplikasi yang Terjamin

July 8, 2025

Cara Konfigurasi Database di Laravel: Panduan Lengkap untuk Pemula

July 8, 2025

Tutorial Laravel Pemula: Membuat Blog Sederhana dengan Mudah

July 7, 2025

Penggunaan Laravel Sanctum untuk Otentikasi API: Keamanan API yang Lebih Baik

July 4, 2025
  • Instalasi Laravel: Pastikan Anda sudah memiliki instalasi Laravel yang valid. Jika belum, Anda dapat mengunduh dan menginstal Laravel menggunakan Composer:
    composer create-project --prefer-dist laravel/laravel nama-proyek
    cd nama-proyek
  • Konfigurasi Database: Siapkan database yang akan digunakan oleh aplikasi Laravel Anda. Edit file .env untuk mengkonfigurasi koneksi database:
    DB_CONNECTION=mysql
    DB_HOST=127.0.0.1
    DB_PORT=3306
    DB_DATABASE=nama_database
    DB_USERNAME=nama_pengguna
    DB_PASSWORD=kata_sandi
  • Jalankan Migrasi Database: Jalankan perintah migrasi untuk membuat tabel-tabel yang dibutuhkan oleh Laravel, termasuk tabel pengguna:
    php artisan migrate

Pastikan konfigurasi database Anda benar sebelum melanjutkan ke langkah selanjutnya. Kesalahan konfigurasi database dapat menyebabkan masalah selama proses instalasi Passport.

3. Instalasi dan Konfigurasi Laravel Passport: Langkah Demi Langkah

Setelah persiapan awal selesai, mari kita instal dan konfigurasi Laravel Passport:

  • Instalasi Passport melalui Composer:

    composer require laravel/passport
  • Publish Configuration dan Migration:

    php artisan passport:install

    Perintah ini akan membuat tabel-tabel yang dibutuhkan oleh Passport di database Anda, serta menghasilkan kunci enkripsi untuk token OAuth2.

  • Menambahkan Trait HasApiTokens ke Model User: Buka model AppModelsUser dan tambahkan trait HasApiTokens:

    <?php
    
    namespace AppModels;
    
    use IlluminateContractsAuthMustVerifyEmail;
    use IlluminateDatabaseEloquentFactoriesHasFactory;
    use IlluminateFoundationAuthUser as Authenticatable;
    use IlluminateNotificationsNotifiable;
    use LaravelPassportHasApiTokens; // Tambahkan ini
    
    class User extends Authenticatable
    {
        use HasApiTokens, HasFactory, Notifiable;
    
        // ...
    }

    Trait ini menyediakan metode-metode yang dibutuhkan untuk mengelola token API pengguna.

  • Konfigurasi Authentication Guard: Buka file config/auth.php dan tambahkan guard api menggunakan driver passport:

    'guards' => [
        'web' => [
            'driver' => 'session',
            'provider' => 'users',
        ],
    
        'api' => [
            'driver' => 'passport',
            'provider' => 'users',
        ],
    ],
  • Konfigurasi Provider: Pastikan provider users menggunakan model AppModelsUser:

    'providers' => [
        'users' => [
            'driver' => 'eloquent',
            'model' => AppModelsUser::class,
        ],
    ],

Setelah menyelesaikan langkah-langkah ini, Laravel Passport seharusnya sudah terinstal dan terkonfigurasi dengan benar.

4. Membuat Client OAuth2: Memberikan Akses ke Aplikasi Anda

Untuk memungkinkan aplikasi lain (misalnya, aplikasi mobile atau aplikasi web eksternal) mengakses API Anda, Anda perlu membuat “client” OAuth2. Client ini akan mewakili aplikasi yang ingin mengakses API Anda.

  • Membuat Client melalui Artisan Console:
    php artisan passport:client --name="Nama Aplikasi Anda" --redirect_uri="URL Redirect Aplikasi Anda"

    Ganti "Nama Aplikasi Anda" dengan nama aplikasi yang ingin mengakses API Anda, dan ganti "URL Redirect Aplikasi Anda" dengan URL tempat pengguna akan dialihkan setelah otorisasi. Jika aplikasi Anda adalah aplikasi web yang berjalan di localhost, Anda dapat menggunakan http://localhost:8000/callback. Perintah ini akan menghasilkan client_id dan client_secret. Simpan kedua nilai ini dengan aman, karena akan digunakan oleh aplikasi yang ingin mengakses API Anda.

5. Implementasi API RESTful: Membuat Endpoint yang Aman

Sekarang saatnya untuk mengimplementasikan API RESTful Anda. Sebagai contoh, kita akan membuat endpoint untuk mengambil daftar artikel dan membuat artikel baru.

  • Membuat Controller:

    php artisan make:controller ArticleController --resource

    Ini akan membuat controller AppHttpControllersArticleController dengan metode-metode standar untuk operasi CRUD (Create, Read, Update, Delete).

  • Membuat Model dan Migrasi Artikel:

    php artisan make:model Article -m

    Ini akan membuat model AppModelsArticle dan migrasi untuk membuat tabel articles. Edit file migrasi untuk menambahkan kolom-kolom yang dibutuhkan (misalnya, title, content).

  • Mengisi Controller dengan Logika API: Buka AppHttpControllersArticleController dan implementasikan metode-metode API:

    <?php
    
    namespace AppHttpControllers;
    
    use AppModelsArticle;
    use IlluminateHttpRequest;
    
    class ArticleController extends Controller
    {
        /**
         * Display a listing of the resource.
         *
         * @return IlluminateHttpResponse
         */
        public function index()
        {
            $articles = Article::all();
            return response()->json($articles);
        }
    
        /**
         * Store a newly created resource in storage.
         *
         * @param  IlluminateHttpRequest  $request
         * @return IlluminateHttpResponse
         */
        public function store(Request $request)
        {
            $request->validate([
                'title' => 'required',
                'content' => 'required',
            ]);
    
            $article = Article::create($request->all());
    
            return response()->json($article, 201);
        }
    
        /**
         * Display the specified resource.
         *
         * @param  AppModelsArticle  $article
         * @return IlluminateHttpResponse
         */
        public function show(Article $article)
        {
            return response()->json($article);
        }
    
        /**
         * Update the specified resource in storage.
         *
         * @param  IlluminateHttpRequest  $request
         * @param  AppModelsArticle  $article
         * @return IlluminateHttpResponse
         */
        public function update(Request $request, Article $article)
        {
            $article->update($request->all());
            return response()->json($article);
        }
    
        /**
         * Remove the specified resource from storage.
         *
         * @param  AppModelsArticle  $article
         * @return IlluminateHttpResponse
         */
        public function destroy(Article $article)
        {
            $article->delete();
            return response()->json(null, 204);
        }
    }
  • Mendaftarkan Route API: Buka file routes/api.php dan daftarkan route untuk controller artikel:

    <?php
    
    use IlluminateHttpRequest;
    use IlluminateSupportFacadesRoute;
    use AppHttpControllersArticleController;
    
    Route::middleware('auth:api')->get('/user', function (Request $request) {
        return $request->user();
    });
    
    Route::apiResource('articles', ArticleController::class)->middleware('auth:api');

    Perhatikan penggunaan middleware auth:api. Middleware ini akan memastikan bahwa hanya pengguna yang telah terautentikasi melalui Passport yang dapat mengakses endpoint ini.

6. Menguji API RESTful dengan Token Autentikasi

Setelah API RESTful diimplementasikan, saatnya untuk mengujinya. Anda bisa menggunakan tools seperti Postman atau Insomnia untuk mengirim request ke API.

  1. Mendapatkan Access Token: Untuk mengakses API yang dilindungi oleh Passport, Anda perlu mendapatkan access token terlebih dahulu. Ini dilakukan melalui salah satu grant yang didukung Passport (misalnya, password grant atau client credentials grant). Untuk contoh ini, kita asumsikan menggunakan password grant (username dan password).

    • Request URL: http://localhost:8000/oauth/token
    • Method: POST
    • Body (Form Data):
      • grant_type: password
      • client_id: (Client ID yang diperoleh saat membuat client OAuth2)
      • client_secret: (Client Secret yang diperoleh saat membuat client OAuth2)
      • username: (Username pengguna terdaftar)
      • password: (Password pengguna terdaftar)
      • scope: * (atau scope spesifik jika Anda mendefinisikannya)

    Responsenya akan berupa JSON yang mengandung access_token, refresh_token, token_type, dan expires_in.

  2. Menggunakan Access Token: Gunakan access_token yang diperoleh untuk mengakses endpoint API.

    • Mengirim Request: Kirim request ke endpoint API (misalnya, http://localhost:8000/api/articles).
    • Authorization Header: Tambahkan header Authorization dengan nilai Bearer <access_token>. Ganti <access_token> dengan access token yang Anda dapatkan.

Jika autentikasi berhasil, Anda akan menerima respons dari API. Jika tidak, Anda akan menerima pesan error autentikasi.

7. Menggunakan Refresh Token: Memperpanjang Masa Berlaku Access Token

Access token memiliki masa berlaku terbatas. Ketika access token kedaluwarsa, aplikasi harus meminta access token baru. Laravel Passport menyediakan refresh token untuk mempermudah proses ini.

  • Meminta Access Token Baru dengan Refresh Token:
    • Request URL: http://localhost:8000/oauth/token
    • Method: POST
    • Body (Form Data):
      • grant_type: refresh_token
      • refresh_token: (Refresh token yang diperoleh saat mendapatkan access token pertama kali)
      • client_id: (Client ID yang diperoleh saat membuat client OAuth2)
      • client_secret: (Client Secret yang diperoleh saat membuat client OAuth2)
      • scope: * (atau scope spesifik jika Anda mendefinisikannya)

Responsnya akan berupa access token baru dan refresh token baru. Simpan refresh token baru ini untuk digunakan di masa mendatang.

8. Mengamankan Route Tertentu dengan Scopes: Kontrol Akses Lebih Detail

Scopes memungkinkan Anda untuk memberikan kontrol akses yang lebih detail ke API Anda. Anda dapat mendefinisikan scopes yang berbeda untuk berbagai jenis akses, dan kemudian memberikan scopes tertentu ke client OAuth2.

  • Mendefinisikan Scopes: Anda dapat mendefinisikan scopes di file AuthServiceProvider Anda.
  • Memberikan Scopes ke Client: Saat membuat client, Anda dapat menentukan scopes yang diizinkan untuk client tersebut.
  • Melindungi Route dengan Scopes: Anda dapat menggunakan middleware scopes untuk melindungi route tertentu dengan scopes tertentu.

Contoh:

// routes/api.php
Route::get('/articles/premium', [ArticleController::class, 'premium'])->middleware('auth:api', 'scopes:read-premium');

// AuthServiceProvider.php
Passport::tokensCan([
    'read-premium' => 'Read premium articles',
    'create-article' => 'Create new articles',
]);

9. Error Handling dan Validasi: Membuat API yang Robust

Penanganan error dan validasi input sangat penting untuk membuat API yang robust dan mudah digunakan.

  • Validasi Input: Gunakan fitur validasi bawaan Laravel untuk memvalidasi input yang diterima dari client. Anda dapat menggunakan metode validate() pada request untuk memastikan bahwa data yang diterima memenuhi persyaratan yang ditetapkan.
  • Penanganan Error: Gunakan try-catch blocks untuk menangkap exception yang mungkin terjadi selama proses API. Kembalikan respons error yang informatif ke client, termasuk kode status HTTP yang sesuai dan pesan error yang jelas.
  • Respons Error Standar: Konsisten dalam format respons error Anda. Ini akan memudahkan client untuk menginterpretasikan dan menangani error.

10. Dokumentasi API: Memudahkan Penggunaan API

Dokumentasi API yang baik sangat penting untuk memudahkan developer lain menggunakan API Anda.

  • Gunakan Tools Dokumentasi Otomatis: Pertimbangkan untuk menggunakan tools seperti Swagger (OpenAPI) atau Postman Collections untuk menghasilkan dokumentasi API secara otomatis dari kode Anda.
  • Sertakan Contoh Penggunaan: Sertakan contoh penggunaan API dalam berbagai bahasa pemrograman (misalnya, JavaScript, PHP, Python).
  • Jaga Dokumentasi Tetap Terbarui: Pastikan dokumentasi API Anda selalu terbarui dengan perubahan terbaru pada API Anda.

11. Tips Keamanan Tambahan untuk API RESTful Laravel Passport

Selain menggunakan Laravel Passport, ada beberapa tips keamanan tambahan yang dapat Anda terapkan untuk mengamankan API RESTful Anda:

  • Gunakan HTTPS: Selalu gunakan HTTPS untuk mengenkripsi komunikasi antara client dan server.
  • Lindungi Terhadap Serangan CSRF: Laravel menyediakan perlindungan CSRF (Cross-Site Request Forgery) bawaan. Pastikan perlindungan CSRF diaktifkan untuk semua endpoint API Anda.
  • Batasi Request Rate: Gunakan rate limiting untuk membatasi jumlah request yang dapat dilakukan oleh client dalam jangka waktu tertentu. Ini dapat membantu mencegah serangan DDoS (Distributed Denial of Service).
  • Sanitasi Input: Sanitasi semua input yang diterima dari client untuk mencegah serangan injection (misalnya, SQL injection, XSS).
  • Audit Log: Simpan log aktivitas API untuk memantau dan mendeteksi aktivitas yang mencurigakan.

12. Kesimpulan: Membangun Ekosistem Aplikasi yang Terintegrasi dan Aman

Dengan mengikuti panduan ini, Anda seharusnya sudah dapat membuat API RESTful dengan Laravel Passport dan mengamankan integrasi aplikasi Anda. Membuat API RESTful dengan Laravel Passport tidak hanya meningkatkan keamanan tetapi juga mempermudah pengembangan dan pemeliharaan aplikasi Anda. Dengan API yang aman dan terdokumentasi dengan baik, Anda dapat membangun ekosistem aplikasi yang terintegrasi dan memberikan pengalaman yang lebih baik kepada pengguna Anda. Ingatlah untuk selalu memprioritaskan keamanan dan mengikuti praktik terbaik dalam pengembangan API RESTful. Selamat mencoba!

Tags: API AuthenticationAPI DevelopmentAPI SecurityApplication IntegrationLaravelLaravel PassportOAuth2PHPRESTful APISecure API
Elara

Elara

Related Posts

Aplikasi

Belajar Membuat Fitur Login dan Register di Laravel: Keamanan Aplikasi yang Terjamin

by venus
July 8, 2025
Database

Cara Konfigurasi Database di Laravel: Panduan Lengkap untuk Pemula

by Elara
July 8, 2025
Blog

Tutorial Laravel Pemula: Membuat Blog Sederhana dengan Mudah

by Jasper
July 7, 2025
Next Post

Optimasi Query Database pada Laravel: Performa Aplikasi yang Lebih Cepat

Leave a Reply Cancel reply

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

Recommended

Desain Website Modern dan Menarik: Tingkatkan Konversi dengan Visual yang Memukau

April 9, 2025

Lowongan Kerja Web Development Fresh Graduate: Tips Mendapatkan Pekerjaan Impian

June 9, 2025

Tutorial Laravel Dasar untuk Pemula Bahasa Indonesia: Mulai Membangun Aplikasi Web

June 9, 2025

Contoh Penggunaan Middleware di Laravel: Kontrol Akses Aplikasi yang Lebih Baik

July 8, 2025

Belajar Membuat Fitur Login dan Register di Laravel: Keamanan Aplikasi yang Terjamin

July 8, 2025

Cara Konfigurasi Database di Laravel: Panduan Lengkap untuk Pemula

July 8, 2025

Tutorial Laravel Pemula: Membuat Blog Sederhana dengan Mudah

July 7, 2025

m.techreview.click

Our media platform offers reliable news and insightful articles. Stay informed with our comprehensive coverage and in-depth analysis on various topics.
Read more »

Recent Posts

  • Contoh Penggunaan Middleware di Laravel: Kontrol Akses Aplikasi yang Lebih Baik
  • Belajar Membuat Fitur Login dan Register di Laravel: Keamanan Aplikasi yang Terjamin
  • Cara Konfigurasi Database di Laravel: Panduan Lengkap untuk Pemula

Categories

  • 2024
  • Admin
  • Agency
  • AI
  • Akses
  • Aktif
  • Akuntansi
  • Algoritma
  • Analisis
  • Anggaran
  • Antarmuka
  • Antisipasi
  • API
  • Aplikasi
  • Artikel
  • Asynchronous
  • Audio
  • Authentication
  • Authorization
  • Backend
  • Background
  • Backup
  • Bahasa
  • Bandwidth
  • Bantuan
  • Belajar
  • Bergabung
  • Biaya
  • Bisnis
  • Blog
  • Blogger
  • Bootstrap
  • Branding
  • Bukti
  • Cepat
  • Chatbot
  • Cloud
  • Coding
  • Company
  • Contoh
  • cPanel
  • CRM
  • CRUD
  • CSS
  • Custom
  • Dampak
  • Dasar
  • Dashboard
  • Data
  • Database
  • Deployment
  • Desain
  • Design
  • Detail
  • Developer
  • Development
  • Digital
  • Diskusi
  • Dokumentasi
  • Domain
  • Download
  • Dukungan
  • E-commerce
  • Efektif
  • Efisiensi
  • Eloquent
  • Email
  • Engine
  • Enterprise
  • Error
  • Error generating categories
  • Estimasi
  • Etika
  • Event
  • Faktor
  • Fitur
  • Fleksibel
  • Fortify
  • Foto
  • Framework
  • Freelancer
  • Fresh
  • Frontend
  • Fungsi
  • Gambar
  • Garansi
  • Gratis
  • Hacker
  • Harga
  • Hemat
  • Here are 5 categories derived from the article title "Hosting dengan Dukungan Pelanggan 24 Jam: Bantuan Kapanpun Dibutuhkan": Hosting
  • Here are 5 categories derived from the article title "Hosting Domain Murah Indonesia dengan Proteksi DDoS Gratis: Solusi Terbaik untuk Website Anda": Hosting
  • Here are 5 categories derived from the provided list and the article titles: Company
  • Hosting
  • HTML
  • Hybrid
  • Implementasi
  • Indonesia
  • Inovasi
  • Inspirasi
  • Instalasi
  • Integrasi
  • Interaktif
  • Internasional
  • Investasi
  • Jakarta
  • Jasa
  • JavaScript
  • Kantor
  • Kapasitas
  • Karir
  • Karyawan
  • Keamanan
  • Keandalan
  • Kebutuhan
  • Kecepatan
  • Kecil
  • Kehidupan
  • Kemampuan
  • Kemudahan
  • Kerja
  • Kesalahan
  • Kesehatan
  • Keterampilan
  • Keuntungan
  • Keyword
  • Kode
  • Kompetensi
  • Komponen
  • Komunikasi
  • Komunitas
  • Konfigurasi
  • Konsep
  • Konten
  • Konversi
  • Kreativitas
  • Kredibilitas
  • Kualitas
  • Langkah
  • Laravel
  • Latihan
  • Layanan
  • Library
  • Listener
  • Livewire
  • Logika
  • Logo
  • Lokal
  • Loyalitas
  • Machine Learning
  • Mahasiswa
  • Mahir
  • Maintenance
  • Manajemen
  • Manfaat
  • Manufaktur
  • Marketing
  • Masa Depan
  • Masyarakat
  • Medis
  • Memilih
  • Meningkatkan
  • Middleware
  • Migration
  • Mobile
  • Modern
  • Murah
  • MySQL
  • Node.js
  • Observer
  • Online
  • Operasional
  • Optimasi
  • ORM
  • Otentikasi
  • Otomatis
  • Package
  • Panduan
  • Pasar
  • Pekerjaan
  • Pelajaran
  • Pelanggan
  • Pelatihan
  • Peluang
  • Pemahaman
  • Pemanfaatan
  • Pemasaran
  • Pemilihan
  • Pemrograman
  • Pemula
  • Penawaran
  • Pengalaman
  • Pengenalan
  • Pengguna
  • Penggunaan
  • Pengujian
  • Penipuan
  • Penjualan
  • Penulisan
  • Peran
  • Perbandingan
  • Perbedaan
  • Performa
  • Performance
  • Peringkat
  • Pertimbangan
  • Pertumbuhan
  • Perusahaan
  • PHP
  • Pilihan
  • Platform
  • Policy
  • Portofolio
  • Praktik
  • Prediksi
  • Pribadi
  • Process
  • Produktivitas
  • Profesional
  • Profil
  • Profile
  • Project
  • Proyek
  • Python
  • Queue
  • React
  • Real-Time
  • Redis
  • Referensi
  • Rekomendasi
  • Relasi
  • Remote
  • Request
  • Responsive
  • Retail
  • Retensi
  • Review
  • Riset
  • Ritel
  • Roadmap
  • Saham
  • Sanctum
  • Sederhana
  • Seeding
  • SEO
  • Sertifikat
  • Server
  • Sharing
  • Sinkronisasi
  • Sistem
  • Skalabilitas
  • Skill
  • Software
  • Solusi
  • Space
  • SSL
  • Startup
  • Strategi
  • Struktur
  • Studi Kasus
  • Sukses
  • Tanggung Jawab
  • Tantangan
  • Teknis
  • Teknologi
  • Teks
  • Template
  • Tenaga Kerja
  • Terbaik
  • Terjangkau
  • Terjemahan
  • Terlengkap
  • Terpercaya
  • Tim
  • Tips
  • Toko
  • Tools
  • Training
  • Transkripsi
  • Tren
  • Tugas
  • Tutorial
  • Uji Coba
  • UMKM
  • Umum
  • Unlimited
  • Uptime
  • URL
  • User Experience
  • Video
  • Visual
  • VPS
  • Vue.js
  • Wajah
  • Web
  • Web Development
  • Website
  • Windows
  • WordPress
  • XAMPP

Resource

  • About us
  • Contact Us
  • Privacy Policy

© 2024 m.techreview.click.

No Result
View All Result
  • Website
  • Indonesia
  • Laravel
  • Hosting
  • AI
  • Bisnis

© 2024 m.techreview.click.