首頁 >web前端 >js教程 >使用 Express、JWT、Bcrypt 和 MySQL 的使用者驗證 API

使用 Express、JWT、Bcrypt 和 MySQL 的使用者驗證 API

DDD
DDD原創
2024-11-05 13:32:02999瀏覽

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

此應用程式是使用 Express 建置的簡單驗證伺服器,使用 JSON Web 令牌 (JWT) 進行會話管理,並使用 bcrypt 安全儲存密碼。用戶可以註冊並登入來存取受保護的路由。 MySQL用於儲存使用者資料。

使用的技術

1。 Express.js:用於處理路由和中間件的 Web 框架。
2. bcrypt.js:用於安全地散列密碼的函式庫。
3. jsonwebtoken:用於建立和驗證 JWT 令牌的函式庫。
4. mysql2:Node.js 的 MySQL 用戶端,支援 Promises。
5. cookie-parser:用於解析 cookie 的中間件。

代碼分解

1。導入所需的庫

const express = require('express');
const jwt = require('jsonwebtoken');
const bcrypt = require('bcryptjs');
const cookieParser = require('cookie-parser');
const mysql = require('mysql2/promise');
  • express:提供建立路由和處理HTTP請求的功能。
  • jsonwebtoken:用於為使用者會話建立和驗證 JWT。
  • bcryptjs:用於在將密碼儲存到資料庫之前對其進行雜湊處理。
  • cookie-parser:從傳入的 HTTP 請求中解析 cookie 的中間件。
  • mysql2/promise:支援 Promise 的 MySQL 用戶端,允許非同步操作。

2. 初始化 Express App 並定義常數

const app = express();
const PORT = 3000;
const JWT_SECRET = 'your_jwt_secret_key';
  • app:Express 應用程式實例。
  • PORT:伺服器將偵聽的連接埠。
  • JWT_SECRET:用來簽署 JWT 的金鑰。將其替換為生產中安全、隨機產生的值。

3. 資料庫連線設定

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

  • db:MySQL 資料庫連接物件。
  • mysql.createConnection():使用async/await建立與MySQL資料庫的連接,這是非阻塞查詢所需要的。
  • host:您的MySql應用程式主機名,如果您在本機上執行它,則僅輸入本機主機,如果您已將MySql部署到伺服器,請使用PORT的伺服器主機名稱。
  • user:您的 MySql 使用者名稱
  • 密碼:您的MySql密碼
  • 資料庫:資料庫名稱

4. 中介軟體設定

app.use(express.json());
app.use(cookieParser());
  • express.json():解析 JSON 請求體的中間件。
  • cookieParser():解析cookie的中間件,讓我們可以從req.cookies中讀取cookie。

5. 註冊路線

/註冊
該路由透過散列密碼並將其保存在資料庫中來註冊新用戶。

const express = require('express');
const jwt = require('jsonwebtoken');
const bcrypt = require('bcryptjs');
const cookieParser = require('cookie-parser');
const mysql = require('mysql2/promise');
  • db.execute():執行查詢以檢查具有給定電子郵件的使用者是否已存在。如果他們這樣做,則返回 400 狀態。
  • bcrypt.hash(password, 10):為了安全起見,使用鹽舍入值 10 對密碼進行雜湊處理。
  • db.execute()(插入):將使用者名稱、電子郵件和雜湊密碼儲存在資料庫中。

6. 登入路徑

/登入
此路由透過檢查現有使用者的憑證並產生 JWT 令牌來登入現有使用者。

const app = express();
const PORT = 3000;
const JWT_SECRET = 'your_jwt_secret_key';
  • bcrypt.compare(password, user.password):驗證雜湊密碼是否與資料庫中儲存的密碼相符。
  • jwt.sign():建立包含使用者資訊(例如 ID、姓名和電子郵件)的 JWT。令牌將在 1 小時後過期。 jwt.sign() 方法採用兩個參數 payloadJWT_SECREToptions(可選)
  • res.cookie():使用 JWT 設定 cookie,由 httpOnly(僅由伺服器存取)和 SameSite 設定保護。

7.JWT驗證中間件

verifyToken 中間件確保只有具有有效 JWT 令牌的請求才能存取受保護的路由。

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

  • req.cookies.token:從cookie中提取令牌。
  • jwt.verify(token, JWT_SECRET):使用 JWT 金鑰驗證令牌。如果有效,解碼**包含令牌的有效負載,該負載被分配給 **req.user.
  • next():如果令牌有效,則繼續到下一個中間件。

8. 受保護的路由 - /protected

僅經過身份驗證的使用者可以存取的受保護路由範例。它使用令牌中的使用者名稱返回個性化問候語。

app.use(express.json());
app.use(cookieParser());
  • verifyToken:用於檢查使用者驗證狀態的中間件。
  • req.user.name:從解碼的 JWT 負載存取使用者名稱。

9. 啟動伺服器

伺服器監聽定義的連接埠。

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' });
    }
});

完整程式碼

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' });
    }
});

概括

此應用程式:

  1. 允許透過雜湊密碼進行使用者註冊並將使用者資料儲存在 MySQL 中。
  2. 支援透過 JWT 驗證進行安全登入。
  3. 使用cookie在客戶端儲存JWT。
  4. 提供中間件,用於在授予受保護路由的存取權之前驗證 JWT。

以上是使用 Express、JWT、Bcrypt 和 MySQL 的使用者驗證 API的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn