Lupakan kerumitan mengelola database username dan password yang rawan diretas, atau membuat pengguna frustrasi dengan proses registrasi yang panjang. Di dunia pengembangan aplikasi modern, kenyamanan dan keamanan pengguna adalah kunci. Salah satu solusi paling populer dan efektif adalah mengimplementasikan fitur “Login dengan Google” atau Google Sign-In.
Google Login bukan sekadar tombol praktis. Ini adalah gerbang autentikasi yang memanfaatkan infrastruktur keamanan Google yang robust, memberikan pengalaman pengguna yang mulus, sekaligus mengurangi beban Anda sebagai developer dalam mengelola kredensial. Artikel ini akan memandu Anda secara mendalam, dari A sampai Z, tentang cara mengintegrasikan Google Login ke aplikasi web Anda. Kita akan bahas mulai dari setup di Google Cloud Platform, hingga implementasi di sisi backend dan frontend, lengkap dengan pertimbangan keamanan dan masalah umum yang sering dihadapi.
Mari kita mulai dan buat proses autentikasi aplikasi Anda menjadi lebih pintar, aman, dan user-friendly.
Mengapa Google Login Menjadi Pilihan Utama?
Sebelum masuk ke teknis, mari kita pahami mengapa banyak developer memilih Google Login:
- Kemudahan Pengguna: Sebagian besar pengguna internet sudah memiliki akun Google. Mereka tidak perlu membuat akun baru atau mengingat password tambahan, cukup satu klik saja.
- Keamanan yang Superior: Google memiliki tim ahli dan infrastruktur keamanan kelas dunia. Dengan Google Login, Anda ‘meminjam’ keamanan ini, mengurangi risiko data breach yang terkait dengan penyimpanan password.
- Akses Informasi Profil (dengan izin): Anda bisa mendapatkan informasi dasar pengguna seperti nama, email, dan foto profil (dengan persetujuan mereka), yang bisa digunakan untuk mempersonalisasi pengalaman di aplikasi Anda.
- Cepat dan Skalabel: Proses autentikasi sangat cepat. Google Login dirancang untuk menangani jutaan permintaan, sehingga skalabilitas tidak menjadi masalah.
- Mengurangi Beban Developer: Anda tidak perlu mengimplementasikan sistem registrasi, validasi email, atau fitur “lupa password” dari nol. Google yang mengurus semuanya.
Dalam praktiknya, penggunaan Google Login sangat membantu mengurangi angka churn di tahap pendaftaran dan meningkatkan konversi pengguna baru. Namun, tentu saja ada trade-off dan pertimbangan yang perlu Anda pahami.
Memahami Konsep Dasar OAuth 2.0 untuk Google Login
Google Login dibangun di atas standar OAuth 2.0 (Open Authorization). Ini bukan protokol autentikasi langsung, melainkan protokol otorisasi. Artinya, pengguna memberikan izin kepada aplikasi Anda untuk mengakses sebagian informasi mereka di Google, tanpa perlu membagikan password Google mereka ke aplikasi Anda.
Alur sederhananya adalah sebagai berikut:
- Pengguna mengklik tombol “Login dengan Google” di aplikasi Anda.
- Aplikasi Anda mengarahkan pengguna ke halaman login Google.
- Pengguna login ke akun Google mereka (jika belum) dan memberikan persetujuan (consent) kepada aplikasi Anda.
- Google mengembalikan kode otorisasi (authorization code) ke aplikasi Anda (via redirect URI).
- Aplikasi Anda (server-side) menukar kode otorisasi ini dengan token akses (access token) dan token ID (ID token) dari Google.
- Token ID berisi informasi profil pengguna yang sudah diverifikasi oleh Google. Aplikasi Anda kemudian bisa menggunakan informasi ini untuk autentikasi pengguna.
Memahami alur ini penting agar Anda tahu data apa yang Anda terima dan bagaimana cara memvalidasinya.
Langkah 1: Konfigurasi di Google Cloud Platform
Langkah pertama adalah menyiapkan proyek Anda di Google Cloud Platform (GCP) untuk mendapatkan kredensial yang diperlukan.
1.1. Membuat Proyek Baru (atau Pilih yang Sudah Ada)
Kunjungi Google Cloud Console. Jika Anda belum punya proyek, klik “Select a project” di bagian atas, lalu “New Project”. Beri nama proyek Anda, misalnya “Aplikasi Saya Google Login”.
1.2. Mengaktifkan Google People API
Meskipun kita akan menggunakan Google Sign-In, untuk mendapatkan informasi profil pengguna seperti nama dan email, kita memerlukan akses ke Google People API. Dari dashboard proyek Anda:
- Navigasi ke “APIs & Services” > “Library”.
- Cari “Google People API” dan klik.
- Klik tombol “Enable”.
1.3. Mengkonfigurasi Layar Persetujuan OAuth (OAuth Consent Screen)
Ini adalah tampilan yang akan dilihat pengguna saat mereka memberikan izin kepada aplikasi Anda. Penting untuk membuatnya terlihat profesional dan dapat dipercaya.
- Di navigasi kiri, pilih “APIs & Services” > “OAuth Consent Screen”.
- Pilih “User Type”:
- External: Jika aplikasi Anda akan diakses oleh siapa saja (rekomendasi untuk kebanyakan kasus).
- Internal: Jika aplikasi hanya untuk pengguna dalam organisasi Google Workspace Anda.
Klik “Create”.
- Isi informasi aplikasi Anda:
- App name: Nama aplikasi Anda (misal: Tubianto App).
- User support email: Email support untuk pengguna.
- App logo: Opsional, tapi direkomendasikan.
- App domain: Home page, privacy policy, terms of service link (jika ada). Ini penting untuk aplikasi publik.
- Developer contact information: Email developer.
- Klik “Save and Continue”.
1.4. Menambahkan Scope
Scope adalah izin spesifik yang diminta aplikasi Anda dari pengguna. Untuk Google Login, setidaknya kita butuh:
.../auth/userinfo.profile: Untuk mendapatkan nama, foto profil..../auth/userinfo.email: Untuk mendapatkan alamat email.
Di halaman “Scopes”:
- Klik “Add or Remove Scopes”.
- Centang scope
.../auth/userinfo.profiledan.../auth/userinfo.email. - Klik “Update”.
- Klik “Save and Continue”.
1.5. Menambahkan Test User (Jika User Type: External dan status “Testing”)
Jika aplikasi Anda belum “Published” (sedang dalam tahap pengembangan), Anda perlu menambahkan akun Google yang bisa menguji login. Di halaman “Test users”, tambahkan email akun Google Anda sendiri.
1.6. Membuat Kredensial Klien OAuth (Client ID)
Ini adalah langkah krusial untuk mendapatkan Client ID dan Client Secret.
- Di navigasi kiri, pilih “APIs & Services” > “Credentials”.
- Klik “CREATE CREDENTIALS” > “OAuth client ID”.
- Pilih “Application type”: “Web application”.
- Beri nama Client ID Anda (misal: “Web client 1”).
- Untuk Authorized JavaScript origins: Tambahkan URL aplikasi Anda (misal:
http://localhost:3000untuk pengembangan, atauhttps://app.example.comuntuk produksi). Ini adalah domain tempat kode frontend Anda akan berjalan. - Untuk Authorized redirect URIs: Ini adalah endpoint di backend Anda yang akan menerima respons dari Google setelah pengguna berhasil login. Contoh:
http://localhost:3000/auth/google/callbackatauhttps://api.example.com/auth/google/callback. Pastikan ini adalah URL yang benar-benar bisa diakses oleh server Anda. - Klik “Create”.
Anda akan mendapatkan Your Client ID dan Your Client Secret. Catat baik-baik! Client Secret harus disimpan dengan sangat aman dan tidak boleh diekspos di kode frontend.
Langkah 2: Implementasi di Backend (Contoh dengan Node.js dan Express)
Setelah mendapatkan kredensial, saatnya mengimplementasikan logika autentikasi di sisi server. Kita akan menggunakan Node.js dengan framework Express dan library passport beserta strategi passport-google-oauth20 sebagai contoh. Konsepnya bisa diadaptasi ke bahasa dan framework lain seperti Python (Flask/Django), PHP (Laravel), Java (Spring Boot), dll.
2.1. Inisialisasi Proyek dan Instalasi Dependensi
Buat proyek Node.js baru dan instal dependensi:
npm init -y
npm install express passport passport-google-oauth20 dotenv cookie-session
2.2. Struktur Kode Backend (server.js)
Buat file .env untuk menyimpan Client ID dan Client Secret Anda:
GOOGLE_CLIENT_ID=YOUR_CLIENT_ID_FROM_GCP
GOOGLE_CLIENT_SECRET=YOUR_CLIENT_SECRET_FROM_GCP
COOKIE_KEY=some_random_string_for_session_encryption
Kemudian, di file server.js (atau app.js):
require('dotenv').config(); // Load environment variables
const express = require('express');
const passport = require('passport');
const GoogleStrategy = require('passport-google-oauth20').Strategy;
const cookieSession = require('cookie-session');
const app = express();
// Konfigurasi Session
app.use(
cookieSession({
maxAge: 24 * 60 * 60 * 1000, // Durasi session 24 jam
keys: [process.env.COOKIE_KEY] // Kunci enkripsi session
})
);
// Inisialisasi Passport
app.use(passport.initialize());
app.use(passport.session());
// Konfigurasi Passport Google Strategy
passport.use(
new GoogleStrategy(
{
clientID: process.env.GOOGLE_CLIENT_ID,
clientSecret: process.env.GOOGLE_CLIENT_SECRET,
callbackURL: '/auth/google/callback' // Sesuai dengan Authorized redirect URIs di GCP
},
async (accessToken, refreshToken, profile, done) => {
// Ini adalah fungsi yang dipanggil setelah Google mengautentikasi pengguna
// Di sini Anda bisa mencari pengguna di database atau membuatnya jika belum ada
// Contoh sederhana: langsung kembalikan profile
console.log('User profile:', profile);
// Anda bisa menyimpan 'profile.id', 'profile.displayName', 'profile.emails[0].value' ke database Anda
// Lalu panggil done(null, userDariDatabase);
done(null, profile);
}
)
);
// Serialisasi pengguna untuk disimpan di session
passport.serializeUser((user, done) => {
done(null, user.id); // Simpan ID Google pengguna di session
});
// Deserialisasi pengguna saat request berikutnya
passport.deserializeUser((id, done) => {
// Di sini Anda bisa mencari pengguna di database berdasarkan ID
// Lalu panggil done(null, userDariDatabase);
done(null, { id: id, displayName: 'User Example' }); // Contoh sederhana
});
// Rute untuk memulai proses autentikasi Google
app.get(
'/auth/google',
passport.authenticate('google', {
scope: ['profile', 'email'] // Meminta akses ke profil dan email pengguna
})
);
// Rute callback setelah autentikasi Google berhasil
app.get(
'/auth/google/callback',
passport.authenticate('google', { failureRedirect: '/login' }), // Jika gagal, redirect ke halaman login
(req, res) => {
// Jika berhasil, redirect ke dashboard atau halaman sukses
res.redirect('/dashboard');
}
);
// Rute untuk mengecek status login
app.get('/api/current_user', (req, res) => {
res.send(req.user);
});
// Rute untuk logout
app.get('/api/logout', (req, res) => {
req.logout((err) => {
if (err) { return next(err); }
res.redirect('/');
});
});
// Rute sederhana untuk halaman depan
app.get('/', (req, res) => {
res.send('Selamat datang! Silakan Login dengan Google
');
});
// Rute dashboard (hanya bisa diakses jika sudah login)
app.get('/dashboard', (req, res) => {
if (!req.user) {
return res.redirect('/');
}
res.send(`Halo, ${req.user.displayName}! Anda sudah login.
`);
});
const PORT = process.env.PORT || 5000;
app.listen(PORT, () => {
console.log(`Server berjalan di port ${PORT}`);
});
Penjelasan Penting:
dotenv: Untuk memuat variabel lingkungan dari file.env.cookie-session: Digunakan untuk mengelola session pengguna. Kunci enkripsiCOOKIE_KEYharus kuat dan rahasia.passport.use(new GoogleStrategy(...)): Ini adalah inti dari strategi Google. Di sinilah Anda mengkonfigurasi Client ID, Client Secret, dan Callback URL.- Fungsi
(accessToken, refreshToken, profile, done): Ini adalah tempat Anda menerima data pengguna dari Google. Anda HARUS memvalidasi atau membuat entri pengguna di database Anda di sini. passport.serializeUserdandeserializeUser: Penting untuk manajemen session Passport.serializeUsermenentukan data apa dari pengguna yang akan disimpan di session (biasanya ID pengguna dari database Anda).deserializeUserakan mengambil ID tersebut dan mengambil data pengguna lengkap dari database pada setiap request./auth/google: Rute ini memulai proses Google Login./auth/google/callback: Rute ini menerima respons dari Google. Setelah sukses, Passport akan menangani sisanya dan meredirect pengguna ke/dashboard.
Langkah 3: Implementasi di Frontend (Contoh Sederhana HTML/JavaScript)
Sisi frontend cukup sederhana: cukup membuat tombol yang mengarahkan pengguna ke rute autentikasi Google di backend Anda.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Login Aplikasi Saya</title>
<style>
body { font-family: sans-serif; display: flex; justify-content: center; align-items: center; min-height: 100vh; background-color: #f0f2f5; margin: 0; }
.login-container { background-color: white; padding: 40px; border-radius: 8px; box-shadow: 0 4px 10px rgba(0,0,0,0.1); text-align: center; }
.google-btn {
background-color: #4285F4;
color: white;
border: none;
padding: 12px 25px;
font-size: 16px;
border-radius: 5px;
cursor: pointer;
display: inline-flex;
align-items: center;
gap: 10px;
text-decoration: none;
transition: background-color 0.3s ease;
}
.google-btn:hover { background-color: #357ae8; }
.google-btn img { width: 20px; height: 20px; }
</style>
</head>
<body>
<div class="login-container">
<h2>Selamat Datang di Aplikasi Saya</h2>
<p>Silakan login untuk melanjutkan.</p>
<a href="/auth/google" class="google-btn">
<img src="https://upload.wikimedia.org/wikipedia/commons/thumb/c/c1/Google_%22G%22_logo.svg/1200px-Google_%22G%22_logo.svg.png" alt="Google logo">
Login dengan Google
</a>
</div>
</body>
</html>
Anda bisa menempatkan file HTML ini di direktori `public` dan menyajikan dengan Express, atau menggunakan framework frontend modern seperti React, Vue, Angular, di mana Anda hanya perlu membuat sebuah anchor tag atau tombol yang mengarah ke endpoint /auth/google di backend Anda.
Langkah 4: Mengelola Data Pengguna dan Session
Setelah pengguna berhasil login melalui Google, Anda akan menerima objek profile dari Google (atau user object dari database Anda jika sudah diimplementasikan). Data ini biasanya mencakup:
id: ID unik pengguna dari Google.displayName: Nama lengkap pengguna.name.givenName,name.familyName: Nama depan dan belakang.emails[0].value: Alamat email utama.photos[0].value: URL foto profil.
Penting:
- Penyimpanan Database: Di dalam fungsi callback Passport (atau fungsi penukar authorization code), Anda harus:
- Mencari pengguna di database Anda menggunakan ID Google (
profile.id) atau email (profile.emails[0].value). - Jika pengguna tidak ditemukan, buat entri pengguna baru di database Anda dengan informasi yang diterima dari Google.
- Jika ditemukan, update informasi profil jika diperlukan.
- Kembalikan objek pengguna dari database Anda ke
done(null, userDariDatabase).
- Mencari pengguna di database Anda menggunakan ID Google (
- Session Management: Pastikan Anda memiliki mekanisme session yang aman. Dengan
cookie-sessiondan Passport, session ID pengguna dienkripsi dan disimpan di cookie, dan server akan menggunakan ID tersebut untuk mengambil data pengguna dari database pada request berikutnya (melaluideserializeUser).
Pertimbangan Keamanan Penting untuk Google Login
Meskipun Google menangani sebagian besar aspek keamanan, ada beberapa hal yang harus Anda perhatikan sebagai developer:
- Client Secret: JANGAN PERNAH mengekspos Client Secret Anda di kode frontend. Selalu simpan di variabel lingkungan (
.env) dan akses hanya dari sisi server. - HTTPS: Pastikan semua komunikasi antara aplikasi Anda dan Google, serta antara pengguna dan aplikasi Anda, menggunakan HTTPS. Ini sangat krusial untuk mencegah serangan man-in-the-middle.
- Validasi Token ID: Saat menerima ID token dari Google, sebaiknya validasi token tersebut di sisi server Anda untuk memastikan keasliannya dan bahwa itu memang dikeluarkan untuk aplikasi Anda. Library autentikasi seperti Passport biasanya sudah menangani ini.
- Scopes Minimal: Hanya minta scope yang benar-benar Anda butuhkan. Jangan meminta akses ke data yang tidak relevan dengan fungsionalitas aplikasi Anda.
- Authorized Redirect URIs: Pastikan Anda mendaftarkan semua Authorized Redirect URIs yang valid di Google Cloud Console. Ini mencegah penyerang mengarahkan pengguna ke situs palsu.
- Session Security: Gunakan kunci enkripsi session yang kuat dan unik. Pastikan session cookie diatur dengan flag
HttpOnlydanSecure.
Pengalaman dan Pertimbangan Praktis
Dalam pengalaman saya mengimplementasikan Google Login di berbagai project, ada beberapa poin yang sering muncul dan patut jadi pertimbangan:
- Ketergantungan pada Google: Tentu saja, aplikasi Anda akan sangat bergantung pada layanan Google. Jika Google mengalami downtime, pengguna tidak akan bisa login. Oleh karena itu, saya selalu merekomendasikan untuk tetap menyediakan opsi login “tradisional” (email/password) atau opsi login sosial lainnya (misal: Facebook, GitHub) sebagai fallback.
- Pembersihan Data Profil: Google bisa saja mengubah struktur data profil yang dikirim. Pastikan kode Anda robust terhadap perubahan minor atau ketiadaan data tertentu (misalnya, jika pengguna tidak punya foto profil).
- Manajemen Identitas Pengguna: Salah satu tantangan adalah ketika pengguna login dengan Google, lalu mencoba login lagi dengan email/password (jika Anda menyediakan keduanya) menggunakan email yang sama. Anda perlu strategi untuk menyatukan akun-akun ini agar tidak terjadi duplikasi atau kebingungan. Teknik “account linking” adalah jawabannya.
- Pengalaman Pengguna Layar Persetujuan: Desain layar persetujuan OAuth di Google Cloud Console dengan hati-hati. Gunakan logo yang jelas, nama aplikasi yang sesuai, dan link kebijakan privasi yang akurat. Ini membangun kepercayaan pengguna. Saya sering melihat developer melewatkan bagian ini, padahal ini adalah titik kontak pertama pengguna dengan aplikasi Anda melalui Google.
- Debugging yang Membingungkan: Kesalahan seperti “Invalid redirect URI” atau “Mismatch Client ID” bisa sangat membingungkan pada awalnya. Pastikan setiap detail di Google Cloud Console (URI, ID, Secret) sesuai persis dengan konfigurasi di kode Anda. Perbedaan satu huruf saja bisa fatal.
- Biaya: Untuk sebagian besar aplikasi, Google Login tidak menimbulkan biaya langsung kecuali jika Anda melewati batas penggunaan Google People API yang sangat tinggi, yang jarang terjadi untuk startup atau aplikasi skala menengah.
Masalah yang Sering Terjadi
Berikut adalah beberapa masalah umum yang mungkin Anda temui saat mengimplementasikan Google Login, beserta solusinya:
Masalah 1: Error “Invalid Redirect URI”
Gejala: Setelah mengklik tombol login Google, Anda diarahkan ke halaman error Google dengan pesan bahwa Redirect URI tidak valid.
Penyebab: URL yang Anda daftarkan di Google Cloud Console pada bagian “Authorized redirect URIs” tidak sama persis (termasuk http/https, port, dan path) dengan callbackURL yang Anda gunakan di kode backend Anda.
Solusi: Periksa kembali Google Cloud Console -> APIs & Services -> Credentials -> OAuth 2.0 Client IDs -> Web client Anda. Pastikan “Authorized redirect URIs” sesuai persis dengan /auth/google/callback (atau path lain yang Anda gunakan) di server Anda. Misalnya, jika server Anda berjalan di http://localhost:5000 dan callback Anda adalah /auth/google/callback, maka URI yang harus didaftarkan adalah http://localhost:5000/auth/google/callback.
Masalah 2: Error “This app isn’t verified” atau “Google hasn’t verified this app”
Gejala: Pengguna melihat peringatan keamanan dari Google bahwa aplikasi belum diverifikasi.
Penyebab: Aplikasi Anda menggunakan “User Type: External” dan statusnya masih “Testing”. Google memerlukan proses verifikasi untuk aplikasi yang akan diakses publik dan meminta scope sensitif.
Solusi:
- Jika Anda sedang dalam tahap pengembangan, tambahkan semua akun Google yang akan digunakan untuk pengujian sebagai “Test users” di OAuth Consent Screen di Google Cloud Console.
- Jika Anda ingin meluncurkan aplikasi ke publik, Anda harus melewati proses verifikasi Google. Ini melibatkan pengiriman informasi aplikasi Anda, video demo (jika meminta scope sensitif), dan kebijakan privasi. Status aplikasi perlu diubah dari “Testing” menjadi “In Production” setelah verifikasi.
Masalah 3: Client ID atau Client Secret Mismatch
Gejala: Error autentikasi tanpa detail yang jelas, atau permintaan ditolak oleh Google.
Penyebab: Client ID atau Client Secret yang Anda gunakan di kode backend tidak sesuai dengan yang ada di Google Cloud Console.
Solusi: Periksa ulang variabel lingkungan (.env) Anda. Pastikan GOOGLE_CLIENT_ID dan GOOGLE_CLIENT_SECRET disalin dengan benar dari Google Cloud Console, tanpa spasi ekstra atau karakter yang salah. Pastikan juga file .env dimuat dengan benar oleh aplikasi Anda.
Masalah 4: Session Tidak Berfungsi Setelah Login
Gejala: Pengguna berhasil login dengan Google, tapi saat meredirect kembali ke aplikasi, mereka tidak terautentikasi (misalnya, req.user null di Express).
Penyebab: Ada masalah dengan konfigurasi session atau deserialisasi pengguna.
Solusi:
- Pastikan Anda menginisialisasi
cookie-session(atau library session lain) dan Passport dengan benar sebelum rute-rute autentikasi. Urutanapp.use()penting. - Pastikan
passport.serializeUserdanpassport.deserializeUserdiimplementasikan dengan benar.serializeUserharus menyimpan ID unik pengguna, dandeserializeUserharus bisa mengambil pengguna kembali dari ID tersebut. - Pastikan
COOKIE_KEYdi file.envsudah disetel dan cukup acak. - Jika menggunakan reverse proxy (Nginx, Apache), pastikan header
X-Forwarded-Protodisetel kehttpsjika aplikasi Anda diakses melalui HTTPS, dan aplikasi Anda dikonfigurasi untuk mempercayai proxy tersebut (misal:app.set('trust proxy', 1);di Express).
Masalah 5: Gagal Mendapatkan Informasi Profil atau Email
Gejala: Setelah login, objek profile yang diterima dari Google tidak berisi nama atau email.
Penyebab: Scope yang diminta saat autentikasi tidak benar atau tidak diberikan persetujuan oleh pengguna.
Solusi: Pastikan Anda meminta scope 'profile' dan 'email' saat memanggil passport.authenticate('google', { scope: ['profile', 'email'] }). Selain itu, periksa kembali “OAuth Consent Screen” di Google Cloud Console dan pastikan scope tersebut sudah ditambahkan dan disimpan dengan benar.
Kesimpulan
Mengintegrasikan Google Login adalah langkah cerdas untuk setiap aplikasi modern. Ini tidak hanya meningkatkan kenyamanan dan keamanan bagi pengguna, tetapi juga menyederhanakan workflow pengembangan autentikasi Anda. Dengan memahami dasar-dasar OAuth 2.0, melakukan konfigurasi yang tepat di Google Cloud Platform, dan mengimplementasikan logika di backend dan frontend dengan aman, Anda bisa menyediakan pengalaman login yang mulus dan profesional.
Ingat, meskipun Google menangani banyak hal, tanggung jawab untuk menyimpan dan mengelola data pengguna yang Anda terima tetap ada pada Anda. Selalu prioritaskan keamanan, ikuti best practice, dan terus tinjau ulang implementasi Anda seiring berjalannya waktu. Dengan begitu, Anda telah membangun fondasi autentikasi yang kuat untuk aplikasi Anda.
TAGS: Google Login, OAuth 2.0, Web Development, Autentikasi, Developer Tools, Node.js, Express.js, Passport.js, Google Cloud Platform



