Menguasai Pengesahan dalam Node.js dan Express: Panduan Komprehensif

Barbara Streisand
Lepaskan: 2024-10-04 16:20:29
asal
759 orang telah melayarinya

Mastering Authentication in Node.js and Express: A Comprehensive Guide

Pengesahan ialah komponen penting dalam aplikasi web moden, membolehkan pembangun memastikan bahawa hanya pengguna yang dibenarkan boleh mengakses ciri atau data tertentu. Dalam aplikasi berasaskan Node.js dan Express, pengesahan biasanya dikendalikan menggunakan token, selalunya Token Web JSON (JWT), kerana kecekapan dan keselamatannya.

Dalam panduan ini, kami akan meneroka cara menyediakan pengesahan pengguna dalam aplikasi Node.js dan Express menggunakan JWT. Pada akhirnya, anda akan mempunyai pemahaman yang kukuh tentang cara melaksanakan pengesahan selamat untuk projek anda sendiri.

Apakah Pengesahan?

Pengesahan ialah proses mengesahkan identiti pengguna atau sistem. Dalam aplikasi web, ia melibatkan menyemak kelayakan pengguna seperti nama pengguna dan kata laluan. Setelah pengesahan berjaya, sistem membenarkan pengguna berinteraksi dengan aplikasi. Untuk keselamatan yang dipertingkatkan, pengesahan berasaskan token seperti JWT biasanya digunakan.

Mengapa Gunakan Token Web JSON (JWT)?

JWT ialah standard industri (RFC 7519) untuk pengesahan berasaskan token yang selamat dan tanpa negara. Mereka membenarkan maklumat dihantar dengan selamat antara pihak sebagai objek JSON. Token sering digunakan untuk mengesahkan identiti pengguna tanpa perlu menyimpan data sesi pada pelayan, menjadikan JWT pilihan yang bagus untuk aplikasi tanpa kewarganegaraan.

Langkah demi Langkah: Melaksanakan Pengesahan dalam Node.js dan Express

Mari kita pecahkan pelaksanaan sistem pengesahan asas menggunakan JWT dalam Node.js dan Express.

1. Menyediakan Aplikasi Node.js Anda

Sebelum menyelam ke dalam pengesahan, kami perlu menyediakan aplikasi asas Node.js dan Express. Ikuti langkah ini untuk memulakan projek anda:


mkdir auth-demo
cd auth-demo
npm init -y
npm install express bcryptjs jsonwebtoken mongoose dotenv


Salin selepas log masuk

Inilah kegunaan setiap pergantungan:

  • ekspresi: Rangka kerja untuk membina pelayan Node.js kami.
  • bcryptjs: Untuk mencincang dan membandingkan kata laluan dengan selamat.
  • jsonwebtoken: Untuk menjana dan mengesahkan JWT.
  • mongoose: Untuk berinteraksi dengan MongoDB.
  • dotenv: Untuk mengurus pembolehubah persekitaran seperti rahsia dan rentetan sambungan pangkalan data.

2. Mengkonfigurasi Pembolehubah Persekitaran

Buat fail .env dalam direktori akar projek anda untuk menyimpan maklumat sensitif seperti URI pangkalan data anda dan kunci rahsia JWT.


MONGODB_URI=mongodb://localhost:27017/auth-demo
JWT_SECRET=your_jwt_secret_key


Salin selepas log masuk

3. Menyambung ke MongoDB

Dalam akar projek, buat fail db.js di dalam folder konfigurasi untuk mengendalikan sambungan MongoDB.


// config/db.js
const mongoose = require('mongoose');
const dotenv = require('dotenv');

dotenv.config();

const connectDB = async () => {
  try {
    await mongoose.connect(process.env.MONGODB_URI, {
      useNewUrlParser: true,
      useUnifiedTopology: true,
    });
    console.log('MongoDB connected');
  } catch (err) {
    console.error('Error connecting to MongoDB:', err.message);
    process.exit(1);
  }
};

module.exports = connectDB;


Salin selepas log masuk

4. Mencipta Model Pengguna

Seterusnya, cipta model Pengguna untuk menentukan struktur dokumen pengguna dalam MongoDB. Di dalam folder model, buat User.js:


// models/User.js
const mongoose = require('mongoose');

const userSchema = new mongoose.Schema({
  username: { type: String, required: true, unique: true },
  password: { type: String, required: true },
});

module.exports = mongoose.model('User', userSchema);


Salin selepas log masuk

5. Melaksanakan Pendaftaran Pengguna

Kini kami akan menyediakan laluan untuk pendaftaran pengguna. Dalam folder pengawal, buat fail bernama authController.js dan laksanakan logik pendaftaran.


// controllers/authController.js
const User = require('../models/User');
const bcrypt = require('bcryptjs');
const jwt = require('jsonwebtoken');

// User registration
exports.register = async (req, res) => {
  const { username, password } = req.body;

  try {
    const existingUser = await User.findOne({ username });
    if (existingUser) {
      return res.status(400).json({ message: 'Username already exists' });
    }

    const hashedPassword = await bcrypt.hash(password, 10);
    const newUser = new User({ username, password: hashedPassword });

    await newUser.save();
    res.status(201).json({ message: 'User registered successfully' });
  } catch (err) {
    res.status(500).json({ error: err.message });
  }
};


Salin selepas log masuk

Logik ini mencincang kata laluan menggunakan bcrypt sebelum menyimpan maklumat pengguna dalam MongoDB.

6. Melaksanakan Log Masuk Pengguna

Log masuk adalah penting untuk menjana dan memulangkan JWT, yang pelanggan akan gunakan untuk mengesahkan permintaan masa hadapan. Begini cara untuk melaksanakan logik log masuk:


// controllers/authController.js (continue)
exports.login = async (req, res) => {
  const { username, password } = req.body;

  try {
    const user = await User.findOne({ username });
    if (!user) {
      return res.status(401).json({ message: 'Invalid username or password' });
    }

    const isPasswordValid = await bcrypt.compare(password, user.password);
    if (!isPasswordValid) {
      return res.status(401).json({ message: 'Invalid username or password' });
    }

    const token = jwt.sign({ id: user._id }, process.env.JWT_SECRET, { expiresIn: '1h' });
    res.json({ token });
  } catch (err) {
    res.status(500).json({ error: err.message });
  }
};


Salin selepas log masuk

Jika log masuk berjaya, kami menjana JWT menggunakan jsonwebtoken dan menghantarnya kepada pelanggan.

7. Menyediakan Middleware untuk Laluan Dilindungi

JWT berguna untuk melindungi laluan yang memerlukan pengesahan. Kami akan mencipta perisian tengah untuk mengesahkan token dan memastikan hanya pengguna yang diberi kuasa boleh mengakses titik akhir tertentu.


// middleware/authMiddleware.js
const jwt = require('jsonwebtoken');

exports.verifyToken = (req, res, next) => {
  const token = req.headers['authorization'];
  if (!token) return res.sendStatus(403);

  jwt.verify(token, process.env.JWT_SECRET, (err, user) => {
    if (err) return res.sendStatus(403);
    req.user = user;
    next();
  });
};


Salin selepas log masuk

8. Menggunakan Perisian Tengah Pengesahan

Akhir sekali, mari gunakan perisian tengah untuk melindungi laluan. Contohnya, anda mungkin mahu pengguna mengakses profil mereka hanya selepas log masuk:


// routes/userRoutes.js
const express = require('express');
const { verifyToken } = require('../middleware/authMiddleware');
const { getUserProfile } = require('../controllers/userController');

const router = express.Router();

router.get('/profile', verifyToken, getUserProfile);

module.exports = router;


Salin selepas log masuk

Perisian tengah verifyToken menyemak JWT yang sah dalam pengepala permintaan dan membenarkan akses kepada laluan jika token disahkan.

Kesimpulan

Dalam panduan ini, kami membincangkan perkara penting untuk melaksanakan pengesahan pengguna menggunakan JWT dalam aplikasi Node.js dan Express. Kami berjalan melalui penyediaan pendaftaran pengguna, log masuk dan melindungi laluan menggunakan pengesahan berasaskan token. Dengan asas ini, anda boleh membina sistem pengesahan yang teguh dan selamat dalam aplikasi anda sendiri. Semasa anda terus membangun, pertimbangkan untuk menambah token muat semula, kefungsian tetapan semula kata laluan dan pengesahan berbilang faktor untuk keselamatan yang dipertingkatkan.

Node.js와 Express로 인증을 마스터하면 확장 가능하고 안전한 웹 애플리케이션을 구축할 수 있습니다.

Atas ialah kandungan terperinci Menguasai Pengesahan dalam Node.js dan Express: Panduan Komprehensif. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:dev.to
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan