Jika Anda ingin melindungi konten sensitif di aplikasi Node Anda, Anda memerlukan cara untuk mengautentikasi pengguna. Namun, membangun sistem otentikasi Anda sendiri itu rumit, dan memakan waktu dan jika tidak dilakukan dengan benar dapat menimbulkan kerentanan keamanan dalam aplikasi Anda. Alat pihak ketiga seperti Paspor membuat otentikasi lebih mudah.

Dalam tutorial ini, Anda akan belajar bagaimana menerapkan otentikasi di Node menggunakan Passport dan MongoDB.

Apa itu Otentikasi dan Otorisasi?

Meskipun otentikasi dan otorisasi terkadang digunakan secara bergantian, kedua konsep keamanan ini memiliki arti yang berbeda. Otentikasi adalah proses memverifikasi pengguna yang mereka klaim sementara otorisasi adalah proses menentukan apakah pengguna yang diautentikasi memiliki akses ke bagian tertentu dari aplikasi Anda.

Apa itu Passport.js?

paspor.js (atau Paspor) adalah middleware otentikasi untuk NodeJS yang menyediakan lebih dari 500 strategi untuk mengautentikasi pengguna termasuk paspor-lokal yang menggunakan username dan password.

Tutorial ini menggunakan paspor-lokal dan paspor-jwt untuk mengamankan rute.

Cara Mengatur Otentikasi Pengguna di NodeJS

Sekarang Anda tahu sedikit tentang otentikasi pengguna dan Passport.js, kita dapat melihat cara mengatur otentikasi di NodeJS. Di bawah ini, kami telah menguraikan langkah-langkah yang perlu Anda ambil.

Langkah 1: Siapkan Server Node

Buat folder bernama pengguna-auth-nodejs dan arahkan ke sana menggunakan terminal Anda.

mkdir pengguna-auth-nodejs. 

cd user-auth-nodejs

Inisialisasi selanjutnya paket.json.

npm init

Karena Anda akan menggunakan cepat, kerangka kerja backend NodeJS, instal dengan menjalankan perintah berikut.

npm saya ungkapkan

Sekarang buat file, app.js, dan tambahkan kode berikut untuk membuat server.

const ekspres = membutuhkan("ekspres");
aplikasi const = ekspres();
const PORT = 3000;
app.listen (PORT, () => {
console.log(`Mendengarkan pada port ${PORT}`);
});

Terkait: Pelajari Cara Menginstal Npm dan Node.js di Ubuntu

Langkah 2: Siapkan Basis Data

Anda memerlukan database untuk menyimpan data pengguna. Anda akan menggunakan luwak untuk membuat skema data MongoDB yang mendefinisikan struktur dan jenis data yang akan Anda simpan dalam database. Karena Anda menyimpan data pengguna, buat skema pengguna.

Instal luwak.

npm aku luwak

Buat file baru, penggunaModel.js, dan tambahkan yang berikut ini.

const luwak = membutuhkan('luwak')
const {Skema} = luwak
const UserSchema = Skema baru ({
surel: {
jenis: Tali,
diperlukan: benar
},
kata sandi: {
jenis: Tali,
diperlukan: benar
}
})
const UserModel = luwak.model('pengguna', UserSchema);
module.exports = UserModel;

Terkait: Cara Membuat Database dan Koleksi di MongoDB

Sebelum menyimpan kata sandi, Anda perlu mengenkripsinya untuk tujuan keamanan. Anda akan menggunakan bcryptjs, paket npm yang sangat berguna yang membuat bekerja dengan kata sandi terenkripsi menjadi mudah.

Install bcryptjs.

npm saya bcryptjs

Memodifikasi usermodel.js untuk mengenkripsi kata sandi sebelum menyimpannya ke database.

const luwak = membutuhkan('luwak')
const bcrypt = membutuhkan('bcryptjs');
const {Skema} = luwak

const UserSchema = Skema baru ({
...
})
UserSchema.pre('simpan', fungsi asinkron (berikutnya) {
mencoba {
// periksa metode pendaftaran
const pengguna = ini;
if (!user.isModified('password')) next();
// menghasilkan garam
const salt = menunggu bcrypt.genSalt (10);
// hash kata sandi
const hashedPassword = menunggu bcrypt.hash (this.password, salt);
// ganti kata sandi teks biasa dengan kata sandi hash
this.password = hashedPassword;
Berikutnya();
} tangkap (kesalahan) {
kembali berikutnya (kesalahan);
}
});
...
const Pengguna = luwak.model('Pengguna', SkemaPengguna);

Di sini Anda menggunakan pra simpan kait untuk mengubah kata sandi sebelum disimpan. Idenya adalah untuk menyimpan versi hash kata sandi alih-alih kata sandi teks biasa. Hash adalah string kompleks panjang yang dihasilkan dari string teks biasa.

Menggunakan dimodifikasi untuk memeriksa apakah kata sandi berubah karena Anda hanya perlu hash kata sandi baru. Selanjutnya, buat garam dan berikan dengan kata sandi teks biasa ke metode hash untuk menghasilkan kata sandi hash. Terakhir, ganti kata sandi teks biasa dengan kata sandi hash di database.

Buat db.js dan konfigurasikan database.

const luwak = membutuhkan("luwak");
luwak. Janji = global. Janji;
const dbUrl = "mongodb://localhost/pengguna";
const terhubung = asinkron () => {
mongoose.connect (dbUrl, { useNewUrlParser: true, useUnifiedTopology: true });
const db = luwak.koneksi;
db.on("kesalahan", () => {
console.log("tidak dapat terhubung");
});
db.once("buka", () => {
console.log(">Berhasil terhubung ke database");
});
};
module.exports = { sambungkan };

Di app.js, sambungkan ke database.

// sambungkan ke db
const db = membutuhkan('./db');
db.koneksi();

Langkah 3: Siapkan Paspor

Install Paspor dan paspor-lokal. Anda akan menggunakan paket-paket ini untuk mendaftar dan login pengguna.

npm saya paspor
npm saya paspor-lokal

Buat file baru, pasporConfig.js, dan impor paspor-lokal dan penggunaModel.js.

const LocalStrategy = memerlukan("paspor-lokal").Strategi;
const Pengguna = membutuhkan("./userModel");

Konfigurasikan Paspor untuk menangani pendaftaran pengguna.

const LocalStrategy = membutuhkan("paspor-lokal");
const Pengguna = membutuhkan("./userModel");
module.exports = (paspor) => {
paspor. gunakan(
"pendaftaran lokal",
Strategi Lokal baru (
{
usernameField: "email",
passwordField: "kata sandi",
},
async (email, kata sandi, selesai) => {
mencoba {
// periksa apakah pengguna ada
const userExists = menunggu User.findOne({ "email": email });
jika (penggunaAda) {
kembali selesai (null, false)
}
// Buat pengguna baru dengan data pengguna yang disediakan
const user = menunggu User.create({ email, password });
kembali selesai (null, pengguna);
} tangkap (kesalahan) {
selesai (kesalahan);
}
}
)
);
}

Pada kode di atas, Anda memeriksa apakah email sudah digunakan. Jika email tidak ada, daftarkan pengguna. Perhatikan bahwa Anda juga menyetel bidang nama pengguna untuk menerima email. Secara default, paspor-lokal mengharapkan nama pengguna, jadi Anda harus memberi tahu bahwa Anda hanya mengirimkan email.

Menggunakan paspor-lokal untuk juga menangani login pengguna.

module.exports = (paspor) => {
paspor. gunakan(
"pendaftaran lokal",
strategi lokal baru (
...
)
);
paspor. gunakan(
"login lokal",
Strategi Lokal baru (
{
usernameField: "email",
passwordField: "kata sandi",
},
async (email, kata sandi, selesai) => {
mencoba {
const pengguna = menunggu User.findOne({ email: email });
if (!user) kembali selesai (null, false);
const isMatch = menunggu user.matchPassword (kata sandi);
jika (! cocok)
pengembalian selesai (null, false);
// jika kata sandi cocok dengan pengguna kembali
kembali selesai (null, pengguna);
} tangkap (kesalahan) {
console.log (kesalahan)
pengembalian selesai (kesalahan, salah);
}
}
)
);
};

Di sini, periksa apakah pengguna ada di database, dan jika ada, periksa apakah kata sandi yang diberikan cocok dengan yang ada di database. Perhatikan Anda juga memanggil pertandinganPassword() metode pada model pengguna jadi pergi ke penggunaModel.js file dan menambahkannya.

UserSchema.methods.matchPassword = fungsi asinkron (kata sandi) {
mencoba {
return menunggu bcrypt.compare (password, this.password);
} tangkap (kesalahan) {
melempar Kesalahan baru (kesalahan);
}
};

Metode ini membandingkan kata sandi dari pengguna dan yang ada di database dan mengembalikan true jika cocok.

Langkah 4: Atur Rute Otentikasi

Anda sekarang perlu membuat titik akhir tempat pengguna akan mengirim data. Pertama adalah rute pendaftaran yang akan menerima email dan kata sandi pengguna baru.

Di dalam app.js, gunakan middleware autentikasi paspor yang baru saja Anda buat untuk mendaftarkan pengguna.

aplikasi.post(
 "/auth/daftar",
passport.authenticate('local-signup', { sesi: false }),
(permintaan, res, selanjutnya) => {
// Daftar
res.json({
pengguna: req.pengguna,
});
}
);

Terkait: Otentikasi vs. Otorisasi: Apa Bedanya?

Jika berhasil, rute pendaftaran harus mengembalikan pengguna yang dibuat.

Selanjutnya, buat rute login.

aplikasi.post(
"/auth/login",
passport.authenticate('local-login', { sesi: false }),
(permintaan, res, selanjutnya) => {
// Gabung
res.json({
pengguna: req.pengguna,
});
}
);

Langkah 5: Tambahkan Rute yang Dilindungi

Sejauh ini, Anda telah menggunakan Paspor untuk membuat middleware yang mendaftarkan pengguna dalam database dan perangkat lain yang memungkinkan pengguna terdaftar untuk masuk. Selanjutnya, Anda akan membuat middleware otorisasi untuk melindungi rute sensitif menggunakan token web JSON (JWT). Untuk menerapkan otorisasi JWT, Anda perlu:

  • Hasilkan token JWT.
  • Berikan token kepada pengguna. Pengguna akan mengirimkannya kembali dalam permintaan otorisasi.
  • Verifikasi token yang dikirim kembali oleh pengguna.

Anda akan menggunakan jsonwebtoken paket untuk menangani JWT.

Jalankan perintah berikut untuk menginstalnya.

npm saya jsonwebtoken

Selanjutnya, buat token untuk setiap pengguna yang berhasil login.

Di dalam app.js, impor jsonwebtoken dan ubah rute login seperti di bawah ini.

aplikasi.post(
"/auth/login",
passport.authenticate('local-login', { sesi: false }),
(permintaan, res, selanjutnya) => {
// Gabung
jwt.sign({user: req.user}, 'secretKey', {expiresIn: '1h'}, (err, token) => {
jika (salah) {
kembali res.json({
pesan: "Gagal login",
tanda: nol,
});
}
res.json({
token
});
})
}
);

Dalam aplikasi kehidupan nyata, Anda akan menggunakan kunci rahasia yang lebih rumit dan menyimpannya dalam file konfigurasi.

Rute login mengembalikan token jika berhasil.

Menggunakan paspor-jwt untuk mengakses rute yang dilindungi.

npm saya paspor-jwt

Di dalam pasporConfig.js, konfigurasikan paspor-jwt.

const JwtStrategy = membutuhkan("passport-jwt").Strategy;
const { EkstrakJwt } = membutuhkan("paspor-jwt")
module.exports = (paspor) => {
paspor. gunakan(
"login lokal",
Strategi Lokal baru (
...
);
paspor. gunakan(
Strategi Jwt baru (
{
jwtFromRequest: ExtractJwt.fromHeader("otorisasi"),
secretOrKey: "kunci rahasia",
},
async (jwtPayload, selesai) => {
mencoba {
// Ekstrak pengguna
const pengguna = jwtPayload.user;
selesai (null, pengguna);
} tangkap (kesalahan) {
selesai (kesalahan, salah);
}
}
)
);
};

Perhatikan bahwa Anda mengekstrak JWT dari header otorisasi alih-alih badan permintaan. Ini mencegah peretas mencegat permintaan dan mengambil token.

Untuk melihat caranya paspor-jwt menjaga rute, membuat rute yang dilindungi di aplikasi.js.

aplikasi.get(
"/ pengguna/dilindungi",
passport.authenticate("jwt", { sesi: false }),
(permintaan, res, selanjutnya) => {
res.json({pengguna: req.pengguna});
}
);

Hanya permintaan dengan JWT yang valid yang mengembalikan data pengguna.

Sekarang Anda Siap Membawa Otentikasi Pengguna Anda ke Tingkat Selanjutnya

Dalam tutorial ini, Anda mempelajari bagaimana Anda dapat mengautentikasi pengguna menggunakan email dan kata sandi dengan bantuan Paspor. Ini mungkin tampak menakutkan pada awalnya, tetapi prosesnya relatif mudah. Anda dapat melangkah lebih jauh dan menggunakan penyedia identitas pihak ketiga yang didukung oleh Passport seperti Twitter, Facebook, dan Google.

Apa itu Otentikasi Pengguna dan Bagaimana Cara Kerjanya?

Penting untuk memahami dasar-dasar otentikasi pengguna untuk memastikan tingkat keamanan maksimum untuk akun online Anda. Jadi, mari selami.

Baca Selanjutnya

MembagikanMenciakSurel
Topik-topik terkait
  • Pemrograman
  • Pemrograman
  • Bahasa pemrograman
  • Alat Pemrograman
Tentang Penulis
Mary Gathoni (8 Artikel Diterbitkan)

Mary Gathoni adalah pengembang perangkat lunak dengan hasrat untuk membuat konten teknis yang tidak hanya informatif tetapi juga menarik. Ketika dia tidak coding atau menulis, dia senang bergaul dengan teman-teman dan berada di luar ruangan.

More From Mary Gathoni

Berlangganan newsletter kami

Bergabunglah dengan buletin kami untuk kiat teknologi, ulasan, ebook gratis, dan penawaran eksklusif!

Klik di sini untuk berlangganan