Rumah  >  Artikel  >  hujung hadapan web  >  API Pengesahan Pengguna dengan Express, JWT, Bcrypt dan MySQL

API Pengesahan Pengguna dengan Express, JWT, Bcrypt dan MySQL

DDD
DDDasal
2024-11-05 13:32:02940semak imbas

User Authentication API with Express, JWT, Bcrypt, and MySQL

Aplikasi ini ialah pelayan pengesahan ringkas yang dibina dengan Express, menggunakan JSON Web Token (JWT) untuk pengurusan sesi dan bcrypt untuk menyimpan kata laluan dengan selamat. Pengguna boleh mendaftar dan log masuk untuk mengakses laluan yang dilindungi. MySQL digunakan untuk menyimpan data pengguna.

Teknologi yang Digunakan

1. Express.js: Rangka kerja web untuk mengendalikan laluan dan perisian tengah.
2. bcrypt.js: Pustaka untuk mencincang kata laluan dengan selamat.
3. jsonwebtoken: Pustaka untuk mencipta dan mengesahkan token JWT.
4. mysql2: Pelanggan MySQL untuk Node.js dengan sokongan untuk Promises.
5. cookie-parser: Peranti tengah untuk menghuraikan kuki.

Pecahan Kod

1. Import Perpustakaan Diperlukan

const express = require('express');
const jwt = require('jsonwebtoken');
const bcrypt = require('bcryptjs');
const cookieParser = require('cookie-parser');
const mysql = require('mysql2/promise');
  • ekspresi: Menyediakan fungsi untuk mencipta laluan dan mengendalikan permintaan HTTP.
  • jsonwebtoken: Digunakan untuk mencipta dan mengesahkan JWT untuk sesi pengguna.
  • bcryptjs: Digunakan untuk mencincang kata laluan sebelum menyimpannya dalam pangkalan data.
  • penghuraikan kuki: Peranti tengah untuk menghuraikan kuki daripada permintaan HTTP masuk.
  • mysql2/promise: Pelanggan MySQL dengan sokongan janji, membenarkan operasi tak segerak.

2. Mulakan Apl Ekspres dan Tentukan Pemalar

const app = express();
const PORT = 3000;
const JWT_SECRET = 'your_jwt_secret_key';
  • apl: Contoh aplikasi Ekspres.
  • PORT: Port yang akan didengari oleh pelayan.
  • JWT_SECRET: Kunci rahsia yang digunakan untuk menandatangani JWT. Gantikan ini dengan nilai yang selamat dan dijana secara rawak dalam pengeluaran.

3. Persediaan Sambungan Pangkalan Data

const db = await mysql.createConnection({
    host: 'localhost',
    user: 'your_mysql_user',
    password: 'your_mysql_password',
    database: 'user_auth'
});

  • db: Objek sambungan pangkalan data MySQL.
  • mysql.createConnection(): Mewujudkan sambungan ke pangkalan data MySQL menggunakan async/wait, yang diperlukan untuk pertanyaan tidak menyekat.
  • hos: Nama hos aplikasi Yout MySql, Jika anda menjalankannya pada localhost, letakkan localhost sahaja, jika anda telah menggunakan MySql anda ke pelayan, gunakan nama hos pelayan dengan PORT.
  • pengguna: Nama Pengguna MySql Anda
  • kata laluan: Kata Laluan MySql Anda
  • pangkalan data: Nama Pangkalan Data

4. Persediaan Middleware

app.use(express.json());
app.use(cookieParser());
  • express.json(): Middleware untuk menghuraikan badan permintaan JSON.
  • cookieParser(): Middleware untuk menghuraikan kuki, membenarkan kami membaca kuki daripada req.cookies.

5. Daftar Laluan

/daftar
Laluan ini mendaftarkan pengguna baharu dengan mencincang kata laluan mereka dan menyimpannya dalam pangkalan data.

const express = require('express');
const jwt = require('jsonwebtoken');
const bcrypt = require('bcryptjs');
const cookieParser = require('cookie-parser');
const mysql = require('mysql2/promise');
  • db.execute(): Jalankan pertanyaan untuk menyemak sama ada pengguna dengan e-mel yang diberikan sudah wujud. Jika ya, kembalikan status 400.
  • bcrypt.hash(kata laluan, 10): Mencincang kata laluan dengan nilai garam membulat 10 untuk keselamatan.
  • db.execute() (Insert): Menyimpan nama pengguna, e-mel dan kata laluan cincang dalam pangkalan data.

6. Laluan Log Masuk

/log masuk
Laluan ini log masuk pengguna sedia ada dengan menyemak kelayakan mereka dan menjana token JWT.

const app = express();
const PORT = 3000;
const JWT_SECRET = 'your_jwt_secret_key';
  • bcrypt.compare(kata laluan, pengguna.kata laluan): Mengesahkan sama ada kata laluan yang dicincang sepadan dengan kata laluan yang disimpan dalam pangkalan data.
  • jwt.sign(): Mencipta JWT yang merangkumi maklumat pengguna (cth., ID, nama dan e-mel). Token tamat tempoh dalam 1 jam. Kaedah jwt.sign() mengambil dua hujah muatan, JWT_SECRET, pilihan(pilihan)
  • res.cookie(): Menetapkan kuki dengan JWT, dilindungi oleh httpOnly (hanya boleh diakses oleh pelayan) dan tetapan sameSite.

7. Perisian Tengah Pengesahan JWT

Perisian tengah verifyToken memastikan bahawa hanya permintaan dengan token JWT yang sah boleh mengakses laluan yang dilindungi.

const db = await mysql.createConnection({
    host: 'localhost',
    user: 'your_mysql_user',
    password: 'your_mysql_password',
    database: 'user_auth'
});

  • req.cookies.token: Mengekstrak token daripada cookies.
  • jwt.verify(token, JWT_SECRET): Mengesahkan token menggunakan kunci rahsia JWT. Jika sah, dikodkan **mengandungi muatan token, yang diperuntukkan kepada **req.user.
  • next(): Teruskan ke middleware seterusnya jika token itu sah.

8. Laluan Dilindungi - /dilindungi

Sampel laluan yang dilindungi hanya boleh diakses oleh pengguna yang disahkan. Ia mengembalikan salam yang diperibadikan menggunakan nama pengguna daripada token.

app.use(express.json());
app.use(cookieParser());
  • verifyToken: Middleware digunakan untuk menyemak status pengesahan pengguna.
  • req.user.name: Mengakses nama pengguna daripada muatan JWT yang dinyahkod.

9. Mulakan Pelayan

Pelayan mendengar pada PORT yang ditentukan.

app.post('/register', async (req, res) => {
    const { name, email, password } = req.body;

    try {
        // Check if user already exists
        const [rows] = await db.execute('SELECT * FROM users WHERE email = ?', [email]);
        if (rows.length > 0) {
            return res.status(400).json({ message: 'User already exists' });
        }

        // Hash the password
        const hashedPassword = await bcrypt.hash(password, 10);

        // Save the user in the database
        await db.execute('INSERT INTO users (name, email, password) VALUES (?, ?, ?)', [name, email, hashedPassword]);
        res.status(201).json({ message: 'User registered successfully!' });
    } catch (error) {
        console.error(error);
        res.status(500).json({ message: 'Server error' });
    }
});

Kod Penuh

app.post('/login', async (req, res) => {
    const { email, password } = req.body;

    try {
        // Find user
        const [rows] = await db.execute('SELECT * FROM users WHERE email = ?', [email]);
        const user = rows[0];
        if (!user) {
            return res.status(400).json({ message: 'User not found' });
        }

        // Check password
        const isMatch = await bcrypt.compare(password, user.password);
        if (!isMatch) {
            return res.status(400).json({ message: 'Invalid credentials' });
        }

        // Create JWT token
        const token = jwt.sign({ id: user.id, name: user.name, email: user.email }, JWT_SECRET, { expiresIn: '1h' });

        // Set JWT in cookie
        res.cookie('token', token, {
            httpOnly: true,
            secure: process.env.NODE_ENV === 'production',
            sameSite: 'Strict',
            maxAge: 3600000 // 1 hour
        });

        res.json({ message: 'Logged in successfully!' });
    } catch (error) {
        console.error(error);
        res.status(500).json({ message: 'Server error' });
    }
});

Ringkasan

Aplikasi ini:

  1. Membenarkan pendaftaran pengguna dengan mencincang kata laluan dan menyimpan data pengguna dalam MySQL.
  2. Menyokong log masuk selamat dengan pengesahan JWT.
  3. Menggunakan kuki untuk menyimpan JWT pada bahagian pelanggan.
  4. Menyediakan perisian tengah untuk mengesahkan JWT sebelum memberikan akses kepada laluan yang dilindungi.

Atas ialah kandungan terperinci API Pengesahan Pengguna dengan Express, JWT, Bcrypt dan MySQL. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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