Memahami Otentikasi di GraphQL
![]() |
sumber: quokkalabs.com |
Metode Autentikasi Umum
- 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.
- 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.
- Kunci API: Beberapa sistem menggunakan kunci API untuk autentikasi. Setiap klien diberi kunci unik, yang dikirim bersama dengan permintaan.
- 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
Langkah 2: Tambahkan Middleware Otentikasi
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
- Menerapkan Token yang Aman: token harus ditandatangani dengan aman dan menyertakan waktu kedaluwarsa untuk mencegah penyalahgunaan.
- Menerapkan Kontrol Akses Berbasis Peran (RBAC): Tetapkan peran dan izin untuk membatasi akses ke operasi yang sensitif.
- Mencatat Peristiwa Otentikasi: Simpan catatan untuk semua upaya login dan penggunaan token untuk tujuan audit dan analisis keamanan.
- Pembatasan Nilai: Mencegah serangan brute force dengan membatasi jumlah permintaan per pengguna atau IP.
- 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.