+3

🔐Node.js Express での二要素認証(2FA)

1. 二要素認証(2FA)について

1.1 二要素認証(2FA)とは?

二要素認証(2FA)は、通常のユーザ名とパスワードに基づく認証プロセスに追加のセキュリティ層を追加するものです。認証プロセス中に、ユーザーが自分の身元を証明するために、2つの異なるタイプの証拠(要素)を提供する必要があります。これらの要素には、通常、ユーザーが知っているもの(例:パスワード)と、ユーザーが持っているもの(例:携帯電話に送信されるコード)が含まれます。これら2つの要素を組み合わせることで、不正アクセスの可能性が大幅に減少します。

1.2 二要素認証を使用する理由

二要素認証は、ユーザーアカウントに追加の保護を提供し、攻撃者が不正アクセスするのを難しくします。パスワードが漏洩する可能性がある状況では特に有用であり、追加の要素が不正アクセスを防ぐのに役立ちます。Webアプリケーションで2FAを実装することで、ユーザーの信頼を高め、全体的なセキュリティを向上させることができます。

2. Node.js Express アプリケーションの設定

2.1 前提条件

このチュートリアルを進めるには、以下が必要です。

Node.js および npm がインストールされていること JavaScript および Node.js の基本的な理解 Express Webフレームワークに精通していること

2.2 新しい Express アプリケーションの作成

まず、新しい Node.js Express アプリケーションを作成しましょう。ターミナルで次のコマンドを実行します。

$ mkdir node-2fa
$ cd node-2fa
$ npm init -y
$ npm install express

ルートディレクトリに app.js ファイルを作成し、次のコードを追加します。

const express = require('express');
const app = express();

app.get('/', (req, res) => {
    res.send('こんにちは、二要素認証!');
});

const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
    console.log(`サーバーはポート ${PORT} で実行されています`);
});

次に、次のコマンドを実行してアプリケーションを開始します。

$ node app.js

ブラウザで http://localhost:3000 にアクセスして、ウェルカムメッセージを表示します。

3. 時間ベースのワンタイムパスワード(TOTP)を使用した 2FA の実装

3.1 時間ベースのワンタイムパスワード(TOTP)とは?

時間ベースのワンタイムパスワード(TOTP)は、現在の時間に基づいてワンタイムパスワードを生成するアルゴリズムです。二要素認証において、Google Authenticator のような TOTP コードを生成するモバイルアプリや他のデバイスと組み合わせて使用されることが一般的です。TOTP アルゴリズムは、RFC 6238 標準で定義されています。

3.2 必要な依存関係のインストール

TOTP コードの生成には speakeasy ライブラリを、QR コードの生成には TOTP アプリ(Google Authenticator など)の簡単な設定に qrcode ライブラリを使用します。これらの依存関係をインストールするには、次のコマンドを実行します。

$ npm install speakeasy qrcode

3.3 TOTPシークレットの生成

まず、ユーザーの TOTP シークレットを生成するルートを作成しましょう。app.js を次のコードで更新します。

const speakeasy = require('speakeasy');

app.get('/generate-secret', (req, res) => {
  const secret = speakeasy.generateSecret({ length: 20 });
  res.send(secret);
});

これで、http://localhost:3000/generate-secret にアクセスして新しい TOTP シークレットを生成できます。

3.4 TOTP シークレットの QR コードの作成

TOTP シークレットに基づいて、Google Authenticator のような TOTP アプリでスキャンできる QR コードを作成しましょう。app.js を次のコードで更新します。

const QRCode = require('qrcode');

app.get('/generate-qr', async (req, res) => {
    const secret = speakeasy.generateSecret({ length: 20 });
    const qrCodeUrl = await QRCode.toDataURL(secret.otpauth_url);

    res.send(`
      <div>
        <h2>TOTPアプリで QR コードをスキャンしてください<\h2>
        <img src="${qrCodeUrl}" alt="QR コード">
        <p><strong>シークレット:strong> ${secret.base32}<\p>
      <\div>
      `);
});

これで、http://localhost:3000/generate-qr にアクセスして、生成された QR コードと対応する TOTP シークレットを表示できます。

4. TOTPコードの確認

4.1. JSONの解析のためのミドルウェアのインストール

クライアントから TOTP コードとシークレットを JSON データとして受け取ります。JSONデータを解析するには、body-parser ミドルウェアをインストールして使用する必要があります。次のコマンドを実行してインストールします。

$ npm install body-parser

次に、app.js に次のコードを追加してミドルウェアを使用します。

const bodyParser = require('body-parser');
app.use(bodyParser.json());

4.2 TOTPコードを確認するルートの作成

次に、ユーザーが送信した TOTP コードを確認するルートを作成しましょう。app.js を次のコードで更新します。

app.post('/verify-totp', (req, res) => {
  const { token, secret } = req.body;

  const verified = speakeasy.totp.verify({
    secret: secret,
    encoding: 'base32',
    token: token,
  });

  if (verified) {
    res.send({ status: 'success', message: '二要素認証が成功しました!' });
  } else {
    res.send({ status: 'error', message: '無効なトークンです。もう一度お試しください。' });
  }
});

このルートでは、クライアントから TOTP コードとシークレットを受け取り、speakeasy.totp.verify メソッドを使用して提供されたコードが正しいかどうかをチェックします。

5. TOTP検証のテスト

TOTP 検証をテストするには、Postman や Curl などのツールを使用して、/verify-totp ルートに JSON ペイロードを含む POST リクエストを送信できます。トークンは Google Authenticator などの TOTP アプリを使用して生成し、シークレットは /generate-qr ルートから取得できます。

Curl を使用してルートをテストする方法の例は次のとおりです。

$ curl -X POST -H "Content-Type: application/json" -d '{"token": "123456", "secret": "your-secret-here"}' http://localhost:3000/verify-totp

レスポンスに成功またはエラーのステータスとメッセージが含まれていることを確認します。

まとめ

このチュートリアルでは、Node.js Express アプリケーションに二要素認証(2FA)を実装する方法について説明しました。2FA の実装には、時間ベースのワンタイムパスワード(TOTP)アルゴリズムが使用され、speakeasy および qrcode ライブラリを使用してシークレットと QR コードを生成しました。これにより、ユーザーは TOTP アプリ(Google Authenticator など)で QR コードをスキャンしてセットアップできます。アプリケーションに 2FA を統合することで、セキュリティを大幅に向上させ、ユーザーアカウントを不正アクセスから保護できます。

今後、この実装をさらに改善することができます。

  • ユーザー登録およびログイン機能の統合
  • データベースで各ユーザーの TOTP シークレットを安全に保存
  • ユーザーが TOTP アプリにアクセスできなくなった場合のリカバリーオプション(バックアップコードやメール/SMS ベースのリカバリーなど)の追加

アプリケーションのセキュリティ機能をさらに調査および強化することで、ユーザーデータを安全かつ安心して提供できる最高のユーザーエクスペリエンスを確保できます。

Mình hy vọng bạn thích bài viết này và học thêm được điều gì đó mới.

Donate mình một ly cafe hoặc 1 cây bút bi để mình có thêm động lực cho ra nhiều bài viết hay và chất lượng hơn trong tương lai nhé. À mà nếu bạn có bất kỳ câu hỏi nào thì đừng ngại comment hoặc liên hệ mình qua: Zalo - 0374226770 hoặc Facebook. Mình xin cảm ơn.

Momo: NGUYỄN ANH TUẤN - 0374226770

TPBank: NGUYỄN ANH TUẤN - 0374226770 (hoặc 01681423001)

image.png


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí