Blogger Jateng

Menangani Otentikasi di GraphQL

GraphQL telah menjadi pilihan populer untuk membangun API karena fleksibilitas dan efisiensinya dalam mengambil data. Namun, dengan kekuatan yang besar datang tanggung jawab yang besar, dan salah satu area penting untuk setiap API adalah autentikasi. Menangani autentikasi dengan benar di GraphQL memastikan bahwa hanya pengguna yang berwenang yang dapat mengakses data tertentu atau melakukan operasi tertentu. Pada artikel ini, kita akan mengeksplorasi konsep-konsep utama dan praktik terbaik untuk mengimplementasikan autentikasi dalam aplikasi GraphQL.

Memahami Otentikasi di GraphQL

Otentikasi adalah verifikasi identitas pengguna. Dalam GraphQL, ini berarti mencari tahu siapa yang meminta sesuatu dan memvalidasi bahwa identitas mereka valid. Tidak seperti rekan tradisionalnya - REST API - GraphQL bekerja pada satu titik akhir, yang berarti otentikasi tidak terjadi di satu lokasi - otentikasi diperlukan di tingkat yang lebih halus - biasanya, di tingkat penyelesai.

sumber: quokkalabs.com

Metode Autentikasi Umum

  1. JSON Web Tokens (JWT): salah satu mekanisme yang paling umum, sebuah token dibuat ketika pengguna masuk dan disertakan dalam setiap permintaan lebih lanjut, biasanya dalam header Otorisasi. Token ini diverifikasi oleh server untuk autentikasi pengguna.
  2. OAuth: OAuth berguna untuk memiliki akses yang didelegasikan dengan aman, sebuah pendekatan yang umum digunakan untuk integrasi pihak ketiga. Pertama, pengguna mengautentikasi dengan penyedia tepercaya yang token aksesnya digunakan aplikasi untuk mengakses API-nya.
  3. Kunci API: Beberapa sistem menggunakan kunci API untuk autentikasi. Setiap klien diberi kunci unik, yang dikirim bersama dengan permintaan.
  4. Autentikasi Berbasis Sesi: Cookie sesi tradisional juga dapat digunakan, khususnya pada aplikasi yang dirender di server.

Otentikasi yang Diterapkan pada GraphQL

Langkah 1: Amankan Titik Akhir Anda

Amankan Titik Akhir GraphQL Anda - Langkah pertama untuk mengamankan titik akhir GraphQL Anda adalah dengan menggunakan HTTPS yang secara umum diasumsikan dan di luar jangkauan para penyadap; namun, penggunaannya harus diterapkan secara wajib. Data dienkripsi menggunakan HTTPS antara klien dan server.

Langkah 2: Tambahkan Middleware Otentikasi

Sebelum server GraphQL menangani permintaan, logika autentikasi akan didefinisikan dalam middleware. Middleware dapat memvalidasi token atau kredensial dan menambahkan identitas pengguna ke objek konteks dan membuatnya dapat diakses oleh resolver.

Sebagai contoh, dengan menggunakan Node.js dan Express, middleware untuk autentikasi JWT mungkin terlihat seperti ini:

const jwt = require('jsonwebtoken');

const authenticate = (req, res, next) => {
  const token = req.headers.authorization?.split(' ')[1];
  if (!token) {
    return res.status(401).send('Unauthorized');
  }
  try {
    const user = jwt.verify(token, process.env.JWT_SECRET);
    req.user = user;
    next();
  } catch (err) {
    res.status(401).send('Invalid Token');
  }
};

app.use(authenticate);

Langkah 3: Memanfaatkan Objek Konteks

Mereka menggunakan objek konteks sebagai cara untuk meneruskan data yang dibagikan di antara para penyelesai di GraphQL. Setelah mengautentikasi, Anda dapat menyimpan identitas pengguna pada objek konteks. Hal ini memungkinkan resolver untuk membuat keputusan berdasarkan pengguna yang diautentikasi.

const server = new ApolloServer({

  schema,

  context: ({ req }) => {

    return { user: req.user };

  },

});

Langkah 4: Melindungi Penyelesai

Penyelesai adalah tempat logika bisnis berada, dan harus menerapkan kontrol akses (berdasarkan pengguna yang diautentikasi). Dengan kata lain, Anda dapat membatasi beberapa kueri atau mutasi ke peran tertentu: 

const resolvers = {

  Query: {

    userProfile: (parent, args, context) => {

      if (!context.user) {

        throw new AuthenticationError('You must be logged in.');

      }

      return getUserProfile(context.user.id);

    },

  },

};

Langkah 5: Menangani Kesalahan Otentikasi

Kesalahan autentikasi harus ditangani dengan baik untuk memberikan umpan balik yang berarti kepada klien. GraphQL menyediakan kelas AuthenticationError bawaan dalam paket apollo-server: 

const { AuthenticationError } = require('apollo-server');


if (!context.user) {

  throw new AuthenticationError('Authentication required');

}

Otentikasi GraphQL: Praktik Terbaik

  1. Menerapkan Token yang Aman: token harus ditandatangani dengan aman dan menyertakan waktu kedaluwarsa untuk mencegah penyalahgunaan.
  2. Menerapkan Kontrol Akses Berbasis Peran (RBAC): Tetapkan peran dan izin untuk membatasi akses ke operasi yang sensitif.
  3. Mencatat Peristiwa Otentikasi: Simpan catatan untuk semua upaya login dan penggunaan token untuk tujuan audit dan analisis keamanan.
  4. Pembatasan Nilai: Mencegah serangan brute force dengan membatasi jumlah permintaan per pengguna atau IP. 
  5. Perbarui Rahasia Secara Teratur: Putar rahasia dan kunci yang digunakan untuk menandatangani token untuk mengurangi risiko.

Kesimpulan

Menangani autentikasi di GraphQL adalah aspek penting dalam membangun API yang aman dan andal. Dengan mengimplementasikan middleware autentikasi, memanfaatkan objek konteks, dan melindungi resolver, pengembang dapat memastikan bahwa hanya pengguna yang berwenang yang dapat mengakses sumber daya. Mengikuti praktik terbaik seperti menggunakan token aman dan menerapkan RBAC semakin meningkatkan keamanan aplikasi GraphQL Anda. Dengan langkah-langkah ini, Anda dapat membangun API yang fungsional dan aman.