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のインストールとログインの詳細な説明

LinuxにMySQLがすでにインストールされているかどうかを確認する sudo service m...

MySQL 8.0.11 のインストールと設定方法のグラフィックチュートリアル

MySQL 8.0のインストールと設定方法は参考までに。具体的な内容は以下のとおりです。ダウンロード...

MySQL テーブルの追加、削除、変更、クエリの基本チュートリアル

1. 作成する [テーブル名] (フィールド1、フィールド2、...) 値 (値1、値2、...) ...

Linux に MySQL をインストールする方法 (yum とソース コードのコンパイル)

Linux に MySQL をインストールするには、yum インストールとソース コード コンパイ...

CSS3 で半透明の背景画像と不透明なコンテンツを実現する方法の例

以前のブログのログインページを作成していたときに、この問題に遭遇しました。突然、透明な背景画像と不透...

MySQL テーブルの断片化を解消し、スペースを再利用する方法

目次MySQL テーブルの断片化の原因行の断片化行内断片化空き領域の断片化MySQL で極度に断片化...

Nginx をインストールして複数のドメイン名を設定する方法

Nginx のインストールCentOS 6.x yum にはデフォルトで nginx ソフトウェア ...

vue3.0共通コンポーネントの自動インポート方法の例

1. 前提条件インポートには require.context メソッドを使用します。vite で作成...

美しいチェックボックススタイル(複数選択ボックス)はIE8/9/10、FFなどと完全に互換性があります。

恥ずかしながら、このようなよく使われるチェックボックスのスタイルを変更するために、Baidu で長い...

Docker を使用した Hadoop クラスターのデプロイに関する詳細なチュートリアル

最近、社内に Hadoop テスト クラスターを構築したいので、docker を使用して Hadoo...

PXEを使用してLinuxシステムを自動的に展開する方法

目次背景DHCPの設定DHCP ファイル (動的ホスト構成プロトコル) の編集tftp 設定sysl...

Linux で txt を mysql にインポートする方法

序文昨日、小さなプロジェクトを書いていたときに、txt ドキュメントのデータを mysql データベ...

ウェブサイトのハイパーリンクを開く方法に関する議論

新しいウィンドウが開きます。 利点: ユーザーがリンクをクリックしても、現在閲覧しているコンテンツは...

Linux でのスケジュールされたタスクと遅延タスクの詳細な説明

で+ 時間 17:23に at> touch /mnt/file{1..9} ##アクションを...

Docker イメージの最適化 (1.16GB から 22.4MB)

目次最適化の第一歩: 軽量ベースイメージの使用第2段階の最適化:多段階構築Docker は、ソフトウ...