検索
ホームページウェブフロントエンドjsチュートリアルノード+トークンはユーザー検証を実行します

ノード+トークンはユーザー検証を実行します

Jun 09, 2018 am 10:37 AM
nodenodejstoken成し遂げる認証

今回はユーザー認証用のノード+トークンについてご紹介します。ユーザー認証用のノード+トークンの注意点は何ですか?実際のケースを見てみましょう。

最近、トークンベースの認証を研究し、このメカニズムを個人プロジェクトに統合しました。現在、多くの Web サイトの認証方法は、従来のセッション + Cookie からトークン検証に移行しています。従来の検証方法と比較して、トークンは優れたスケーラビリティとセキュリティを備えています。

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

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

トークンの本人確認

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

  1. 最初のリクエストを行うとき、ユーザーはアカウントとパスワードを送信します

  2. バックグラウンド検証に合格すると、時間効率の良いトークンが発行されます。生成され、このトークンがユーザーに送信されます

  3. ユーザーがトークンを取得した後、トークンはローカルに (通常は localstorage または cookie に) 保存されます

  4. 後続の各リクエストでは、このトークンがリクエスト ヘッダーに追加されますすべてを検証する必要がある すべての ID インターフェイスはトークンを使用して検証されます。トークンによって解析されたデータにユーザー ID 情報が含まれている場合、ID 検証は合格します。

従来の検証方法と比較して、トークン検証には次の利点があります:

  1. トークンベースの認証では、トークンは認証情報をセッションや Cookie に保存するのではなく、リクエスト ヘッダーを通じて送信されます。これは無国籍を意味します。 HTTP リクエストを送信できる任意の端末からサーバーにリクエストを送信できます。

  2. CSRF攻撃を回避できる

  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为插件

クライアントが身元検証を必要とするインターフェイスを要求した後、トークンは次のようになります。リクエストヘッダーに配置され、サーバーに渡されます:

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  {
  let {url = ''} = ctx;
  if(url.indexOf('/user/') > -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();
  }
});

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

  1. コマンド ライン ツールを開き、openssl を入力して開きます

  2. 秘密キーを生成します: genrsa -out rsa_private_key.pem 2048

  3. 公開キーを生成します: rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem

この記事の事例を読んだ後は、この方法を習得したと思います。 、PHP 中国語 Web サイトの他の関連記事にも注目してください。

推奨読書:

react、redux、react-reduxの使い方

selectコンポーネントを使用する場合の詳細な説明

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

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
JavaScriptフレームワーク:最新のWeb開発のパワーJavaScriptフレームワーク:最新のWeb開発のパワーMay 02, 2025 am 12:04 AM

JavaScriptフレームワークのパワーは、開発を簡素化し、ユーザーエクスペリエンスとアプリケーションのパフォーマンスを向上させることにあります。フレームワークを選択するときは、次のことを検討してください。1。プロジェクトのサイズと複雑さ、2。チームエクスペリエンス、3。エコシステムとコミュニティサポート。

JavaScript、C、およびブラウザの関係JavaScript、C、およびブラウザの関係May 01, 2025 am 12:06 AM

はじめに私はあなたがそれを奇妙に思うかもしれないことを知っています、JavaScript、C、およびブラウザは正確に何をしなければなりませんか?彼らは無関係であるように見えますが、実際、彼らは現代のウェブ開発において非常に重要な役割を果たしています。今日は、これら3つの間の密接なつながりについて説明します。この記事を通して、JavaScriptがブラウザでどのように実行されるか、ブラウザエンジンでのCの役割、およびそれらが協力してWebページのレンダリングと相互作用を駆動する方法を学びます。私たちは皆、JavaScriptとブラウザの関係を知っています。 JavaScriptは、フロントエンド開発のコア言語です。ブラウザで直接実行され、Webページが鮮明で興味深いものになります。なぜJavascrを疑問に思ったことがありますか

node.jsは、型を使用してストリーミングしますnode.jsは、型を使用してストリーミングしますApr 30, 2025 am 08:22 AM

node.jsは、主にストリームのおかげで、効率的なI/Oで優れています。 ストリームはデータを段階的に処理し、メモリの過負荷を回避します。大きなファイル、ネットワークタスク、リアルタイムアプリケーションの場合。ストリームとTypeScriptのタイプの安全性を組み合わせることで、パワーが作成されます

Python vs. JavaScript:パフォーマンスと効率の考慮事項Python vs. JavaScript:パフォーマンスと効率の考慮事項Apr 30, 2025 am 12:08 AM

PythonとJavaScriptのパフォーマンスと効率の違いは、主に以下に反映されています。1)解釈された言語として、Pythonはゆっくりと実行されますが、開発効率が高く、迅速なプロトタイプ開発に適しています。 2)JavaScriptはブラウザ内の単一のスレッドに限定されていますが、マルチスレッドおよび非同期I/Oを使用してnode.jsのパフォーマンスを改善でき、両方とも実際のプロジェクトで利点があります。

JavaScriptの起源:その実装言語の調査JavaScriptの起源:その実装言語の調査Apr 29, 2025 am 12:51 AM

JavaScriptは1995年に発信され、Brandon Ikeによって作成され、言語をCに実現しました。 2。JavaScriptのメモリ管理とパフォーマンスの最適化は、C言語に依存しています。 3. C言語のクロスプラットフォーム機能は、さまざまなオペレーティングシステムでJavaScriptを効率的に実行するのに役立ちます。

舞台裏:JavaScriptをパワーする言語は何ですか?舞台裏:JavaScriptをパワーする言語は何ですか?Apr 28, 2025 am 12:01 AM

JavaScriptはブラウザとnode.js環境で実行され、JavaScriptエンジンに依存してコードを解析および実行します。 1)解析段階で抽象的構文ツリー(AST)を生成します。 2)ASTをコンパイル段階のバイトコードまたはマシンコードに変換します。 3)実行段階でコンパイルされたコードを実行します。

PythonとJavaScriptの未来:傾向と予測PythonとJavaScriptの未来:傾向と予測Apr 27, 2025 am 12:21 AM

PythonとJavaScriptの将来の傾向には、1。Pythonが科学コンピューティングの分野での位置を統合し、AI、2。JavaScriptはWebテクノロジーの開発を促進します。どちらもそれぞれのフィールドでアプリケーションシナリオを拡大し続け、パフォーマンスをより多くのブレークスルーを行います。

Python vs. JavaScript:開発環境とツールPython vs. JavaScript:開発環境とツールApr 26, 2025 am 12:09 AM

開発環境におけるPythonとJavaScriptの両方の選択が重要です。 1)Pythonの開発環境には、Pycharm、Jupyternotebook、Anacondaが含まれます。これらは、データサイエンスと迅速なプロトタイピングに適しています。 2)JavaScriptの開発環境には、フロントエンドおよびバックエンド開発に適したnode.js、vscode、およびwebpackが含まれます。プロジェクトのニーズに応じて適切なツールを選択すると、開発効率とプロジェクトの成功率が向上する可能性があります。

See all articles

ホット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 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

WebStorm Mac版

WebStorm Mac版

便利なJavaScript開発ツール

SublimeText3 英語版

SublimeText3 英語版

推奨: Win バージョン、コードプロンプトをサポート!

EditPlus 中国語クラック版

EditPlus 中国語クラック版

サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強力な PHP 統合開発環境

AtomエディタMac版ダウンロード

AtomエディタMac版ダウンロード

最も人気のあるオープンソースエディター