ホームページ ウェブフロントエンド jsチュートリアル ノードはトークンベースの認証を実装します

ノードはトークンベースの認証を実装します

Apr 10, 2018 pm 03:05 PM
node token 身元

この記事では主にトークンベースの認証を実装するためのノードを紹介します。必要な友達は参考にしてください。私は最近トークンベースの認証を研究し、このメカニズムを私の個人プロジェクトに統合しました。現在、多くの Web サイトの認証方法は、従来のセッション + Cookie からトークン検証に移行しています。従来の検証方法と比較して、トークンは優れたスケーラビリティとセキュリティを備えています。

従来のセッション + Cookie 認証

HTTP はステートレスであるため、ユーザーの ID を記録しません。ユーザーがアカウントとパスワードをサーバーに送信した後、バックグラウンドで検証は通過しますが、ステータスは記録されないため、次のユーザーのリクエストでは引き続き ID を検証する必要があります。この問題を解決するには、サーバー側でユーザーの ID を含むレコード (セッション) を生成し、このレコードをユーザーに送信して、ユーザーのローカル領域 (つまり Cookie) に保存する必要があります。 。次に、ユーザーのリクエストによってこの Cookie が送信され、クライアントの Cookie とサーバーのセッションが一致する場合、ユーザーの ID 認証が成功したことになります。

トークンの本人確認

プロセスは大まかに次のとおりです:

    最初のリクエストを行うとき、ユーザーはアカウントとパスワードを送信します
  1. バックグラウンド検証に合格すると、時間効率の良いトークンが発行されます。生成され、このトークンがユーザーに送信されます
  2. ユーザーがトークンを取得した後、トークンはローカルに (通常は localstorage または cookie に) 保存されます
  3. 後続の各リクエストでは、このトークンがリクエスト ヘッダーに追加されますすべてを検証する必要がある すべての ID インターフェイスはトークンを使用して検証されます。トークンによって解析されたデータにユーザー ID 情報が含まれている場合、ID 検証はパスされます。
  4. 従来の検証方法と比較して、トークン検証には次の利点があります:

    トークンベースの認証では、トークンは認証情報をセッションや Cookie に保存するのではなく、リクエスト ヘッダーを通じて送信されます。これは無国籍を意味します。 HTTP リクエストを送信できる任意の端末からサーバーにリクエストを送信できます。
  1. CSRF攻撃を回避できる
  2. アプリケーションでセッションが読み取り、書き込み、または削除されるとき、少なくとも初回は、オペレーティング システムの一時フォルダーでファイル操作が発生します。複数のサーバーがあり、最初のサービスでセッションが作成されると想定します。リクエストを再度送信し、そのリクエストが別のサーバーに到達すると、セッション情報が存在せず、「認証されていない」応答が返されます。この問題はスティッキー セッションで解決できます。しかし、トークンベースの認証では、この問題は自然に解決されます。サーバーに送信されるすべてのリクエストでリクエスト トークンがインターセプトされるため、スティッキー セッションの問題は発生しません。
  3. 以下は、node+jwt (jwtチュートリアル)を使用して簡単なトークンID検証を構築する方法の紹介です

ユーザーが初めてログインするときに、アカウントとパスワードをサーバーに送信します、サーバー検証に合格し、対応するトークンを生成します。コードは次のとおりです:

const fs = require('fs');
const path = require('path');
const jwt = require('jsonwebtoken');
//生成token的方法
function generateToken(data){
  let created = Math.floor(Date.now() / 1000);
  let cert = fs.readFileSync(path.join(__dirname, '../config/pri.pem'));//私钥
  let token = jwt.sign({
    data,
    exp: created + 3600 * 24
  }, cert, {algorithm: 'RS256'});
  return token;
}

//登录接口
router.post('/oa/login', async (ctx, next) => {
  let data = ctx.request.body;
  let {name, password} = data;
  let sql = 'SELECT uid FROM t_user WHERE name=? and password=? and is_delete=0', value = [name, md5(password)];
  await db.query(sql, value).then(res => {
    if (res && res.length > 0) {
      let val = res[0];
      let uid = val['uid'];
      let token = generateToken({uid});
      ctx.body = {
        ...Tips[0], data: {token}
      }
    } else {
      ctx.body = Tips[1006];
    }
  }).catch(e => {
    ctx.body = Tips[1002];
  });

});
ログイン後にコピー

ユーザーは検証を通じて取得したトークンをローカルに保存します:

store.set('loginedtoken',token);//store为插件
ログイン後にコピー

クライアントがインターフェースをリクエストした後ID 検証が必要な場合、トークンが配置されます。 リクエスト ヘッダーがサーバーに渡されます:

service.interceptors.request.use(config => {
  let params = config.params || {};
  let loginedtoken = store.get('loginedtoken');
  let time = Date.now();
  let {headers} = config;
  headers = {...headers,loginedtoken};
  params = {...params,_:time};
  config = {...config,params,headers};
  return config;
}, error => {
  Promise.reject(error);
})
ログイン後にコピー

サーバーはトークンをインターセプトし、ログインを必要とするすべてのインターフェイスの有効性を検証します。

function verifyToken(token){
  let cert = fs.readFileSync(path.join(__dirname, '../config/pub.pem'));//公钥
  try{
    let result = jwt.verify(token, cert, {algorithms: ['RS256']}) || {};
    let {exp = 0} = result,current = Math.floor(Date.now()/1000);
    if(current <= exp){
      res = result.data || {};
    }
  }catch(e){

  }
  return res;

}

app.use(async(ctx, next) => {
  let {url = &#39;&#39;} = ctx;
  if(url.indexOf(&#39;/user/&#39;) > -1){//需要校验登录态
    let header = ctx.request.header;
    let {loginedtoken} = header;
    if (loginedtoken) {
      let result = verifyToken(loginedtoken);
      let {uid} = result;
      if(uid){
        ctx.state = {uid};
        await next();
      }else{
        return ctx.body = Tips[1005];
      }
    } else {
      return ctx.body = Tips[1005];
    }
  }else{
    await next();
  }
});
ログイン後にコピー

この例で使用されている公開鍵と秘密鍵は、自分で生成できます。 操作は次のとおりです。

    コマンドラインツールを開き、openssl と入力して、openssl を開きます。秘密鍵: genrsa -out rsa_private_key .pem 2048
  1. 公開鍵の生成: rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem
  2. ここをクリックしてノードのバックエンドコードを表示します

  3. ここをクリックしてくださいフロントエンド コードを表示する

関連する推奨事項:
Node.js モジュール システム

node では、js を実行するプロセス分析について説明します


以上がノードはトークンベースの認証を実装しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

ログイントークンが無効な場合の対処方法 ログイントークンが無効な場合の対処方法 Sep 14, 2023 am 11:33 AM

無効なログイン トークンの解決策には、トークンの有効期限が切れているかどうかの確認、トークンが正しいかどうかの確認、トークンが改ざんされているかどうかの確認、トークンがユーザーと一致するかどうかの確認、キャッシュまたは Cookie のクリア、ネットワーク接続とサーバーのステータスの確認が含まれます。 、再度ログインするか、新しいトークンをリクエストしてください。テクニカル サポートや開発者などにお問い合わせください。詳細な紹介: 1. トークンの有効期限が切れていないか確認する 通常、ログイントークンには有効期限が設定されており、有効期限を過ぎると無効となります。

nvmでノードを削除する方法 nvmでノードを削除する方法 Dec 29, 2022 am 10:07 AM

nvm でノードを削除する方法: 1. 「nvm-setup.zip」をダウンロードして C ドライブにインストールします; 2. 「nvm -v」コマンドで環境変数を構成し、バージョン番号を確認します; 3. 「nvm」を使用しますinstall" コマンド ノードのインストール; 4. "nvm uninstall" コマンドでインストールしたノードを削除します。

ログイントークンが無効な場合の解決方法 ログイントークンが無効な場合の解決方法 Sep 14, 2023 am 10:57 AM

無効なログイン トークンの問題は、ネットワーク接続の確認、トークンの有効期間の確認、キャッシュと Cookie のクリア、ログイン ステータスの確認、アプリケーション開発者への連絡、アカウントのセキュリティの強化によって解決できます。詳細な導入: 1. ネットワーク接続を確認し、ネットワークに再接続するか、ネットワーク環境を変更します。 2. トークンの有効期間を確認し、新しいトークンを取得するか、アプリケーションの開発者に問い合わせます。 3. キャッシュと Cookie をクリアし、ブラウザをクリアします。キャッシュと Cookie を削除してから、アプリケーションに再度ログインします; 4. ログイン状態を確認します。

Express を使用してノード プロジェクトでファイルのアップロードを処理する方法 Express を使用してノード プロジェクトでファイルのアップロードを処理する方法 Mar 28, 2023 pm 07:28 PM

ファイルのアップロードをどのように処理するか?次の記事では、Express を使用してノード プロジェクトでファイルのアップロードを処理する方法を紹介します。

Redis にユーザー トークンを保存する際の問題を解決する方法 Redis にユーザー トークンを保存する際の問題を解決する方法 May 31, 2023 am 08:06 AM

Redis はユーザー トークンを保存します。電子商取引と同様のシステムを設計する場合、共通の要件は、各ページにログイン ユーザー情報を保持する必要があることです。一般的な解決策としては、Cookie を使用して保存する方法と、JWT を使用して保存する方法の 2 つがありますが、システムで Redis キャッシュが使用されている場合は、Redis にユーザー トークンをキャッシュする 3 番目の解決策もあります。ログイン時にトークンを生成して Redis に保存 //トークン オブジェクトを生成して Redis に保存 redisTemplate.opsForHash().put("token","user",user)

PIノードティーチング:PIノードとは何ですか? PIノードをインストールしてセットアップする方法は? PIノードティーチング:PIノードとは何ですか? PIノードをインストールしてセットアップする方法は? Mar 05, 2025 pm 05:57 PM

ピン張りのノードの詳細な説明とインストールガイドこの記事では、ピネットワークのエコシステムを詳細に紹介します - PIノードは、ピン系生態系における重要な役割であり、設置と構成の完全な手順を提供します。 Pinetworkブロックチェーンテストネットワークの発売後、PIノードは多くの先駆者の重要な部分になり、テストに積極的に参加し、今後のメインネットワークリリースの準備をしています。まだピン張りのものがわからない場合は、ピコインとは何かを参照してください。リストの価格はいくらですか? PIの使用、マイニング、セキュリティ分析。パインワークとは何ですか?ピン競技プロジェクトは2019年に開始され、独占的な暗号通貨PIコインを所有しています。このプロジェクトは、誰もが参加できるものを作成することを目指しています

Nodeのプロセス管理ツール「pm2」を徹底分析 Nodeのプロセス管理ツール「pm2」を徹底分析 Apr 03, 2023 pm 06:02 PM

この記事では、Node のプロセス管理ツール「pm2」について説明し、pm2 が必要な理由、pm2 のインストール方法と使用方法について説明します。皆様のお役に立てれば幸いです。

pkg を使用して Node.js プロジェクトを実行可能ファイルにパッケージ化する方法について説明します。 pkg を使用して Node.js プロジェクトを実行可能ファイルにパッケージ化する方法について説明します。 Dec 02, 2022 pm 09:06 PM

Nodejs実行可能ファイルをpkgでパッケージ化するにはどうすればよいですか?次の記事では、pkg を使用して Node プロジェクトを実行可能ファイルにパッケージ化する方法を紹介します。

See all articles