RSA署名付きJWT


皆さんこんにちは!
この記事では、RSAキーでJSON Webトークンに署名する方法を学びます.
始めましょう!

プロジェクトの初期化


まず第一に、私はプロジェクトフォルダを作成するつもりです.次に、jsonwebtokenパッケージをインストールします.
cd path/to/your/workspace
# Create project folder
mkdir jwt-rsa
# Change directory
cd jwt-rsa
npm init -y
# Install JWT
npm install --save jsonwebtoken

RSAトークンを生成する


では、公開鍵と秘密鍵を生成しましょう.あなたがキー長を増やすならば、トークン長も増加します.これはHTTPリクエスト本体サイズが増加することを意味します.しかし、それは我々がどのようなペイロードの種類に依存します.
# Create a folder named keys
mkdir keys
# Minimum RSA key length is 1024 bits
# Maximum RSA key length is 16384 bits 
# Don't add passphrase
ssh-keygen -t rsa -b 1024 -m PEM -f keys/rsa.key
# Write public key to keys/rsa.key.pub file
openssl rsa -in keys/rsa.key -pubout -outform PEM -out keys/rsa.key.pub

また、パブリック/プライベートキーペアを取得するには、このonline toolを使用することができます.

フォルダ構造



signtoken ()およびverifytoken ()メソッドの実装


注意してください、私はissueraudienceまたはexpiresInなどのようなすべてのJWTのオプションを使用するつもりはない.algorithmを除く
これは、我々が同期的にトークンに署名する方法です.この関数は、JSON Webトークンを文字列で返します.
  • jwt.sign(payload, secretOrPrivateKey, options)
  • 日本気象協会js

  • signToken() :ペイロードオブジェクトをパラメータとして受け取り、トークンとしてトークンを返します.
  • verifyToken()はパラメータとしてトークンを受け取り、署名したペイロードを返します.
  • //* jwt.js
    const fs = require('fs')
    const path = require('path')
    const jwt = require('jsonwebtoken')
    
    const privateKey = fs.readFileSync(path.join(__dirname, 'keys', 'rsa.key'), 'utf8')
    const publicKey = fs.readFileSync(path.join(__dirname, 'keys', 'rsa.key.pub'), 'utf8')
    
    
    module.exports = {
    
        signToken: (payload) => {
            try {
                return jwt.sign(payload, privateKey, { algorithm: 'RS256'});
            } catch (err) {
                /*
                    TODO throw http 500 here 
                    ! Dont send JWT error messages to the client
                    ! Let exception handler handles this error
                */
                throw err
            }
        },
    
        verifyToken: (token) => {
            try {
                return jwt.verify(token, publicKey, { algorithm: 'RS256'});
            } catch (err) {
                /*
                    TODO throw http 500 here 
                    ! Dont send JWT error messages to the client
                    ! Let exception handler handles this error
                */
                throw err
            }
        }
    
    }
    
    

    ペイロードに署名し、トークンを確認する


    //* app.js
    const { signToken, verifyToken } = require('./jwt')
    
    const token = signToken({ userId: 1 })
    console.log({ token })
    
    const verified = verifyToken(token)
    console.log({ verified }) 
    

    何が起こったか見てみましょう


    アプリを実行します.js
    node app.js
    
    そして、あなたはこのように何かを見ます

    Github repository
    読書に感謝します.