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

推薦する

JavaScript は最大値と最小値のアルゴリズムを通じて AI 三目並べゲームを実装します

では、早速スクリーンショットを実行してみましょう。黒い駒はプレイヤーの位置、赤い駒はコンピュータの位...

HTML の大なり、小なり、スペース、引用符などでよく使用されるエスケープ コードのリスト。

表は以下のとおりです。 HTMLソースコード結果を表示説明する&lt; <未満記号また...

JQuery を放棄すべきでしょうか?

目次序文jQuery 以外の場合は何を使うのでしょうか? DOMとイベントAJAX リクエスト要約す...

Linux nslookup コマンドの使用方法の詳細な説明

[nslookup とは?] 】 nslookup コマンドは、Linux で非常によく使用されるネ...

mysql update文の実行プロセスの詳細な説明

以前、MySQL クエリ文の実行プロセスについての記事がありました。ここでは、更新文の実行プロセスを...

Office ファイルのオンライン プレビュー用の Vue サンプル コード

最近、電子アーカイブに取り組んでおり、バックエンドではファイルの Huawei Cloud OSS ...

フロントエンド JavaScript におけるリフレクションとプロキシ

目次1. 反射とは何ですか? 2. JavaScriptで反映する2.1 Reflect.get(タ...

jsは徐々に増加するデジタルアニメーションを実現します

目次背景コンテナを固定し、数字を上にスクロールすることで、スクロールホイールと同様の効果を実現します...

JavaScript ウェブページ入門開発詳細説明

パート3: ❤バックエンドデータ受信を見落とす3つの方法❤ (おすすめ集)パート 2: Web フォ...

ページ切り替え効果を作成するための純粋な CSS3 のサンプルコード

前に書いたものは複雑すぎるので、シンプルなコアにしましょう <html> <ヘッド...

Dockerを使用してDjango+MySQL8開発環境をデプロイする方法の詳細な説明

しばらく前にシステムを再インストールしましたが、バックアップを取っていなかったので、コンピューター上...

HTML と JavaScript を使用してローカル メディア (ビデオとオーディオ) ファイルを再生する方法

まず、セキュリティ上の理由から、JavaScript はローカル リソース ファイルに直接アクセスで...

CSS3で実装された6つの境界遷移効果

6つの効果実装コードhtml <h1>CSS 境界遷移</h1> <セ...

Youku 動画から 30 秒の広告コードを削除する 2 つの方法

誰もがこんな気持ちになったことがあると思います。30 秒の広告が入った動画を見ると、とても不快に感じ...

XHTML 入門チュートリアル: XHTML Web ページ画像アプリケーション

<br />適度に画像を追加すると、Web ページがより美しくなります。 画像タグ &l...