/ / Cách thiết lập xác thực hộ chiếu trong ứng dụng Node và Postgres

Cách thiết lập xác thực hộ chiếu trong ứng dụng Node và Postgres

pexels george becker 333837

Là nhà phát triển, bạn có trách nhiệm bảo vệ dữ liệu của người dùng thông qua xác thực. Bạn có thể sử dụng Passport.js để xác thực người dùng trong ứng dụng Node và Postgres.

Bắt đầu bằng cách tạo một máy chủ Node với các điểm cuối để đăng ký, đăng nhập và đăng xuất người dùng. Bạn có thể cho phép Passport xử lý xác thực để hạn chế quyền truy cập trái phép vào ứng dụng của bạn.

Tạo bảng người dùng

Để xác thực người dùng, bạn sẽ sử dụng email và mật khẩu. Điều này có nghĩa là bảng người dùng phải chứa trường email và mật khẩu. Trong dấu nhắc lệnh psql, hãy tạo một cơ sở dữ liệu mới có tên là gật đầu:

LÀM VIDEO TRONG NGÀY
CREATE DATABASE nodeapp;

Tiếp theo, tạo một bảng để lưu trữ người dùng:

CREATE TABLE users (
id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
email CHAR(128),
password CHAR(60)
);

Mã này sẽ tạo một bảng mới chứa email, mật khẩu và trường ID được tạo tự động.

Tạo máy chủ nút

Node.js là một môi trường thời gian chạy JavaScript phía máy chủ cho phép chúng tôi tạo các máy chủ HTTP một cách nhanh chóng. Để đơn giản hóa quá trình tạo máy chủ và các tuyến HTTP khác nhau, bạn có thể sử dụng Express, một khung công tác web Node.js.

Chạy lệnh này để tạo một thư mục mới có tên là postgres-auth:

mkdir postgres-auth

Tiếp theo, khởi tạo npm:

npm init -y

Cuối cùng, cài đặt Express:

npm install express

Bây giờ bạn có thể tạo máy chủ web Node.

Trong một tệp mới có tên index.jsthêm những điều sau:

const express = require("express");
const app = express();
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
app.listen(3000, () => console.log("Listening on port 3000"));

Chạy mã này sẽ khởi động máy chủ và đăng nhập thông tin sau vào bảng điều khiển:

Listening on port 3000

Kết nối với PostgreSQL

Để kết nối với PostgreSQL, hãy sử dụng nút-postgres. node-postgres là một trình điều khiển kết nối cung cấp giao diện giữa Node và Postgres.

Thực hiện các bước sau để cài đặt node-postrges qua npm:

npm install pg

Khi bạn đã cài đặt thư viện đó, hãy tạo một tệp mới có tên db.js và kết nối nó với cơ sở dữ liệu:

const { Client } = require("pg");
const { user, host, database, password, port } = require("./dbConfig");

const client = new Client({
user,
host,
database,
password,
port,
});

client.connect();
module.exports = client;

Phương thức máy khách từ node-postgres lấy thông tin chi tiết của cơ sở dữ liệu mà bạn đang kết nối. Chương trình này nhập chi tiết kết nối của nó từ một tệp có tên dbConfig. Do đó, hãy tạo tệp đó và thêm mã sau vào tệp:

module.exports = {
user: "postgres",
host: "localhost",
database: "nodeapp",
password: "yourPassword",
port: 5432,
};

Tạo các chức năng của trình trợ giúp cơ sở dữ liệu

Bạn nên sử dụng các hàm riêng lẻ để tương tác với cơ sở dữ liệu. Chúng giúp bạn dễ dàng viết các bài kiểm tra đơn vị và cải thiện khả năng tái sử dụng. Đối với điểm cuối đăng ký, bạn cần tạo hai chức năng:

  1. Để kiểm tra xem email đã được đăng ký chưa.
  2. Để tạo người dùng.

Mục đích là chỉ đăng ký một người dùng nếu họ không tồn tại trong cơ sở dữ liệu.

Tạo một tệp mới có tên helper.js và nhập máy khách cơ sở dữ liệu từ db.js:

const client = require("./db.js")

Tiếp theo, thêm một hàm mới có tên emailExists ():

const emailExists = async (email) => {
const data = await client.query("SELECT * FROM users WHERE email=$1", [
email,
]);

if (data.rowCount == 0) return false;
return data.rows[0];
};

Chức năng này nhận một email và kiểm tra xem nó đã được sử dụng chưa. Nó thực hiện điều này bằng cách sử dụng mệnh đề SELECT trả về một hàng có trường email khớp với giá trị được cung cấp bởi người dùng đăng ký. Nếu email không tồn tại, nó sẽ trả về false.

Để tạo một hàm tạo người dùng, hãy thêm một hàm có tên createUser () vào helper.js:

const createUser = async (email, password) => {
const salt = await bcrypt.genSalt(10);
const hash = await bcrypt.hash(password, salt);

const data = await client.query(
"INSERT INTO users(email, password) VALUES ($1, $2) RETURNING id, email, password",
[email, hash]
);

if (data.rowCount == 0) return false;
return data.rows[0];
};

Chức năng này nhận các giá trị email và mật khẩu. Nó sử dụng mệnh đề INSERT để tạo một hàng mới với những chi tiết này và nếu thành công sẽ trả về người dùng mới được tạo. Lưu ý rằng trước khi lưu trữ mật khẩu, bạn nên băm mật khẩu bằng bcrypt. Lưu trữ mật khẩu dưới dạng văn bản thuần túy không bao giờ là một ý tưởng hay. Nếu tin tặc có quyền truy cập vào cơ sở dữ liệu người dùng của bạn, chúng có thể dễ dàng truy cập thông tin nhạy cảm.

Cài đặt bcryptjs để bắt đầu sử dụng nó:

npm install bcryptjs

Trong helper.js, nhập bcryptjs:

const bcrypt = require("bcryptjs")

Bằng cách sử dụng Bcryptjs, cơ sở dữ liệu chỉ lưu trữ mật khẩu được mã hóa. Do đó, trong quá trình đăng nhập, bạn sẽ cần phải so sánh mật khẩu văn bản thuần túy do người dùng cung cấp và mật khẩu được băm trong cơ sở dữ liệu. Đối với điều này, bạn có thể sử dụng phương pháp so sánh được cung cấp bởi Bcryptjs.

Tạo một hàm có tên matchPassword ():

const matchPassword = async (password, hashPassword) => {
const match = await bcrypt.compare(password, hashPassword);
return match
};

Nó nhận mật khẩu đơn giản và mã băm, sau đó sử dụng Bcrypt.compare () để xác định xem mật khẩu được cung cấp có đúng không. Nếu đúng, nó trả về true, ngược lại, nó trả về false.

Đây là tất cả các chức năng chúng tôi sẽ sử dụng để tương tác với cơ sở dữ liệu. Đảm bảo xuất tất cả chúng ở cuối:


module.exports = { emailExists, createUser, matchPassword };

Định cấu hình hộ chiếu

Passport là một phần mềm trung gian xác thực Node cung cấp hơn 500 chiến lược xác thực như đăng nhập xã hội, Mã thông báo web JSON (JWT) và xác thực email. Chúng tôi sẽ sử dụng cái sau mà chiến lược hộ chiếu-địa phương cung cấp.

Sử dụng lệnh sau để cài đặt passport và passport-local:

npm install passport
npm install passport-local

Tiếp theo, cấu hình Passport để đăng nhập người dùng hiện có và đăng ký người dùng mới.

Bắt đầu bằng cách tạo một tệp mới passportConfig.js. Sau đó, nhập chiến lược cục bộ Passport và các chức năng của trình trợ giúp cơ sở dữ liệu mà bạn vừa tạo:

const LocalStrategy = require("passport-local");
const { emailExists, createUser, matchPassword } = require("./helper");

Trong cùng một tệp, hãy thêm phần sau để thiết lập đăng ký người dùng:

module.exports = (passport) => {
passport.use(
"local-signup",
new LocalStrategy(
{
usernameField: "email",
passwordField: "password",
},
async (email, password, done) => {
try {
const userExists = await emailExists(email)

if (userExists) {
return done(null, false);
}

const user = await createUser(email, password);
return done(null, user);
} catch (error) {
done(error);
}
}
)
);
}

Vì passport-local yêu cầu tên người dùng và mật khẩu và bạn đang sử dụng email, hãy đặt trường tên người dùng thành email. Người dùng hay đúng hơn là phần giao diện người dùng của ứng dụng này sẽ gửi email và mật khẩu trong phần thân yêu cầu. Tuy nhiên, bạn không cần phải tự giải nén các giá trị vì Passport sẽ xử lý điều đó ở chế độ nền.

Trước tiên, chương trình này kiểm tra xem email đã được sử dụng chưa bằng cách sử dụng hàm emailExists () từ helper.js. Nếu email không tồn tại trong cơ sở dữ liệu, nó sẽ tạo một người dùng mới bằng hàm createUser (). Cuối cùng, nó trả về đối tượng người dùng.

Để đăng nhập người dùng, hãy thêm thông tin sau vào passportConfig.js:

module.exports = (passport) => {
passport.use(
"local-signup",
new LocalStrategy(
)
);
passport.use(
"local-login",
new LocalStrategy(
{
usernameField: "email",
passwordField: "password",
},
async (email, password, done) => {
try {
const user = await emailExists(email);
if (!user) return done(null, false);
const isMatch = await matchPassword(password, user.password);
if (!isMatch) return done(null, false);
return done(null, {id: user.id, email: user.email});
} catch (error) {
return done(error, false);
}
}
)
);
};

Ở đây, chương trình đầu tiên sẽ kiểm tra xem email đã được đăng ký hay chưa. Nếu không, nó trả về false. Nếu nó tìm thấy email, nó sẽ so sánh mật khẩu của nó với mật khẩu từ yêu cầu. Nếu mật khẩu khớp, nó sẽ đăng nhập người dùng và trả về đối tượng người dùng.

Bước cuối cùng là tạo các điểm cuối API:

  • POST / auth / đăng ký
  • POST / auth / đăng nhập

Cả hai điểm cuối này sẽ nhận được email và mật khẩu trong phần thân yêu cầu. Chúng cũng sẽ bao gồm các chức năng phần mềm trung gian xác thực hộ chiếu mà chúng tôi vừa định cấu hình.

Nhập và thiết lập Hộ chiếu trong một tệp mới có tên server.js:

const passport = require("passport");
require("./passportConfig")(passport);

Sau đó, thêm các tuyến đường sau:

app.post(
"/auth/signup",
passport.authenticate("local-signup", { session: false }),
(req, res, next) => {
res.json({
user: req.user,
});
}
);
app.post(
"/auth/login",
passport.authenticate("local-login", { session: false }),
(req, res, next) => {
res.json({ user: req.user });
}
);

Cả hai tuyến này đều trả về một đối tượng JSON chứa người dùng nếu thành công.

Kiểm tra API của bạn bằng cách sử dụng các bài kiểm tra đơn vị

Bạn có thể sử dụng Passport để xác thực ứng dụng Node bằng ứng dụng PostgreSQL. Bạn đã tạo điểm cuối API để đăng ký và đăng nhập người dùng.

Mặc dù bạn có thể sử dụng các ứng dụng khách REST như Postman để kiểm tra API hoạt động tốt như thế nào, nhưng việc viết các bài kiểm tra đơn vị lại đơn giản hơn nhiều. Các bài kiểm tra đơn vị cho phép bạn kiểm tra các phần riêng lẻ trong ứng dụng của mình. Bằng cách này, ngay cả khi một điểm cuối bị lỗi, bạn có thể xác định chính xác điểm lỗi. Một trong những công cụ bạn có thể sử dụng để kiểm tra các ứng dụng Node là Jest.

Similar Posts

Leave a Reply

Your email address will not be published. Required fields are marked *