Nginx と Lua を使用した JWT 検証の概要

Nginx と Lua を使用した JWT 検証の概要

序文

データベースやその他のリソースに依存しないため、jwt 自体もステートレスです。したがって、認証サービスは Java や他の言語に基づいていません。代わりに、Lua スクリプトを使用して nginx を強化します。Lua スクリプトを使用してトークンが有効かどうかを確認します。無効な場合は、直接 401 を返します。有効な場合は、そのまま転送します。

Lua スクリプト

ここで秘密のある大きな落とし穴に遭遇しました。最初は、Java バックエンド プロジェクトからキーを直接コピーしましたが、 signature mismatch:その後、バックエンド アプリケーションが base64decode 関連のメソッドを使用していることがわかりました。Lua スクリプトにngx.decode_base64(secret)を追加してシークレットを処理し、問題を解決しました。実は、問題はまだ解決されていません。バックエンドコードをデバッグしたところ、バックエンドキーをデコードした結果が文字化けした文字列であることが判明しました。文字化けの問題を回避するために、https://www.base64encode.org/ を通じてシークレットを再生成し、ようやく問題を解決しました。
プロジェクトでこのsignature mismatch:エラーも発生した場合は、トークンの生成時にバックエンドがシークレットをデコードまたは処理するかどうかを確認し、Lua スクリプトで対応する処理を実行する必要があります。

ここに画像の説明を挿入

nignx.conf の設定

--nginx-jwt.lua


ローカル cjson = "cjson" が必要です
ローカル jwt = "resty.jwt" が必要です

--あなたの秘密
ローカルシークレット = "yoursecrethere"
--認証不要の API リスト local no_need_token_api_list = {'/api/register', '/api/login'}

ローカル関数 ignore_url (val)
    インデックスの場合、ipairs(no_need_token_api_list)の値を実行します
        (値 == val) の場合
            真を返す
        終わり
    終わり

    偽を返す
終わり

ローカル M = {}


関数 M.auth()

    ignore_url(ngx.var.request_uri)の場合
        戻る
    それ以外
    終わり
	
    -- 認証リクエストヘッダーが必要
    ローカル auth_header = ngx.var.http_Authorization

    auth_header == nilの場合
        ngx.log(ngx.WARN, "認証ヘッダーがありません")
        ngx.exit(ngx.HTTP_UNAUTHORIZED)
    終わり

    --ベアラートークンが必要
    ローカル _, _, トークン = string.find(auth_header, "Bearer%s+(.+)")

    トークン == nil の場合
        ngx.log(ngx.ERR, "トークンがありません")
        ngx.exit(ngx.HTTP_UNAUTHORIZED)
    終わり

    --decode_base64 はバックエンドと一致しています local jwt_obj = jwt:verify(ngx.decode_base64(secret), token)

    jwt_obj.verified == falseの場合
        ngx.log(ngx.ERR, "無効なトークン: ".. jwt_obj.reason)
        ngx.ステータス = ngx.HTTP_UNAUTHORIZED
        ngx.say(cjson.encode(jwt_obj))
        ngx.header.content_type = "application/json; charset=utf-8"
        ngx.exit(ngx.HTTP_UNAUTHORIZED)
    終わり

終わり

戻るM

Dockerfileの設定

ワーカープロセス 1;

イベント
{
  ワーカー接続 1024;
}
http
{

  lua_package_path "/opt/lua-resty-jwt/lib/?.lua;;";

  アップストリームバックエンド
  {
    サーバー 192.168.1.1:8080;
  }
  
  アクセスログ /logs/nginx_access.log;
  error_log /logs/nginx_error.log;

  サーバ
  {

    聞く 80;

    #バックエンド API インターフェース プロキシの場所 /api/
    {
      luaブロックによるアクセス
      {
        ローカルオブジェクト = require('nginx-jwt')
        obj.auth()
      }
      proxy_pass http://backend;
      proxy_redirect オフ;
      proxy_set_header ホスト $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
  }

}

JWT 検証に Nginx と Lua を使用する方法についてはこれで終わりです。JWT 検証に Nginx と Lua を使用する方法についての詳細は、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Golangでは、GinフレームワークがJWTにアクセスし、トークンを使用してIDを検証します。
  • ログイン認証を実現するには、Gin+トークン(JWT)認証を使用します。
  • GIN 認証ツール JWT をベースにした Golang Web 開発
  • ginフレームワークでのJWTの使用に関する定義要件と分析

<<:  MySQL データベースの集計クエリと結合クエリ操作

>>:  HTML フォーム コンポーネントのサンプル コード

推薦する

MySQL データ型の選択原則

目次小さいけれど美しいシンプルにNULL値を避けるデータタイプを選択する手順データ型の紹介1. 文字...

nginxリバースプロキシによるセッション障害の問題の解決策

同僚から助けを求められました。バックエンド システムへのログインは成功したものの、システムには正常に...

HTMLでは、div内のコンテンツが次のサイズを超えたときに自動的にスクロールバーが表示されるように設定します。

HTML ページでは、div 内のコンテンツが制限を超えた後に自動的にスクロール バーを表示する必要...

CocosCreatorを使ってシューティングゲームを作る方法

製造手順を分析します。 1. リソースを準備してシーンを構築するオンラインでリソースを探すか、私のリ...

TypeScript デコレータ定義

目次1. コンセプト1.1 定義1.2 デコレータファクトリー1.3 デコレータの組み合わせ1.4 ...

JavaScript 変数の昇格についての簡単な説明

目次序文1. どのような変数が促進されますか? 2. 可変プロモーションがあるのはなぜですか? (1...

Nginx ログ管理の概要

Nginx ログの説明アクセス ログを通じて、ユーザーの地理的起源、ジャンプ元、使用端末、特定の U...

MySQLデータテーブルの基本操作:テーブル構造の操作、フィールド操作例の分析

この記事では、テーブル構造操作やフィールド操作など、MySQL データ テーブルの基本的な操作につい...

HTML は CSS スタイルと JS スクリプトを動的に読み込みます。例

1. スクリプトを動的に読み込むウェブサイトの需要が高まるにつれて、スクリプトの需要も徐々に増加しま...

JavaScript におけるさまざまなバイナリオブジェクトの関係の詳細な説明

目次序文さまざまなオブジェクト間の関係配列バッファ型付き配列Uint8ClampedArray文字間...

VMware vSphere 6.7 (ESXI 6.7) のグラフィック インストール手順

環境: VMware VCSA 6.7 (VMware-VCSA-all-6.7.0-8169922...

nginx+php-fpm サービスの HTTP ステータス コード 502 の詳細な分析

弊社の Web プロジェクトの 1 つでは、新しい都市の増加によりトラフィックと DB 負荷が増加し...

MySQLのダウンロードとインストールのプロセスの詳細な説明

1: MySqlをダウンロードする公式サイトのダウンロードアドレス: https://dev.mys...

Linux カーネル デバイス ドライバー カーネル デバッグ テクニカル ノート集

/****************** * カーネルデバッグ技術 ****************...

HTML テーブル マークアップ チュートリアル (28): セルの境界線の色属性 BORDERCOLOR

テーブルを美しくするために、セルごとに異なる境界線の色を設定できます。基本的な構文<TD 境界...