Sebagai pengembang, Anda bertanggung jawab untuk melindungi data pengguna Anda melalui autentikasi. Anda dapat menggunakan Passport.js untuk mengautentikasi pengguna dalam aplikasi Node dan Postgres.

Mulailah dengan membuat server Node dengan titik akhir untuk mendaftar, masuk, dan keluar pengguna. Anda dapat membiarkan Paspor menangani otentikasi untuk membatasi akses tidak sah ke aplikasi Anda.

Membuat Tabel Pengguna

Untuk otentikasi pengguna, Anda akan menggunakan email dan kata sandi. Ini berarti tabel pengguna harus berisi bidang email dan kata sandi. Di command prompt psql, buat database baru bernama nodeapp:

MEMBUATDATABASE aplikasi simpul;

Selanjutnya, buat tabel untuk menyimpan pengguna:

MEMBUATMEJApengguna (
id INT GENERATED SELALU SEBAGAI KUNCI UTAMA IDENTITAS,
email CHAR(128),
kata sandi CHAR(60)
);

Kode ini akan membuat tabel baru yang berisi email, kata sandi, dan kolom ID yang dibuat secara otomatis.

Membuat Server Node

Node.js adalah lingkungan runtime JavaScript sisi server yang memungkinkan kita membuat server HTTP dengan cepat. Untuk menyederhanakan proses pembuatan server dan rute HTTP yang berbeda, Anda dapat menggunakan

instagram viewer
Express, kerangka kerja web Node.js.

Jalankan perintah ini untuk membuat folder baru bernama postgres-auth:

mkdir postgres-auth

Selanjutnya, inisialisasi npm:

npm init -y

Terakhir, instal Express:

npm instal ekspres

Sekarang kamu bisa buat server web Node.

Dalam file baru bernama index.js, tambahkan berikut ini:

konstan ekspres = memerlukan("cepat");
konstan aplikasi = ekspres();
app.use (express.json());
app.use (express.urlencoded({ diperpanjang: BENAR }));
aplikasi.mendengarkan(3000, () => menghibur.log("Mendengarkan di port 3000"));

Menjalankan kode ini akan memulai server dan mencatat yang berikut di konsol:

Mendengarkan di port 3000

Menghubungkan ke PostgreSQL

Ke terhubung ke PostgreSQL menggunakan simpul-postgres. node-postgres adalah driver koneksi yang menyediakan antarmuka antara Node dan Postgres.

Jalankan yang berikut ini untuk menginstal node-postrges melalui npm:

npm instal pg

Setelah Anda menginstal perpustakaan itu, buat file baru bernama db.js dan hubungkan ke database:

konstan { Klien } = memerlukan("hal");
konstan { pengguna, host, basis data, kata sandi, port } = memerlukan("./dbConfig");

konstan klien = baru Klien({
pengguna,
tuan rumah,
basis data,
kata sandi,
Pelabuhan,
});

klien.koneksi();
modul.ekspor = klien;

Metode klien dari node-postgres mengambil detail database yang Anda sambungkan. Program ini mengimpor detail koneksinya dari file bernama dbConfig. Oleh karena itu, buat file itu dan tambahkan kode berikut ke dalamnya:

modul.ekspor = {
pengguna: "postgres",
tuan rumah: "host lokal",
basis data: "nodeapp",
kata sandi: "Kata Sandi Anda",
Pelabuhan: 5432,
};

Buat Fungsi Pembantu Basis Data

Itu selalu praktik yang baik untuk menggunakan fungsi individu untuk berinteraksi dengan database. Mereka membuatnya mudah untuk menulis tes unit dan meningkatkan penggunaan kembali. Untuk titik akhir pendaftaran, Anda perlu membuat dua fungsi:

  1. Untuk memeriksa apakah email sudah terdaftar.
  2. Untuk membuat pengguna.

Tujuannya adalah untuk hanya mendaftarkan pengguna jika mereka tidak ada di database.

Buat file baru bernama pembantu.js dan impor klien database dari db.js:

konstan klien = memerlukan("./db.js")

Selanjutnya, tambahkan fungsi baru bernama emailExists():

konstan emailAda = tidak sinkron (email) => {
konstan data = menunggu client.query("PILIH * DARI pengguna WHERE email=$1", [
surel,
]);

jika (data.rowCount == 0) kembaliSalah;
kembali data.baris[0];
};

Fungsi ini mengambil email dan memeriksa apakah sudah digunakan. Ini dilakukan dengan menggunakan klausa SELECT yang mengembalikan baris yang memiliki bidang email yang cocok dengan nilai yang diberikan oleh pengguna yang mendaftar. Jika email tidak ada, itu mengembalikan false.

Untuk membuat fungsi yang membuat pengguna, tambahkan fungsi yang disebut createUser() ke helper.js:

konstan buatPengguna = tidak sinkron (email, kata sandi) => {
konstan garam = menunggu bcrypt.genSalt(10);
konstan hash = menunggu bcrypt.hash (kata sandi, garam);

konstan data = menunggu klien. permintaan(
"MASUKKAN KE pengguna (email, kata sandi) VALUES ($1, $2) MENGEMBALIKAN id, email, kata sandi",
[email, hash]
);

jika (data.rowCount == 0) kembaliSalah;
kembali data.baris[0];
};

Fungsi ini mengambil nilai email dan kata sandi. Ini menggunakan klausa INSERT untuk membuat baris baru dengan detail ini dan jika berhasil mengembalikan pengguna yang baru dibuat. Perhatikan bahwa sebelum menyimpan kata sandi, Anda harus hash menggunakan bcrypt. Menyimpan kata sandi sebagai teks biasa bukanlah ide yang baik. Jika peretas mendapatkan akses ke basis data pengguna Anda, mereka dapat dengan mudah mengakses informasi sensitif.

Instal bcryptjs untuk mulai menggunakannya:

npm instal bcryptjs

Di helper.js, impor bcryptjs:

konstan bcrypt = memerlukan("bcryptjs")

Dengan menggunakan Bcryptjs, database hanya menyimpan kata sandi terenkripsi. Oleh karena itu, selama login, Anda perlu membandingkan kata sandi teks biasa yang diberikan oleh pengguna dan kata sandi hash dalam database. Untuk ini, Anda dapat menggunakan metode perbandingan yang disediakan oleh Bcryptjs.

Buat fungsi yang disebut matchPassword():

konstan pertandinganPassword = tidak sinkron (kata sandi, hashPassword) => {
konstan cocok = menunggu bcrypt.compare (kata sandi, hashPassword);
kembali cocok
};

Ini menerima kata sandi biasa dan hash dan kemudian menggunakan Bcrypt.compare() untuk menentukan apakah kata sandi yang diberikan benar. Jika ya, ia mengembalikan true jika tidak, ia mengembalikan false.

Ini semua adalah fungsi yang akan kita gunakan untuk berinteraksi dengan database. Pastikan untuk mengekspor semuanya di akhir:

modul.ekspor = { emailExists, createUser, matchPassword };

Konfigurasikan Paspor

Passport adalah middleware otentikasi Node yang menyediakan lebih dari 500 strategi otentikasi seperti login sosial, JSON Web Tokens (JWT), dan otentikasi email. Kami akan menggunakan yang terakhir yang disediakan oleh strategi paspor-lokal.

Gunakan perintah berikut untuk menginstal paspor dan paspor-lokal:

npm pasang paspor
npm instal paspor-lokal

Selanjutnya, konfigurasikan Paspor untuk login pengguna yang ada dan mendaftarkan pengguna baru.

Mulailah dengan membuat file baru pasporConfig.js. Kemudian, impor strategi lokal Paspor dan fungsi pembantu database yang baru saja Anda buat:

konstan Strategi Lokal = memerlukan("paspor-lokal");
konstan { emailExists, createUser, matchPassword } = memerlukan("./pembantu");

Dalam file yang sama tambahkan yang berikut ini untuk menyiapkan pendaftaran pengguna:

modul.ekspor = (paspor) => {
paspor. gunakan(
"pendaftaran lokal",
baru Strategi Lokal(
{
usernameField: "email",
passwordField: "kata sandi",
},
tidak sinkron (email, kata sandi, selesai) => {
mencoba {
konstan penggunaAda = menunggu emailAda (email)

jika (penggunaAda) {
kembali selesai(batal, Salah);
}

konstan pengguna = menunggu createUser (email, kata sandi);
kembali selesai(batal, pengguna);
} menangkap (kesalahan) {
selesai (kesalahan);
}
}
)
);
}

Karena passport-local mengharapkan nama pengguna dan kata sandi, dan Anda menggunakan email, setel bidang nama pengguna ke email. Pengguna atau lebih tepatnya bagian frontend dari aplikasi ini akan mengirimkan email dan kata sandi di badan permintaan. Namun, Anda tidak perlu mengekstrak nilainya sendiri karena Passport akan menanganinya di latar belakang.

Program ini pertama-tama memeriksa apakah email sudah diambil menggunakan fungsi emailExists() dari helper.js. Jika email tidak ada di database, itu membuat pengguna baru dengan fungsi createUser(). Akhirnya, ia mengembalikan objek pengguna.

Untuk login pengguna, tambahkan berikut ini ke passportConfig.js:

modul.ekspor = (paspor) => {
paspor. gunakan(
"pendaftaran lokal",
baru Strategi Lokal(
// Daftar
)
);
paspor. gunakan(
"login lokal",
baru Strategi Lokal(
{
usernameField: "email",
passwordField: "kata sandi",
},
tidak sinkron (email, kata sandi, selesai) => {
mencoba {
konstan pengguna = menunggu emailAda (email);
jika (!pengguna) kembali selesai(batal, Salah);
konstan cocok = menunggu matchPassword (password, user.password);
jika (!isMatch) kembali selesai(batal, Salah);
kembali selesai(batal, {Indo: identitas pengguna, surel: pengguna. email});
} menangkap (kesalahan) {
kembali dilakukan (kesalahan, Salah);
}
}
)
);
};

Di sini, program pertama-tama memeriksa apakah email terdaftar. Jika tidak, ia mengembalikan false. Jika menemukan email, itu membandingkan kata sandinya dengan kata sandi dari permintaan. Jika kata sandi cocok, itu akan memasukkan pengguna dan mengembalikan objek pengguna.

Langkah terakhir adalah membuat titik akhir API:

  • POSTING /auth/daftar
  • POST /auth/login

Kedua titik akhir ini akan menerima email dan kata sandi di badan permintaan. Mereka juga akan menyertakan fungsi middleware otentikasi paspor yang baru saja kita konfigurasikan.

Impor dan atur Paspor dalam file baru bernama server.js:

konstan paspor = memerlukan("paspor");
memerlukan("./passportConfig")(paspor);

Kemudian, tambahkan rute berikut:

aplikasi.post(
"/auth/Daftar",
passport.authenticate("pendaftaran lokal", { sidang: Salah }),
(permintaan, res, selanjutnya) => {
res.json({
pengguna: req.user,
});
}
);
aplikasi.post(
"/auth/Gabung",
paspor.authenticate("login-lokal", { sidang: Salah }),
(permintaan, res, selanjutnya) => {
res.json({ pengguna: req.pengguna });
}
);

Kedua rute ini mengembalikan objek JSON yang berisi pengguna jika berhasil.

Periksa API Anda Menggunakan Tes Unit

Anda dapat menggunakan Passport untuk mengautentikasi aplikasi Node menggunakan aplikasi PostgreSQL. Anda membuat titik akhir API untuk mendaftar dan memasukkan pengguna.

Meskipun Anda dapat menggunakan klien REST seperti Postman untuk menguji seberapa baik API bekerja, menulis pengujian unit jauh lebih sederhana. Pengujian unit memungkinkan Anda menguji bagian individual dari aplikasi Anda. Dengan cara ini, bahkan jika titik akhir gagal, Anda dapat menentukan titik kegagalan yang tepat. Salah satu alat yang dapat Anda gunakan untuk menguji aplikasi Node adalah Jest.