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

推薦する

HTML マウス CSS コントロール

一般的に、マウスは上向きの斜め矢印として表示され、テキストの上に移動すると垂直線になり、ハイパーリン...

CSS3のtransform属性で実装される4つの機能

CSS3 では、transform 関数を使用して、テキストや画像の回転、拡大縮小、傾斜、移動という...

MySQL 面接の質問: ハッシュ インデックスの設定方法

B-Tree インデックスに加えて、MySQL は次のインデックスも提供します。ハッシュインデックス...

CSS の ::before と ::after 疑似要素について知らないこと

CSS には、一般的には使用されない 2 つの疑似クラス、before と :after があります...

MySql で SQL 実行プランをクエリするために explain を使用する方法

explain コマンドは、クエリ オプティマイザーがクエリの実行を決定した方法を確認する主な方法で...

Ubuntu 20.04 に Python 3 仮想環境をインストールする詳細なチュートリアル

以下はすべて仮想マシン上で実行されます1. pip3をインストールするsudo apt で pyth...

JavaScript でイベントのバブリングを防ぐ方法

注意すべき点は、イベントバブリング自体の特性上、メリットだけでなくデメリットも生じるということです。...

Docker rocketmq デプロイメントの実装例

目次準備展開プロセスRocketMQ の初体験関連する質問ヘルプドキュメント私は最近 RocketM...

CSS コンテナ背景 10 色グラデーション デモ (linear-gradient())

文法 背景: linear-gradient(direction,color-stop1,color...

Vueデータ監視の原理の詳細な説明

<本文> <div id="ルート"> <h1&...

HTML メタビューポート属性の詳細な説明

ビューポートとはモバイル ブラウザは、Web ページを仮想の「ウィンドウ」(ビューポート) に配置し...

JavaScript キャンバスはマウスの動きに合わせてボールを動かすことを実装します

この記事の例では、マウスに従ってボールを動かすjsの具体的なコードを参考までに共有しています。具体的...

Reactは感情を使ってCSSコードを書く

目次導入:感情のインストール:一般的な CSS コンポーネントを追加します。既存のコンポーネントにス...

Vueプロジェクトでよく使われる実践的なスキルのまとめ

目次序文1. マルチレベルのデータとイベントの配信には$attrsと$listenersを使用する2...

lnmp を使用して MySQL データベースのルート パスワードをリセットする 2 つの方法

最初の方法: Junge のワンクリック スクリプトを使用して、LNMP 環境で MYSQL データ...