【React + Node.js】ログイン認証機能(環境構築編)

JavaScript

■ 主の PC環境一覧

OS:Windows11(WSL2:Ubuntu 22.04.4 LTS)

nvm:v18.16.0
npm:v9.5.1
MySQL:8.4.0

フロントエンド側(React)で使用するパッケージ一覧
{
  "name": "form",
  "version": "0.1.0",
  "private": true,
  "dependencies": {
    "@testing-library/jest-dom": "^5.17.0",
    "@testing-library/react": "^13.4.0",
    "@testing-library/user-event": "^13.5.0",
    "@types/jest": "^27.5.2",
    "@types/node": "^16.18.101",
    "axios": "^1.7.2",
    "bootstrap": "^5.2.0",
    "crypto-js": "^4.2.0",
    "react": "^18.3.1",
    "react-bootstrap": "^2.5.0",
    "react-dom": "^18.3.1",
    "react-scripts": "5.0.1",
    "typescript": "^4.9.5",
    "web-vitals": "^2.1.4"
  },
  "scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test",
    "eject": "react-scripts eject"
  },
  "eslintConfig": {
    "extends": [
      "react-app",
      "react-app/jest"
    ]
  },
  "browserslist": {
    "production": [
      ">0.2%",
      "not dead",
      "not op_mini all"
    ],
    "development": [
      "last 1 chrome version",
      "last 1 firefox version",
      "last 1 safari version"
    ]
  },
  "devDependencies": {
    "@types/crypto-js": "^4.2.2",
    "@types/react": "^18.3.3",
    "@types/react-dom": "^18.3.0"
  }
}
バックエンド側(Node.js)で使用するパッケージ一覧
{
  "name": "server",
  "version": "1.0.0",
  "description": "",
  "main": "app.ts",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "npx ts-node app.ts"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "@types/cors": "^2.8.17",
    "@types/crypto-js": "^4.2.2",
    "@types/express": "^4.17.21",
    "@types/node": "^16.18.101",
    "ts-node": "^10.9.2",
    "typescript": "^5.5.3"
  },
  "dependencies": {
    "cors": "^2.8.5",
    "crypto-js": "^4.2.0",
    "dotenv": "^16.4.5",
    "express": "^4.19.2",
    "mysql2": "^3.10.2"
  }
}

上記、フロントエンド側環境とバックエンド側環境にコピーして使用しても良いです。

# package.jsonで設定されているパッケージをインストール
$ npm install

■ 初めに

ここで読者の方へ問いかけなのですが、JavaScriptを使用した(React 等)の環境構築を Windows上か Linux上(Ubuntu)かで悩みませんでした?

因みに、筆者は 2日間 悩みました。(Web系は(WordPress以外)完全に初見なので、、)
筆者は、ふと思いました。
『JavaScriptって基本的にブラウザ上で動作するんやから、デプロイとか諸々考慮すると Linux上で開発環境整えた方が後々えんちゃん!(名案)』

でもまぁ、大体の人はメインPCに Windowsを使ってると思うんですね。
だがしかしまぁ、Reactの環境構築手順を調査してたら、どこもかしこも Linuxでとか WSL2を使用してとか抗っていたので『何でかなぁ』と思ってたらそういうことですね。(多分)

はい、今回の完成イメージです。

お恥ずかしながら、筆者は執筆時点で Reactというか Node.jsというか Web系を学んで数週間でして、、
なので、全部が全部「へぇ!」「なるほど!」の連発だったので、本記事には学んだこと含めて全部書きます!

筆者はねぇ、プロフィールにも記載通り分野が全く違うんでね、、多めに見てください。

ログイン認証画面の完成イメージ

ログイン認証なんでね。
以下の機能(仕様)で構成しているので、是非、入門としてお役に立ててください!

  1. ユーザー情報(ユーザー名、パスワード)を入力
  2. 入力されたユーザー情報を暗号化
  3. ユーザー情報をフロントエンド側(React)からバックエンド側(Node.js)へ送信
  4. 受信したユーザー情報を複合化
  5. 一致するユーザー情報ががデータベース(MySQL)に存在しているかを確認
  6. ログイン認証結果をバックエンド側(Node.js)からフロントエンド側(React)へ送信

[1]初期手順

# プロジェクトディレクトリを生成/移動
$ mkdir login-form
$ cd login-form

# フロントエンド側(React)で使用する nodeバージョン指定ファイルを生成
$ touch .nvmrc >> v18.16.0

---
# 現段階のディレクトリ構成
login-form/
└── .nvmrc
え、バックエンド側(Node.js)は?って思いましたね?

Reactの環境は「$ npx create-react-app ~」で構築し、コマンド入力時に設定したディレクトリが生成されます。
生成されたディレクトリ配下が Reactの環境となるため、予め使用する nodeのバージョンを指定しておかなければなりません。

しかし、Node.jsの環境は、初期化を行う(バックエンド側のプロジェクト)ディレクトリを作成した上で$ npm init」を行います。
そのため、全体となる親ディレクトリ(./login-form)には必要ない訳です。

フロントエンド側とバックエンド側を、親ディレクトリを設けて、そこでまとめて実装してるからややこしく感じますよね、、すみません。(仕様に依存します)
後、変に難しく書きましたけど、本プロジェクトでは使用している nodeのバージョンは統一していることと、それぞれの環境構築で nodeを有効化する際に「$ nvm use」を行うのですが、実行ディレクトリから遡って 1番最初に見つけた「.mvnrc」で設定されている(もしくは、デフォルトに設定(alias defualt)されている)nodeのバージョンを有効化するので、本プロジェクトに限っての手順かもしれません。

[2]フロントエンド側(React)環境構築

[2.1]Reactインストール

# 使用する node有効化
$ nvm use

# React(TypeScript)をインストール
$ npx create-react-app form --template typescript
npxコマンドって何?

主に、特定のコマンドを一時的に使用(実行)したい場合に使用します。
要は継続的には必要ないので文字通り一時的に使いたい場合です。(使用後に自動的に削除してくれる優れもの)

今回の例でいうと、Reactの環境を構築する上で実行する必要なコマンドは「$ create-react-app」です。
create-react-app」もパッケージですからね。
しかし、本パッケージの使用用途は Reactの環境構築を行う時のみで、開発中に使用することや組み込むこともありません。

もちろん、$ npm install -g create-react-app」でグローバル環境にインストールして、「$ create-react-app form --template typescript」にて React環境の構築を行っても良い訳です。
が、随時更新しない限りインストールした時点での「create-react-app」のバージョンを使用す続けることになるので、$ npx」を使用してその時々の最新バージョンにて環境構築を行った方が効率が良いという訳ですね。

以下、$ npx create-react-appコマンド実行時のエラー内容です。

$ npx create-react-app form --template typescript

Creating a new React app in /home/form.

Installing packages. This might take a couple of minutes.
Installing react, react-dom, and react-scripts with cra-template-typescript...


added 1316 packages in 16s

261 packages are looking for funding
  run `npm fund` for details

Installing template dependencies using npm...
npm error code ERESOLVE
npm error ERESOLVE unable to resolve dependency tree
npm error
npm error While resolving: form@0.1.0
npm error Found: react@19.0.0
npm error node_modules/react
npm error   react@"^19.0.0" from the root project
npm error
npm error Could not resolve dependency:
npm error peer react@"^18.0.0" from @testing-library/react@13.4.0
npm error node_modules/@testing-library/react
npm error   @testing-library/react@"^13.0.0" from the root project
npm error
npm error Fix the upstream dependency conflict, or retry
npm error this command with --force or --legacy-peer-deps
npm error to accept an incorrect (and potentially broken) dependency resolution.
npm error
npm error
npm error For a full report see:
npm error /home/.npm/_logs/2024-12-11T12_53_17_440Z-eresolve-report.txt
npm error A complete log of this run can be found in: /home/.npm/_logs/2024-12-11T12_53_17_440Z-debug-0.log
`npm install --no-audit --save @testing-library/jest-dom@^5.14.1 @testing-library/react@^13.0.0 @testing-library/user-event@^13.2.1 @types/jest@^27.0.1 @types/node@^16.7.13 @types/react@^18.0.0 @types/react-dom@^18.0.0 typescript@^4.4.2 web-vitals@^2.1.0` failed

エラー内容としては、create-react-appが React19(実行時点での最新)をインストールしようとしているからです。
それが、@testing-library/react の依存する React18と競合しているためです。

解決方法1:React18を明示的に指定してプロジェクトを作成

create-react-appを使う時に、React18を指定してインストールします。
--scripts-version 5.0.1 は React 18 用の react-scripts バージョンです。React19用の react-scripts はまだ正式にはリリースされていません。

$ npx create-react-app form --template typescript --use-npm --scripts-version 5.0.1
解決方法2:ダウングレード

既に作成されたプロジェクトから、以下の手順で React18にダウングレードします。

# 上述の通り、プロジェクト生成(必然的に、実行時の最新がインストールされるみたい)
$ npx create-react-app form --template typescript


# 既存の Reactと関連パッケージをアンインストール
$ npm uninstall react react-dom @types/react @types/react-dom

# React18(パッケージ)をインストール
$ npm install react@18 react-dom@18 @types/react@18 @types/react-dom@18

# 依存関係を再インストール
$ npm install

[2.1.1]動作確認

下記コマンドを実行して、Reactの初期画面が表示されていれば成功です。

$ cd form
$ npm start


---
Compiled successfully!

You can now view form in the browser.

  Local:            http://localhost:3000
  On Your Network:  http://192.168.1.1:3000

Note that the development build is not optimized.
To create a production build, use npm run build.

webpack compiled successfully
No issues found.
React初期起動画面

[2.2]各画面や機能の用途ごとに開発を進めるためのディレクトリ生成(設計パターン)

$ mkdir -p ./src/{assets,assets/images,assets/styles,components/common,components/layout,components/specific,hooks,pages,services,utils}
各ディレクトリ詳細
  • assets/
    • プロジェクトの静的資源(画像や CSS、JavaScript、TypeScriptファイルなど)を格納します。
      これらのファイルは、ビルドプロセスによって最適化され、最終的なバンドルされたアプリケーションに組み込まれます。
  • assets/images/
    • アプリケーション内で使用する画像ファイルを格納します。
      これには、UIコンポーネントのアイコン、背景画像、キャラクターアセットなどが含まれます。
  • assets/styles/
    • CSSまたは Sassなどのスタイルシートを格納します。
      これらのスタイルシートは、アプリケーションの見た目を定義し、CSSモジュールやグローバルスタイルシートとして使用されます。
  • components/common/
    • 再利用可能な共通コンポーネントを格納します。
      これには、ナビゲーションバーやフッター、ボタン、カードなどの広範囲で使用されるUIコンポーネントが含まれます。
  • components/layout/
    • ページレイアウトを定義するコンポーネントを格納します。
      これには、ヘッダーやフッター、サイドバーなどのレイアウトコンポーネントが含まれます。
  • components/specific/
    • 特定のビジネスロジックやページに固有のコンポーネントを格納します。
      これには、ユーザープロフィールページや商品詳細ページなどの特定のページ用のコンポーネントが含まれます。
  • hooks/
    • カスタムフックを格納します。
      React Hooksを使用して状態管理や副作用を抽象化するカスタムフックをここに配置します。
  • pages/
    • アプリケーションのページコンポーネントを格納します。
      これには、ホームページやログインページ、検索結果ページなどのページコンポーネントが含まれます。
  • services/
    • APIサービスや外部APIとの通信を扱う関数やクラスを格納します。
      これには、データフェッチングや認証トークンの管理などが含まれます。
  • utils/
    • ユーティリティ関数やヘルパー関数を格納します。
      これらの関数は、アプリケーション全体で再利用可能な一般的な機能(日付フォーマット、配列操作など)を提供します。

[2.3]ログイン認証画面及び機能で使用するパッケージインストール

[2.3.1]Bootstrap

Bootstrapの UIコンポーネントを Reactで使用できるようにしたライブラリです。
これにより、全て自作で CSSを作成しなくても Bootstrapのデザインと機能を Reactに組み込むことができます。

# 執筆時点で動作確認ができたバージョンを指定(バージョンを指定しない場合は、その時の最新がインストールされます)
$ npm install react-bootstrap@2.5.0 bootstrap@5.2.0
$ npm install --save-dev @types/react @types/react-dom
–save-devって何?

–save-dev(省略 -D)オプションは、Node.jsのパッケージ管理ツールである npmを使用して、プロジェクトに開発目的での依存関係を追加するために使用されます。
このオプションを使用すると、インストールされたパッケージは devDependenciesセクションに記録されます。

  • メリット
    • 明確な区別
      • 開発依存関係とアプリケーション運用に必要な依存関係を明確に分けることができます。
        これにより、プロダクション環境でのインストール時に不要なパッケージを省略し、パッケージサイズを削減することが可能になります。
    • 効率的な開発
      • 開発中に必要となるツールやライブラリを devDependenciesに追加することで、開発環境の構成を整理し、効率的に作業を行うことができます。
  • デメリット
    • 不必要なパッケージのインストール
      • プロダクション環境でも開発環境でも同じようにパッケージを扱うことになり、不要なパッケージがインストールされる可能性があります。
        これは、パッケージのサイズを増加させたり、不必要なリソースを消費したりする結果をもたらします。
    • 混乱の原因
      • 依存関係が混在している場合、どのパッケージが開発目的でどの程度必要かがわかりづらくなる可能性があります。
        これは、チーム内でのコミュニケーション障害や、新しい開発者がプロジェクトに参加したときの理解の難しさにつながるかもしれません。
  • 結論
    • React環境で TypeScriptを使用する際に –save-devオプションを使用することは、プロジェクトの管理と効率化に有益です。
      このオプションを使用することで、開発依存関係とアプリケーション依存関係を明確に区別し、プロダクション環境でのパフォーマンス向上や開発効率の向上を図ることができます。

[2.3.2]Axios

Axiosは、React内で HTTP通信を効率的に管理し、非同期データフェッチングを容易にすることができます。

$ npm install axios
Axiosの使用用途や機能
  1. データの取得と送信
    • GETリクエスト
      • APIからデータを取得するために使用します。
        例)ユーザー情報や商品リストなどのデータをフェッチするのに適しています。
    • POSTリクエスト
      • 新しいデータをサーバーに送信するために使用します。
        例)新規ユーザー登録や商品の追加などが該当します。
  2. リソースの更新と削除
    • PUT/PATCHリクエスト
      • 既存のリソースを更新するために使用します。
        例)ユーザーの情報を更新したり、商品の価格を変更したりするのに適しています。
    • DELETEリクエスト
      • リソースを削除するために使用します。
        例)ユーザーを削除したり、商品を取り消したりするのに適しています。
  3. エラーハンドリング
    • Axiosは、HTTPステータスコード 400以上(クライアントエラー)や 500以上(サーバーエラー)の場合に自動的にエラーをスローします。
      これにより、エラーハンドリングが容易になります。
      また、.catch()メソッドを使用して、リクエスト中に発生した全てのエラーを捕捉し、適切に対応することができます。
  4. 自動的な JSONデータの変換
    • Axiosは、レスポンスを自動的に JSON形式に変換します。
      これにより、レスポンスデータを直接 JavaScriptオブジェクトとして扱うことができ、開発者が手動でパースする必要がなくなります。
  5. CORS対応
    • Axiosは CORS(Cross-Origin Resource Sharing)に対応しており、異なるオリジンのリソースへのリクエストもサポートしています。
      これにより、複数のオリジンからのリクエストを安全に処理することが可能になります。
  6. インターセプターとキャンセル機能
    • Axiosはリクエストのインターセプト(リクエストまたはレスポンスの前に処理を行う)やキャンセル(進行中のリクエストをキャンセルする)といった高度な機能を提供します。
      これらは、リクエストの管理や制御をより柔軟に行うことを可能にします。
  7. クライアント側での使用
    • Axiosは、ブラウザ環境だけでなく、Node.js環境でも使用することができます。
      これにより、一貫したAPI呼び出し方法を両方の環境で維持することができます。

[2.3.3]CryptoJS

CryptoJSは、JavaScriptで暗号化とハッシュ関数を実行するためのライブラリです。

$ npm install crypto-js
$ npm install --save-dev  @types/crypto-js
CryptoJSの使用用途や機能
  1. データの暗号化と複合化
    • 機密情報の保護
      • 機密情報(パスワード、APIキーなど)を安全に格納し、必要に応じて復号化するために使用します。
        例えば、ユーザーが入力したパスワードをハッシュ化してデータベースに保存し、ログイン時にそのハッシュ値を比較することができます。
  2. データの整合性検証
    • データの不変性確認
      • データの送信過程でデータが改ざんされていないかを検証するために使用します。
        ハッシュ関数を使用してデータをハッシュ化し、受信後に同じハッシュ関数を再度適用して計算したハッシュ値を比較します。
        もしハッシュ値が一致しなければ、データが改ざんされていると判断できます。
  3. パスワードのハッシュ化
    • パスワードの安全な格納
      • ユーザーが入力したパスワードをハッシュ化してデータベースに保存することで、実際のパスワードを直接保存することなく、パスワードの安全性を確保します。
        パスワードが漏洩しても、ハッシュ化された値だけが漏れるため、実際のパスワードの復元は困難になります。
  4. セキュアな通信の実現
    • HTTPSの接続のセキュリティ強化
      • HTTPS接続において、クライアントとサーバー間で交換されるデータを暗号化するために使用します。
        これにより、中間者攻撃などのリスクを軽減できます。
  5. デジタル署名と認証
    • デジタル署名の生成
      • データにデジタル署名を付けることで、そのデータが特定の人物によって生成または承認されたことを証明します。
        これは、電子契約やメールの検証など、様々な場面で利用されます。
  6. セキュリティ分析とテスト
    • セキュリティに関するテスト
      • アプリケーションのセキュリティを評価するために、暗号化アルゴリズムやハッシュ関数の脆弱性を模倣するテストを行う際に使用します。

[3]バックエンド側(Node.js)環境構築

[3.1]Node.js初期化

$ npm init -y
yオプションは何のために?

「$ npm init」コマンドを実行すると、通常は初期化を行う上で一連の質問に答える必要があります。
しかし、「yオプション」を使用すると、これらの質問に自動的に『yes』と答えられるため、初期化プロセスの簡素化が可能になります。

次に、実際にどのようなことを聞かれるのかを説明と例を挙げて説明します。
プロジェクト概要を詳細に設定したい方は知っておくと良いと思います。

「$ npm init」で尋ねられる質問とその回答例
  • package name
    • 説明:プロジェクトの名前
    • デフォルト:現在のディレクトリ名が設定されます。
    • 例:my-project
  • version
    • 説明:プロジェクトのバージョンであり、最初のリリースは通常 1.0.0に設定します。
    • デフォルト:1.0.0
    • 例:1.0.0
  • description
    • 説明:プロジェクト概要を記載します。
    • 例:This is my new project.
  • entry point
    • 説明:プロジェクトのエントリーポイントのファイル名であり、通常は index.jsですが、他のファイルを指定することも可能です。
    • 例:index.js
  • test command
    • 説明:テストを実行するためのコマンドです。(テストスクリプトを設定している場合に入力)
    • 例:npm test
  • git repository
    • 説明:プロジェクトの Gitリポジトリの URLを入力します。(Gitで実装管理を行っている場合に入力)
    • 例:https://github.com/username/my-project.git
  • keywords
    • 説明:プロジェクトに関連するキーワードリストです。(カンマ区切りで複数入力可)
    • 例:node, project, example
  • author
    • 説明:プロジェクト開発者の名前を入力します。
    • 例:Jon Doe
  • license
    • 説明:プロジェクトのライセンスを入力します。(オープンソースであれば、通常は MITISCを使用)
    • デフォルト:ISC
    • 例:MIT
  • Is this ok? (yes)
    • 説明:これまでの入力内容を確認して、package.jsonを生成するか否かの判断を行います。
    • デフォルト:yes
    • 例:yes(Enterを押下)

[3.1.1]TypeScriptを使用する場合の初期化

# TypeScriptインストール
$ npm install --save-dev typescript

# Node.jsのプログラムに必要な型宣言ファイル node.d.tsをインストール
$ npm install --save-dev @types/node

# TypeScriptの設定ファイル tsconfig.jsonを初期化
$ npx tsc --init --rootDir src --outDir lib --esModuleInterop --resolveJsonModule --lib es6,dom --module commonjs

[3.2]各画面や機能の用途ごとに開発を進めるためのディレクトリ生成(設計パターン)

$ mkdir -p ./src/{config,controllers,models,routes}
各ディレクトリ詳細
  • config/
    • アプリケーションの設定ファイルや環境変数を格納します。
      これには、データベース接続情報、APIキー、アプリケーションの設定オブジェクトなどが含まれます。
      設定ファイルは、アプリケーションの動作を柔軟に変更できるようにするために重要です。
  • controllers/
    • コントローラーを格納します。
      コントローラーは、HTTPリクエストを受け取り、そのリクエストに基づいてビジネスロジックを実行し、レスポンスを返す役割を持ちます。
      これにより、アプリケーションのビジネスロジックとHTTP層を分離できます。
  • models/
    • モデルを格納します。
      モデルは、アプリケーションのデータ構造やデータベースのテーブルとの対話を担当します。
      これには、データベースからデータを取得したり、データをデータベースに保存したりするためのメソッドが含まれます。
  • routes/
    • ルーティングを定義するファイルを格納します。
      ルーティングは、アプリケーションのURLパスとそれに対応するコントローラーをマッピングします。
      これにより、アプリケーションの各エンドポイントがどのコントローラーにルーティングされるかを決定します。

[3.3]ログイン認証情報の解析及びデータベース接続で使用するパッケージインストール

[3.3.1]ts-node

ts-nodeは、Node.jsで直接 TypeScriptコードを実行できるツールです。
TypeScriptをネイティブに実行することはできないため、ts-nodeのようなツールを使って TypeScriptコードを実行する必要があります。
TypeScriptを JavaScriptに変換し、その結果を Node.jsで実行することで、TypeScriptコードの実行を可能にします。

$ npm install ts-node
ts-nodeの使用用途や機能
  1. 開発とテストの迅速化
    • TypeScriptファイルを直接実行することができます。
      これにより、開発とテストのプロセスが大幅に短縮され、開発者の生産性が向上します。
      特に、コードの変更を加えた後すぐにその結果を確認したい場合や、小さなスクリプトを迅速にテストしたい場合に有効です。
  2. TypeScript REPLの利用
    • TypeScript REPL(Read-Eval-Print Loop)を提供します。
      これにより、コマンドライン上で直接 TypeScriptコードを書きながら実行することができます。
      これは、コードの一部を試すために非常に便利です。
      REPLを使用すると、即座に結果を得られ、開発プロセスを効率化することができます。
  3. プロジェクトのセットアップと構成
    • プロジェクトのセットアップや構成を簡単にするために使用されます。
      例えば、ts-nodeをプロジェクトにインストールし、tsconfig.jsonファイルを設定することで、プロジェクト全体で一貫した TypeScriptの構成を適用することができます。
      これにより、プロジェクト内のすべての TypeScriptファイルが統一されたルールに従って処理されるようになります。
  4. ソースマップのサポート
    • ソースマップをサポートしています。
      これにより、エラーが発生した場合に、エラーが発生した具体的な行番号やコード位置を正確に特定することができます。
      これは、デバッグプロセスを効率化し、問題の特定と修正を容易にします。
  5. プラグインと拡張性
    • 様々なプラグインや拡張機能をサポートしています。
      これにより、ts-nodeの機能をカスタマイズしたり、特定のニーズに合わせて調整したりすることができます。
      例えば、特定のコンパイラオプションを使用したい場合や、異なる種類のファイルを処理する必要がある場合などに有効です。

ここでは「ts-node」をインストールしていますが、前述で学んだ「$ npx ~」を使用すればプロジェクト内にわざわざインストール必要はありません。(気づきました?)
本ツールは、特に開発に必要ではないからです。
ただ、TypeScriptを用いた実装の場合、直接 TypeScriptを実行することができないので、JavaScriptに変換してあげる必要があります。
その際に使用するので、「npx」を使用した方が無駄なリソースを取らないので良いですよね。

# インストールせず npxを使用した場合
$ npx ts-node app.ts

# インストールした場合
$ ts-node app.ts

[3.3.2]Express

Expressは、Node.js上で Webアプリケーションや APIを迅速かつ容易に作成するための人気のある無料およびオープンソースのフレームワークです。
Node.jsランタイム環境の上に構築されており、その核心機能を基にして、よりスムーズでユーザーフレンドリーな開発体験を提供します。
Expressは、開発者が最小限の努力で強力でスケーラブルなウェブアプリケーションを作成できるように、柔軟性、モジュール性、および使いやすさを備えた一連のツールを提供します。

$ npm install express
$ npm install --save-dev @types/express
Expressの使用用途や機能
  1. 使用用途
    • シングルページアプリケーションの構築
      • アプリケーションの全体が単一のインデックスページにルーティングされるシングルページアプリケーションを構築することができます。
    • リアルタイムネットワーキングアプリケーションの開発
      • チャットやダッシュボードアプリケーションなどのリアルタイムネットワーキングアプリケーションを開発するために使用されます。
    • ストリーミングアプリケーションの構築
      • 非同期データストリームを多数持つストリーミングアプリケーションを構築することができます。
    • 金融サービスアプリケーションの開発
      • 銀行などの金融サービスアプリケーションを開発するために、高度なセキュリティが求められる環境で使用されます。
    • マルチページ及びハイブリッドウェブアプリケーションの構築
      • マルチページアプリケーションやハイブリッドウェブアプリケーションを開発するために使用されます。
  2. 機能
    • ミドルウェアとルーティング
      • HTTPリクエストを異なる URLパスで異なる HTTP動詞(GET、POST、PUT、DELETE)に対応するための明確なパス(ルート)を定義します。
        また、リクエストとレスポンスの処理を中断して機能を追加するために再利用可能な関数(ミドルウェア)を実装します。
    • ミニマリストの設計
      • シンプルでミニマリストの設計哲学を追求しています。
        これにより、サーバーの設定、ルートの定義及び HTTPリクエストの効率的な処理が容易になります。
    • 柔軟性とカスタマイズ
      • 厳格なアプリケーションアーキテクチャを課さず、コードの構造を好みに応じて設定できます。
    • テンプレートエンジンの統合
      • Jadeや EJSなどのテンプレートエンジンを統合して、動的な HTMLコンテンツを生成し、ユーザーエクスペリエンスを向上させます。

[3.3.3]CryptoJS

前述の(React側で実行した)手順と同様

[3.3.4]Cors

CORS(Cross-Origin Resource Sharing)は、異なるオリジン間でのリソースの共有を制御するためのセキュリティメカニズムです。
Webブラウザが実行するクロスオリジンリクエストを制限するために導入されました。
これにより、マルウェア攻撃(例えば、クロスサイトスクリプティング(XSS)やクロスサイトリクエストフォージェリ(CSRF)など)を防ぐことができます。

$ npm install cors
$ npm install --save-dev @types/cors
Corsの使用用途や機能
  1. サードパーティAPIとのインタラクション
    • 複雑な Webアプリケーションは、クライアントサイドのコード内で第3者APIやリソースを参照することがあります。
      例えば、ユーザーがウェブサイト上で動画を視聴する場合、その動画は別のビデオプラットフォームAPIから取得されることがあります。
      また、Webサイトは天気情報を表示するために国立天文台のデータベースからデータを取得することがあります。
      このような場合、CORSを使用して、クライアントブラウザがサードパーティのサーバーにリクエストを送信する前に、リクエストが承認されているかどうかを確認することができます。
  2. フォントや画像などのリソースの読み込み
    • ウェブサイトは、Google Fontsやその他の公開フォントライブラリからフォントを読み込み、ユーザー体験を向上させることがあります。
      また、画像や CSSファイルなどの静的リソースも、異なるオリジンから読み込むことがあります。
      CORSを使用することで、これらのリソースへのアクセスを制御し、セキュリティを維持しつつ、必要なリソースを効率的に読み込むことができます。
  3. セキュリティの強化
    • クロスオリジンリクエストを制限することで、Webアプリケーションに対するセキュリティリスクを減少させます。
      例えば、ユーザーが銀行のウェブサイトにログインしている状態で、悪意のあるウェブサイトが銀行のサーバーにリクエストを送信しようとすると、CORSの設定により、このリクエストは拒否されます。
      これにより、潜在的な攻撃(例えば、クロスサイトリクエストフォージェリ(CSRF))を防ぐことができます。
  4. データの保護
    • 特定のオリジンからのリクエストのみを許可し、他のオリジンからのリクエストを拒否することができます。
      これにより、機密性の高いデータが不正なリクエストによって漏洩するリスクを軽減することができます。
      CORSヘッダーを使用して、どのオリジンからのリクエストを許可するかを明示的に指定することができます。

[3.3.5]dotenv

Node.jsアプリケーションで環境変数を管理するための軽量な npmパッケージです。
このパッケージを使用すると .envファイルから環境変数を自動的に process.envオブジェクトにロードすることができます。
これにより、アプリケーションの設定を外部から簡単に変更できるようになります。

$ npm install dotenv
dotenvの使用用途や機能
  1. 環境固有の設定の管理
    • アプリケーションの設定を環境ごとに異なる値を持ちたい場合に便利です。
      例えば、開発環境やテスト環境、本番環境などで異なるデータベース接続情報や APIキーを使用することができます。
      これにより、アプリケーションの設定を柔軟に切り替え、異なる環境での動作を容易に管理できます。
  2. 機密情報の安全な管理
    • 機密情報(パスワード、APIキーなど)を .envファイルに保存し、アプリケーション内で安全に参照することができます。
      これにより、機密情報がソースコードに混在することなく、安全に管理することができます。
  3. 複数の環境での設定の共有
    • 複数の開発者やチームが共同でプロジェクトを開発する場合、各開発者が自分の環境に合わせて設定を変更することなく、共有された設定を使用することができます。
      これにより、設定の統一性と一貫性を維持しつつ、個々の開発者のニーズに応じた柔軟な設定変更が可能になります。
  4. テスト環境での設定の簡易化
    • テスト用の .envファイルを作成し、テスト中にのみ使用する環境変数を定義することができます。
      これにより、テストコードの可読性と保守性が向上し、テスト環境での設定の変更が容易になります。
  5. 実装の移植性と再利用性の向上
    • アプリケーションの設定を外部ファイルに移動することで、コードの移植性と再利用性が向上します。
      異なる環境やプロジェクトで同じ設定を再利用することができ、設定の変更が容易になります。

本パッケージは非常に便利なので、もちろん Reactでも使用します。(え?)

  • 明示的なインストールの必要性
    • Reactプロジェクトでは dotenvを明示的にインストールする必要がない理由があります。
      それは、Create React App (CRA)が既に環境変数の管理をサポートしており .envファイルからの環境変数の読み込みを自動的に行うからです。
      CRAは、プロジェクトのルートディレクトリに .envファイルを作成し、その中に環境変数を定義することを許容しています。
      そして、ビルドや実行時にこれらの環境変数をアプリケーションに注入します。
  • 特定の条件下での dotenvの使用
    • ただし、CRA以外のセットアップやカスタムビルドプロセスを使用している場合、または特定の環境変数を Webpackの DefinePluginを通じてバンドルに埋め込みたい場合には、 dotenv-webpackのようなプラグインを使用することがあります。
      これにより、Webpackのビルドプロセス中に環境変数を読み込み、バンドルに直接挿入することができます。
  • 結論
    • Reactプロジェクトでは、dotenvを使用して環境変数を管理することができますが、 Create React Appを使用している場合、 dotenvを明示的にインストールする必要はありません。
      CRAはすでに環境変数の読み込みをサポートしており .envファイルからの環境変数の読み込みを自動的に行います。
      ただし、カスタムビルドプロセスや特定の環境変数の扱いを必要とする場合は、dotenv-webpackのようなプラグインを使用することがあります。

[3.3.6]mysql2

Node.js環境でデータベース(MySQL)と対話するためのパッケージです。
このパッケージは、パフォーマンスに焦点を当てて開発され、準備済みステートメントや非UTF-8エンコーディング、バイナリログプロトコル、圧縮、SSLなど、広範な機能をサポートしています。

$ npm install mysql2
mysql2の使用用途や機能
  1. データベースとの接続
    • Node.jsアプリケーションから MySQLデータベースに接続できます。
      これにより、アプリケーションはデータベース操作(データの挿入、更新、削除、検索など)を行うことができます。
  2. クリーニュープロセッサとCRUD操作
    • 非同期処理をサポートしており、PromiseベースのAPIを提供します。
      これにより、非同期のデータベース操作をより簡単に実装できます。
      また、CRUD(作成、読み取り、更新、削除)の基本的な操作を実行するための機能も提供しています。
  3. 準備済みステートメントのサポート
    • 準備済みステートメントをサポートしています。
      これにより、SQLインジェクション攻撃を防ぐだけでなく、パフォーマンスも向上させることができます。
      準備済みステートメントを使用すると、SQLクエリのパラメータ化を行い、SQLインジェクション攻撃を防ぐことができます。
  4. SSL/TLS接続のサポート
    • SSL/TLS接続をサポートしています。
      これにより、データベースとの通信を暗号化し、データの機密性と安全性を向上させることができます。

mysqlパッケージ」と「mysql2パッケージ」の違い

  • パフォーマンス
    • 準備済みステートメントの実装とパケットの効率的な処理により、通常は mysqlよりも優れたパフォーマンスを提供します。
  • API互換性
    • mysqlと API互換性を持つことを目指しており、大きなコード変更なしに両者で簡単に切り替えることができます。
  • Promisサポート
    • 内蔵Promiseサポートを提供し、async/awaitを使用したよりクリーンな非同期コードの実装を可能にします。
  • デバッグ
    • より詳細なスタックトレースとエラーメッセージを提供することで、mysqlよりも高度なデバッグ機能を提供します。

■ 諸々のパッケージインストールに失敗した場合や上手く動作しない場合の対処法

# node_modulesディレクトリ削除
$ rm -rf ./node_modules
# package-lock.jsonファイル削除
$ rm ./package-lock.json

# パッケージ再インストール
# package.jsonに記載されているパッケージがインストールされる
$ npm install

# ビルド
$ npm run build

[4]データベース側(MySQL)環境構築

誠に大変すごくとてもかなり申し訳ございませんが、下記、公式サイトから Docker Desktopのインストールを済ませておいてください。

[4.1]MySQLコンテナ作成

他の記事で、docker-compose.yamlを使用しているのが多いと思うんです。
いや、いいんですけどね。
単一のコンテナを生成するのに、わざわざ ねぇ、、って見てて思いました。

なので、前述の通り、単一コンテナを作成するのにわざわざ docker-compose.yaml作成して $ docker-compose up -dするのも手間なので、手っ取り早く $ docker runでサクッと作っちゃいましょうね。

$ docker run --name ws_mysql -e MYSQL_ROOT_PASSWORD=pass -e MYSQL_DATABASE=workspace -e MYSQL_USER=user -e MYSQL_PASSWORD=pass -p 3306:3306 -d mysql:latest

---
# 設定情報
- MYSQL_ROOT_PASSWORD   = pass 
- MYSQL_DATABASE        = workspace
- MYSQL_USER            = user
- MYSQL_PASSWORD        = pass

[4.1.1]ユーザーテーブル作成及びユーザーデータ追加

$ docker exec -it ws_mysql mysql -u user -ppass -D workspace -e "CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY,username VARCHAR(255) NOT NULL,password VARCHAR(255) NOT NULL,roles VARCHAR(255) DEFAULT NULL); INSERT INTO users (username, password, roles) VALUES ('username', 'password', 'USER');" --protocol=tcp

---
# 上記コマンドの分解説明
- docker exec -it ws_mysql
  - ws_mysqlコンテナに接続
- mysql -u user -ppass -D workspace
  - mysqlコマンドを使用(各オプションはコンテナ作成時に設定した情報)
- -e "CREATE TABLE users (...<省略>
  - eオプションで SQLを発行
- --protocol=tcp
  - 通信接続方式を指定

実行したコマンドで「パスワード」の指定方法間違ってない?って思った方いらっしゃいますか?
逆に「-p pass」ってすると「ERROR 1044 (42000)」って怒られるんですって。

[4.1.2]ユーザー情報が登録されているかの確認

$ docker exec -it ws_mysql mysql -u user -ppass -D workspace -e "SELECT * FROM users WHERE username = 'username' AND password = 'password';" --protocol=tcp

---
# 実行結果
mysql: [Warning] Using a password on the command line interface can be insecure.
+----+----------+----------+-------+
| id | username | password | roles |
+----+----------+----------+-------+
|  1 | username | password | USER  |
+----+----------+----------+-------+

■ 最後に

今回は、Reactと Node.jsを用いたログイン認証機能で使用する各環境構築編をご紹介しました。
Reactと Node.jsを組み合わせることで、安全か且つ効果的なログインシステムを構築することができます。

本当は、実装まで本記事内に収める予定だったのですが、思っていたよりボリュームが多くなってしまって、、
近いうちに「実装編」を作成し公開いたしますので、ご了承ください。

お疲れ様でした。

comment 📝

タイトルとURLをコピーしました