ホームページ > ウェブフロントエンド > jsチュートリアル > ノードでの jwt の使用を 4 つの側面から見てみましょう

ノードでの jwt の使用を 4 つの側面から見てみましょう

青灯夜游
リリース: 2022-01-10 19:19:59
転載
2151 人が閲覧しました

nodejs で jwt を使用するにはどうすればよいですか?以下の記事ではjwtの使い方を4つの側面から紹介していきますので、ぜひ参考にしてください。

ノードでの jwt の使用を 4 つの側面から見てみましょう

はじめに: http はステートレスであるため、リクエスト応答プロセス中にユーザー ID 情報が保存および記録されないため、多くのユーザーが存在します。 . Cookie、セッション、jwt など、ユーザー ID を保存する方法を特定します。最近作成したインターフェイス サービスでは、ユーザー情報の保存と管理に jwt を使用しています。ローカル Cookie ストレージやサーバー側のセッション ストレージと比較して、jwt はより安全で、より経済的で便利になりました。この記事では、node## での jwt の提供に焦点を当てています。 # 使い方を簡単にまとめてみましょう。

#ディレクトリ

jwtの紹介
  • インストール構成
  • カプセル化方法
  • 実践演習
  • この記事では、上記の 4 つの側面から jwt の使い方を紹介します。

jwt の概要

コンセプト

JWT

正式名称は JSON Web Token で、オープン標準ですRFC 7519 は、関係者間で情報を JSON オブジェクトとして安全に転送するためのコンパクトで自己完結型の方法を定義しています。 JWT は、秘密キー、または RSA または ECDSA を使用する公開/秘密キーのペアを使用して署名でき、署名を検証できます。

コンポーネント

jwt 署名トークンは通常、Header (ヘッダー情報)、Payload (ローダー)、Signature (署名) の 3 つの部分で構成されます。例:

xxxxx.yyyyy.zzzzzz

header
  • は通常、ストレージ トークンのタイプと署名アルゴリズムです。たとえば、
{
  "alg": "HS256",
  "typ": "JWT"
}
ログイン後にコピー

Payload
  • です。
  • 一般に、ストレージステートメント、つまりユーザー情報と添付データは、登録ステートメント、パブリックステートメント、およびプライベートステートメントに分けられます。

例:

{
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true
}
ログイン後にコピー

署名
  • 署名アルゴリズムを使用してヘッダーとペイロードに署名します

例:

HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret)
ログイン後にコピー

標準の jwt 署名トークンは次のようになります

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeK KF2Q T4fwpMeJf36POk6yJV_adQssw5c

アプリケーション シナリオ

ユーザー承認アクセス
  • たとえば、ユーザーがログインした後、サーバーは jwt トークンを発行します。ユーザーがデータをリクエストするたびに、このトークンがリクエスト ヘッダーに含まれます。サーバー側で検証に合格した後にデータを取得できます。この方法ではオーバーヘッドが非常に少なく、サーバー側にストレージを必要としません。ドメイン間で使用することもできます。

情報交換
  • 当事者間で情報を暗号化して保存し、署名の内容が改ざんされていないかどうかを確認します。

セキュリティ

トークンは逆アセンブルされ、内部のヘッダーとペイロードが解析されて表示される可能性があるため、ペイロードには個人情報を保存しないようにしてください。

インストール構成

ノードで jwt を使用して操作を実行してみましょう。

npm Web サイトには多くの jwt パッケージがあり、適切だと思うものを選択できます。

Search jwt

NAME                      | DESCRIPTION          | AUTHOR          | DATE       | VERSION  | KEYWORDS
jwt                       | JSON Web Token for…  | =mattrobenolt   | 2012-05-05 | 0.2.0    |
express-jwt               | JWT authentication…  | =woloski…       | 2021-08-11 | 6.1.0    | auth authn authentication authz authorization http jwt token oauth express
jsonwebtoken              | JSON Web Token…      | =dschenkelman…  | 2019-03-18 | 8.5.1    | jwt
jwt-decode                | Decode JWT tokens,…  | =jeff.shuman…   | 2020-11-16 | 3.1.2    | jwt browser
passport-jwt              | Passport…            | =themikenichol… | 2018-03-13 | 4.0.0    | Passport Strategy JSON Web Token JWT
koa-jwt                   | Koa middleware for…  | =stiang…        | 2021-09-24 | 4.0.3    | auth authn authentication authz authorization http jwt json middleware token oauth permissions koa
jsrsasign                 | opensource free…     | =kjur           | 2021-12-01 | 10.5.1   | crypto cryptography Cipher RSA ECDSA DSA RSAPSS PKCS#1 PKCS#5 PKCS#8 private key public key CSR PKCS#10 hash function HMac ASN.1 certexpress-jwt-permissions   | Express middleware…  | =angryunicorn…  | 2021-08-18 | 1.3.6    | express middleware JWT permissions authorization token security
njwt                      | JWT Library for…     | =robertjd       | 2021-12-03 | 1.2.0    | jwt
fastify-jwt               | JWT utils for…       | =starptech…     | 2021-12-03 | 4.1.0    | jwt json token jsonwebtoken fastify
did-jwt                   | Library for Signing… | =simonas-notcat… | 2021-12-03 | 5.12.1   | 
hapi-auth-jwt2            | Hapi.js…             | =nelsonic       | 2020-09-08 | 10.2.0   | Hapi.js Authentication Auth JSON Web Tokens JWT
auth0-lock                | Auth0 Lock           | =jeff.shuman…   | 2021-11-02 | 11.31.1  | auth0 auth openid authentication passwordless browser jwt
jwks-rsa                  | Library to retrieve… | =jeff.shuman…   | 2021-10-15 | 2.0.5    | jwks rsa jwt
restify-jwt-community     | JWT authentication…  | =frbuceta       | 2021-12-05 | 1.1.21   | auth authentication authorization http jwt token oauth restify
did-jwt-vc                | Create and verify…   | =simonas-notcat… | 2021-11-23 | 2.1.8    | 
jwt-service               | A simple wrapper…    | =nfroidure      | 2021-11-01 | 8.0.0    | jwt knifecycle
angular-jwt               | Library to help you… | =jeff.shuman…   | 2019-03-20 | 0.1.11   |
@thream/socketio-jwt      | Authenticate…        | =divlo          | 2021-07-23 | 2.1.1    | socket socket.io jwt
appstore-connect-jwt-gene | [![NPM](https://nod… | =poad           | 2021-10-15 | 1.0.1    | jwt appstore
rator-core                |
ログイン後にコピー

Install jwt

個人的には、この

jsonwebtoken

は非常に優れていると思います。この記事 このパッケージを使用するだけです。

一般的な使用法

署名
署名の構文

:jwt.sign(ペイロード、secretOrPrivateKey、[オプション、コールバック])例:

// 一般签名
var jwt = require('jsonwebtoken');
var token = jwt.sign({ foo: 'bar' }, 'secret');

//  加私钥签名
var privateKey = fs.readFileSync('private.key');
var token = jwt.sign({ foo: 'bar' }, privateKey, { algorithm: 'RS256'});

// 设置过期时间
jwt.sign({
  data: 'bar'
}, 'secret', { expiresIn: 60 * 60 }); // 1h
ログイン後にコピー

Verification
検証構文

:jwt.verify(token, secretOrPublicKey, [オプション、コールバック])例:

// 一般验证
var decoded = jwt.verify(token, 'secret');
console.log(decoded.foo) // bar

// 公钥验证
var cert = fs.readFileSync('public.pem');
jwt.verify(token, cert, function(err, decoded) {
  console.log(decoded.foo) // bar
});
ログイン後にコピー

デコード
デコード構文

:jwt .decode (token [, options])例:

var decoded = jwt.decode(token, {complete: true});
console.log(decoded.header);
console.log(decoded.payload);
ログイン後にコピー

カプセル化方法

インストール構成の方法による、必要なセカンダリカプセル化に応じて、より適切な方法を選択できます。

依存パッケージと構成の紹介
  • const jwt = require("jsonwebtoken");
    const config = {
        secret: '2021123456**',
        time: 60 * 60,
    }
    ログイン後にコピー
署名
  • function create (data, time) {
      let token = jwt.sign(data, config.secret, {
        algorithm: "HS256",
        expiresIn: time || config.time,
      })
      return token;
    }
    ログイン後にコピー
検証
  • function verify (token) {
      return jwt.verify(token, config.secret, function (err, decoded) {
        if (err) {
          return {
            code: 1,
            msg: 'invalid',
            data: null,
          }
        } else {
          return {
            code: 2,
            msg: 'valid',
            data: decoded,
          }
        }
      })
    }
    ログイン後にコピー
Decoding
  • function decoded (token, complete = true) {
      return jwt.decode(token, {
        complete,
      });
    }
    ログイン後にコピー
  • 上記は比較的単純な方法ですが、それでも公開鍵と秘密鍵を使用したい場合は、上記のインストール構成を使用できます。

実践的な実践

上記のカプセル化方法を実行した後、実際に実践して、効果があるかどうかを確認できます。

  • 新建一个文件夹test,新建一个文件index.js用于存放测试案例,jwt.js用于存储调用方法。
mkdir test
cd test
npm init -y
npm i jsonwebtoken
ログイン後にコピー
  • jwt方法
// jwt.js
const jwt = require('jsonwebtoken');
const config = {
    secret: '2021123456', // 密钥
    time: 60*60, // 过期时间
}

// 创建签名令牌
function create (data, time) {
    let token = jwt.sign(data, config.secret, {
        algorithm: 'HS256',
        expiresIn: time || config.time,
    });
    return token;
}

// 验证令牌
function verify (token) {
    return jwt.verify(token, config.secret, function (err, decoded) {
      if (err) {
        return {
          code: 1,
          msg: 'invalid',
          data: null,
        }
      } else {
        return {
          code: 2,
          msg: 'valid',
          data: decoded,
        }
      }
    })
}

// 解码令牌
function decoded (token, complete = true) {
    return jwt.decode(token, {
      complete,
    });
}

const token = {
    create,
    verify,
    decoded,
}

module.exports = token;
ログイン後にコピー
  • 创建token,验证token,解码token
// index.js
const jwt = require('./jwt');

// 生成令牌
let token = jwt.create({'id': 1, 'name': 'mark'}, 60*60*2);
console.log(token); 

/*
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJpZCI6MSwibmFtZSI6Im1hcmsiLCJpYXQiOjE2MzkxMDYyNzMsImV4cCI6MTYzOTExMzQ3M30.
20O1r0NVMf-j-9RwNcgls9ja0n1rGqSKN51_cRcvpE8
*/

// 验证令牌
let verifyRes = jwt.verify(token);
console.log(verifyRes); 

/* 
{
    code: 2,
    msg: 'valid',
    data: { id: 1, name: 'mark', iat: 1639106273, exp: 1639113473 }
}
*/

// 解码令牌
let deRes = jwt.decoded(token, true);
console.log(deRes);

/*
{
  header: { alg: 'HS256', typ: 'JWT' },
  payload: { id: 1, name: 'mark', iat: 1639106273, exp: 1639113473 },
  signature: '20O1r0NVMf-j-9RwNcgls9ja0n1rGqSKN51_cRcvpE8'
}
*/
ログイン後にコピー

运行一下命令node index.js测试是否正确。

好了,以上就是jwt在node中的一些应用和实践方法!

更多node相关知识,请访问:nodejs 教程!!

以上がノードでの jwt の使用を 4 つの側面から見てみましょうの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:juejin.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート