コンテンツ
1. ノードプロジェクトを素早く構築するExpress フレームワークを使用するとノード サーバーを効率的に開発できることは誰もが知っていますが、基礎となる構築は依然として手書きに依存しています。しかし、エクスプレスジェネレータの登場により、この問題は見事に解決されました。これは、ノードスキャフォールディングとも言える、プロジェクトの基本的な骨組みをワンクリックで生成してくれます。 1.1 プロジェクトの生成①: まずグローバルにexpressをインストールします: npm install express -g 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 注記ローカルトークンの検証(存在するかどうか)は、ページの上部に記述する必要があることに注意してください(ページが読み込まれてユーザーリストリクエストが再度送信されるのを防ぐため)。 ノード スキャフォールディングを使用してサーバーを構築し、トークン検証を実装する方法についての記事はこれで終わりです。ノード トークン検証に関するより関連性の高いコンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
<<: Linux インストール MySQL5.6.24 使用手順
>>: MySQLの日付文字列タイムスタンプ変換の詳細な説明
最近、プロジェクトではラベルやボタンなどの断片的な画像をたくさん使用する必要があります。また、CSS...
操作前に必ずお読みください:注意:管理に rancher を使用する場合は、k8s クラスターが構築...
Linux サーバーに GRUB をインストールする方法クラウド移行ツールを使用して、CentOS ...
この記事では、例を使用して MySQL のロック メカニズムと使用方法を説明します。ご参考までに、詳...
目次Tomcat ダウンロードチュートリアルTomcat インストールチュートリアルTomcat の...
目次ステップ1: インストールステップ2: 引用ステップ3: 使用Webプロジェクトでは、データを読...
目次コンポーネント通信の概要コンテンツ3つの方法まとめコンポーネントコミュニケーション - 父から息...
最近の問題としては、次のような現象があります。システムには、docker run コマンドを継続的に...
フォームのフロントエンド レイアウトでは、テキスト ボックスのプロンプト テキストを両端に揃える必要...
Linux には、2 種類のファイル接続があります。1 つは Windows のショートカットに似て...
今日は、ローカルの Docker プロジェクト イメージを dockerhub に公開する方法を紹介...
目次1. jsメモリ2. 譲渡3. 浅いコピー4. ディープコピー序文:以下の記事を読む前に、記憶に...
起動していたDockerコンテナはメモリを使い果たした状態になっており、再起動せずにコンテナのメモリ...
<meta http-equiv="X-UA-compatible" co...
1. Dockerコンテナ間の相互接続Docker は現在、軽量の仮想化ソリューションとなっています...