ホームページ > ウェブフロントエンド > jsチュートリアル > Express、JWT、Bcrypt、MySQL を使用したユーザー認証 API

Express、JWT、Bcrypt、MySQL を使用したユーザー認証 API

DDD
リリース: 2024-11-05 13:32:02
オリジナル
1013 人が閲覧しました

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

このアプリケーションは、Express で構築されたシンプルな認証サーバーであり、セッション管理に JSON Web Token (JWT) を使用し、パスワードを安全に保存するために bcrypt を使用します。ユーザーは登録およびログインして、保護されたルートにアクセスできます。 MySQL はユーザー データの保存に使用されます。

使用されている技術

1. Express.js: ルートとミドルウェアを処理するための Web フレームワーク。
2. bcrypt.js: パスワードを安全にハッシュするためのライブラリ。
3. jsonwebtoken: JWT トークンを作成および検証するためのライブラリ。
4. mysql2: Promises をサポートする Node.js 用の MySQL クライアント。
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 アプリの初期化と定数の定義

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 アプリケーションのホスト名を入力します。localhost で実行している場合は、localhost のみを入力します。MySql をサーバーにデプロイしている場合は、サーバーのホスト名と PORT を使用します。
  • user: MySql ユーザー名
  • パスワード: MySql パスワード
  • database: データベース名

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() メソッドは 2 つの引数 payloadJWT_SECREToptions(オプション)
  • を取ります
  • res.cookie(): httpOnly (サーバーのみがアクセス可能) および SameSite 設定によって保護された、JWT を使用して Cookie を設定します。

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 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート