ノード スキャフォールディングを使用してトークン検証を実装するサーバーを構築する方法

ノード スキャフォールディングを使用してトークン検証を実装するサーバーを構築する方法

コンテンツ

  • スキャフォールディングを使用してノードプロジェクトを素早く構築する
  • データベースとやり取りするためにMySQL接続プールを使用する
  • jsonwebtoken を使用したトークン認証の実装
  • 包括的な例: 導入ログインページで上記を実装する

1. ノードプロジェクトを素早く構築する

Express フレームワークを使用するとノード サーバーを効率的に開発できることは誰もが知っていますが、基礎となる構築は依然として手書きに依存しています。しかし、エクスプレスジェネレータの登場により、この問題は見事に解決されました。これは、ノードスキャフォールディングとも言える、プロジェクトの基本的な骨組みをワンクリックで生成してくれます。

1.1 プロジェクトの生成

①: まずグローバルにexpressをインストールします: npm install express -g
②: 次に express-generator をグローバルにインストールします: npm install express-generator -g
③: 次にコマンドを使用してプロジェクトを作成します: express token_learn (プロジェクト名)

1.2 エントリファイルを変更する

サーバーを手動で実行することに慣れている多くの人にとって、app.js は常に忘れられないものですが、このスケルトンのエントリ ファイルは www.js です。この時点で、app.jsコードを手動で変更してエントリファイルにすることができます。

例:

var express = require('express');
var パス = require('パス');
var cookieParser = require('cookie-parser');

定数 index = require('./routes/index');
const users = require('./routes/users');

express() は、定数です。

app.use(express.json());
app.use(express.urlencoded({extended: false}));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

app.use('/', インデックス);
app.use('/users', ユーザー);

app.listen(3000, () => console.log('サーバーは3000を実行しています'))

2. MySQLデータベースに接続する

ここでは接続プールが接続に使用されます(効率的かつ安全)

2.1 接続を作成する

①: mysqlモジュールをインストール: npm i mysql
②: プロジェクトルートディレクトリに接続プールを設定する

まず、プロジェクトのルートディレクトリにutilフォルダを作成し、そのフォルダにbdconfig.jsファイルを作成します。

bdconfig.js

定数 mysql = require('mysql');

モジュール.エクスポート = {
  mysqlパラメータ: {
    ホスト: 'localhost', //ドメイン名 ポート: '3306', //ポート ユーザー: 'root', //ユーザー名 パスワード: 'myroot', //パスワード データベース: 'nodeapi' //データベース},
  sySqlConnect(sql, sqlArr) {
    return new Promise((resolve, reject) => { // データの受信を容易にするために Promise オブジェクトで変換します const pool = mysql.createPool(this.mysqlParams);
      プール.getConnection((err, conn) => {
        もし(エラー){
          拒否(エラー)
        } それ以外 {
          conn.query(sql, sqlArr, (err, data) => { //データベースを操作するif (err) {
              拒否(エラー)
            } それ以外 {
              解決(データ)
            }
          })
          conn.release() //接続を解放する}
      })
    })
  }
}

2.2 接続の使用

使用する場合、sql(SQL文)とsqlArr(パラメータ)を渡すだけで済みます。Promise変換後、戻り値を直接使用して結果を取得できます。

3. トークン認証

Web の発展に伴い、セッション認証や Cookie 認証方式の欠点がますます顕著になってきました。このとき、トークンが誕生しました。トークンの強みは、ステートレスであることだけでなく、ドメイン間で使用できることです。

3.1 実装手順

①: まずjsonwebtokenモジュールをインストールします: npm i jsonwebtoken
②:プロジェクト内でモジュールを使用する

dbConfig が必要です。
jsonwebtoken を jwt に代入します。
const secret = 'login-rule'; // 秘密鍵ルール(カスタム)

token = async(req, res, next) => { //トークン検証ミドルウェア関数を定義する(ログイン以外のすべてのリクエストに適用される)
  (req.headers.authorization)の場合{
    const トークン = req.headers.authorization;
    const { id, username } = jwt.verify(token, secret); // トークンを復号化して検索します let sql = 'select * from test where id=?';
    sqlArr = [id]とします。
    結果 = dbConfig.sySqlConnect(sql, sqlArr); を待機します。
    結果の長さが0の場合
      res.status(200).send({ msg: 'ユーザーエラー' })
      戻る
    }
    if (ユーザー名 !== 結果[0].ユーザー名) {
      res.status(200).send({ msg: 'ユーザーエラー' })
    } それ以外 {
      次()
    }
  } それ以外 {
    res.status(200).send({ msg: '無効なリクエストヘッダー' })
  }
}

login = async(req, res) => { //ログインインターフェースを定義します(このリクエストヘッダーはトークンを運ばないので、トークン検証ミドルウェアの前に参照されます)
  { ユーザー名、パスワード } = req.body; とします。
  let sql = 'select * from test where username=?';
  sqlArr = [ユーザー名]とします。
  結果 = dbConfig.sySqlConnect(sql, sqlArr); を待機します。
  if (結果.長さ) {
    if (パスワード === 結果[0].パスワード) {
      const { id, ユーザー名 } = 結果[0];
      //トークンを暗号化してクライアントに応答します(パラメータ1: 値転送ルール、パラメータ2: 暗号化ルール、パラメータ3: 定義時間)
      const トークン = jwt.sign({ id, username }, secret, { expiresIn: 60 * 60 });
      res.status(200).send({ msg: 'ログイン成功', token: token, status: 200 });
    } それ以外 {
      res.status(200).send({ msg: 'ログインに失敗しました', status: 422 });
    }
  } それ以外 {
    res.status(200).send({ msg: 'ユーザー名が存在しません', status: 401 })
  }
}

// IDミドルウェアを検証する module.exports = {
  トークン、
  ログイン
}

③: app.jsで設定する

//app.use() の後、ルーティングの前に記述します。app.use('/users/loginjwt', token.login); //ログイン インターフェイス (トークンを検証する必要がないため、トークン ミドルウェアの前に記述します)
app.use(トークン.トークン);

4. ケース実装トークン

4.1 原則

ID が一意かつ有効であることを確認するには、ユーザーがログイン要求を送信して正常にログインするたびに、サーバーはユーザー情報 (一意) を含む暗号化されたトークン (文字列) でユーザーに応答します。この時点で、ユーザーはトークンを受信し、それを sessionStorage または localStorage (ここ) に保存します。同時に、ユーザーが別のリクエストを送信するたびに、ローカル トークンがリクエスト ヘッダーに含まれます。サーバー側のトークン検証ミドルウェアは、リクエストをインターセプトし、トークンを復号化し、ユーザー情報を取得してデータベースと比較します。情報が存在する場合は、その情報が解放されます (認証成功)。

4.2 効果のプレビュー

4.3 実装を開始する

シンプルな静的ページを書いてAjaxリクエストを実装する

ログイン.html

<!DOCTYPE html>
<html lang="ja">

<ヘッド>
  <メタ文字セット="UTF-8">
  <meta name="viewport" content="width=デバイス幅、初期スケール=1.0">
  <script src="../javascripts/jquery.min.js"></script>
  <title>ドキュメント</title>
</head>

<本文>
  <フォームid="ログインフォーム">
    <input type="text" name="ユーザー名">
    <input type="password" name="パスワード">
    <input type="submit" value="ログイン">
  </フォーム>
  <スクリプト>
    $(関数() {
      $('#loginform').on('送信', 関数() {
        const フォームデータ = $(this).serialize()
        $.ajax({
          URL: '/users/loginjwt',
          タイプ: '投稿'、
          データ: フォームデータ、
          成功(res) {
            (res.status === 200)の場合{
              window.sessionStorage.setItem('token', res.token);
              location.href = '/user/index.html'
            }
          }
        })
        偽を返す
      })
    })
  </スクリプト>
</本文>
</html>

インデックス.html

<スクリプト>
  セッションストレージのgetItem('トークン')の場合{
    location.href = '/user/login.html'
  }
</スクリプト>
<!DOCTYPE html>
<html lang="ja">

<ヘッド>
  <メタ文字セット="UTF-8">
  <meta name="viewport" content="width=デバイス幅、初期スケール=1.0">
  <script src="../javascripts/jquery.min.js"></script>
  <title>ドキュメント</title>
</head>

<本文>
  <h1>ようこそインデックス</h1>
  <a href="javascript:;" rel="external nofollow" >ログアウト</a>
  <スクリプト>
    $(関数() {
      $.ajaxSetup({
        // リクエストを送信する前にトリガーされます beforeSend(xhr) {
          // ここでカスタムリクエストヘッダーを設定します xhr.setRequestHeader('authorization', sessionStorage.getItem('token'))
        }
      })
      $.ajax({
        URL: '/users',
        成功(res) {
          コンソールログ(res);
        }
      })
      $('a').on('クリック', 関数() {
        セッションストレージをクリアします。
        location.href = '/user/login.html'
      })
    })
  </スクリプト>
</本文>
</html>

4.4 注記

ローカルトークンの検証(存在するかどうか)は、ページの上部に記述する必要があることに注意してください(ページが読み込まれてユーザーリストリクエストが再度送信されるのを防ぐため)。
ajax リクエスト ヘッダーを 1 つずつ追加するのは本当に面倒です。ここでは、$ajaxSetup メソッドを使用して、ajax のデフォルト構成を変更します。設定後、その下に記述されたすべての Ajax リクエストにリクエスト ヘッダーが含まれるようになります。

ノード スキャフォールディングを使用してサーバーを構築し、トークン検証を実装する方法についての記事はこれで終わりです。ノード トークン検証に関するより関連性の高いコンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Nodeログイン権限検証トークン検証の実装方法の例
  • ノードでJWTを使用してトークンを発行および検証する方法
  • Nodeはトークンベースの認証を実装する
  • ログイン認証を実装するための Node.js+ca​​ptchapng+jsonwebtoken の例

<<:  Linux インストール MySQL5.6.24 使用手順

>>:  MySQLの日付文字列タイムスタンプ変換の詳細な説明

推薦する

Web 開発の面接と筆記試験に必須の知識(必読)

HTML のインライン要素とブロックレベル要素の違い:標準的なドキュメント フローでは、ブロック ...

Linux ドライバ開発でよく使われる関数 copy_from_user open read write の詳細な説明

目次Linux ドライバーの共通機能 (copy_from_user open read write...

Vue プロジェクトで Baidu Map API を使用する方法

目次1. Baidu Map Open Platformにアカウントを登録してログインする2. 必要...

Vue elementUI フォームのネストされたテーブルと各行の検証の詳細な説明

目次エフェクト表示コードリンクキーコード表形式データコンポーネントのネスト検証方法リセット方法完全な...

Vue.jsはElement-uiを使用してナビゲーションメニューを実装します

この記事では、Element-uiを使用してvue.jsでナビゲーションメニューを実装するための具体...

HTML テーブルの空白セル補完を実装する方法

私が初めて Web 開発を独学で学んだ頃は、いわゆる DIV/CSS レイアウトはなく、テーブル レ...

meta name="" content="の機能の詳細な説明

1. 文法: <meta name="名前" content="...

Dockerがプライベート倉庫Harborを構築する手順

港Harborは、エンタープライズレベルのプライベートDockerイメージリポジトリを構築するための...

MySQL の「特殊キーが長すぎます」の解決策

目次解決策1解決策2テーブルを作成するときに、興味深い問題に遭遇しました。「指定されたキーが長すぎま...

HTML テーブルタグチュートリアル (33): セルの垂直配置属性 VALIGN

垂直方向では、セルの配置を上、中央、下に設定できます。基本的な構文<TD VLIGN=&quo...

MySQL 10進数符号なし更新負数を0に変換

今日、インターフェースの同時実行の問題を検証したところ、これまでredisで解決していた同時実行のプ...

MySQL 内部結合の使用例 (必読)

文法規則 列名を選択 テーブル名1から INNER JOIN テーブル名2 ON テーブル名1.列名...

MYSQLクエリデータの結果に自動的に番号を付ける方法

序文実際、クエリ中に結果に番号が付けられるこのような状況に遭遇したことは一度もありません。同僚が転職...

ツールベースのウェブサイトの考察: ツールベースのウェブサイトの定義と典型的なケース分析 (写真とテキスト)

ツール型ウェブサイトについて、まず疑問に思うのは、無数のオンラインウェブサイトの中で、どのようなウェ...

js 配列エントリ() 反復メソッドを取得する

目次1.entires() メソッドの詳細な構文2.entires() メソッドの一般的な使用法と注...