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 フォーム コンポーネントのサンプル コード

推薦する

CSS を使用して物流の進行状況のスタイルを実装するためのサンプルコード

効果: CSS スタイル: <スタイル タイプ="text/css">...

vue3.0 で要素を使用するための完全な手順

序文: vue3.0の要素フレームワークを使用します。要素はvue2.0をサポートしており、vue3...

Dockerはポートを介してコンテナに接続します

Dockerコンテナ接続1. ネットワークポートマッピングPythonアプリケーション用のコンテナを...

MySQL での正規表現置換のための replace と regexp の使用法の分析

この記事では、例を使用して、replace と regexp を使用して MySQL で正規表現を置...

HTML テーブルのオーバーフローの解決方法

テーブルが広い場合は、あふれてしまう可能性があります。たとえば、左と右の 2 つの div がありま...

初心者向けのHTMLタグネストルールの詳細なまとめ

最近、HTML を再度学習しており、これは HTML に対する新たな理解と言えます。これを過小評価し...

Vueコンポーネントの7つの通信方法についての深い理解

目次1. props/$emit導入コードサンプル2.Vスロット導入コードサンプル3.$refs/ ...

Vue でのキープアライブコンポーネントの使用例

問題の説明(キープアライブとは何か)キープアライブ 名前の通り、アクティブな状態を維持します。誰が活...

JavaScript関数の詳細な紹介

任意の数のステートメントを関数を通じてカプセル化することができ、いつでもどこでも呼び出して実行できま...

スクリプトを使用して、ワンクリックでDockerイメージをパッケージ化してアップロードします。

著者は1年以上マイクロフロントエンドプロジェクトに取り組んできました。チームは10個のマイクロアプリ...

CentOS7 64でのMySQL5.6.40の詳細なインストール手順

CentOS7 64でのMySQL5.6.40のインストール手順1) 以前にインストールしたMySQ...

JavaScript進捗管理の詳しい説明

目次序文質問原理テスト序文プログラムを作成するときに、読み込みの進行状況やアップロードの進行状況など...

Vueシングルページアプリケーションの事前レンダリング方法の例

目次序文vue-cli 2.0 バージョンvue-cli 3.0 バージョン要約する序文vue-cl...

Alibaba Cloud Server Linux システムは Tomcat を構築して Web プロジェクトを展開します

私は全体のプロセスを 4 つのステップに分けます。 JDKをダウンロードしてインストールするTomc...