使用Openrestyビルド認証ゲートウェイ

[入力]使用Openrestyは認証ゲートウェイを構築

lwhile
言葉の0.5092017.10.07夜04時00分03秒数​​は4112 1330を読みます

モノマーの応用、我々は認証ロジックが特に容易単純かつ効率的に、1つのアプリケーションで具現化するだけでなく、、+セッション、またはJSONウェブトークンをクッキーすることができます。

しかし、より多くの消防サービスとして、近年の傾向解体のための単一のアプリケーションとなっている今、多くの以前に存在しない単一のアプリケーションの問題(私はこれは必然的な傾向だと思うが、我々はどのように人間社会に機能して考える)、およびこのようなシステムの認証システムとして、第1障害物の間の点、。

各サービスのうちリッピングした場合、の農業の理想主義的な追求の魂のためのコード(認証がある書き込みコードにはいくつかのプログラマーである)の認証を行う必要があり、それは絶対に容認できない。あなたが言った認証コードのコピー再書き込みなしなし.NO、そうではないだけのアーキテクチャから抜け出すには不快に見ていないように、私はコードの腐った臭いを感じたが、遅かれ早かれ間違って行きます。

分割単一のアプリケーションサービスは非常に一般的である後、私たちは彼らの祖先の下の単語の要約をリコールする助けを問題を解決認定:「コンピュータサイエンスのあらゆる問題は間接の別の層によって解決することができ、」我々は、すべての前にサービスを追加することができます層の認証サービス。

 
Paste_Image.png

この層は、ユーザー要求の合計エントリとして認証サービスを参照してくださいApacheやnginxの学生が自然に彼らの考えと経験を持っているために使用される。機能認証モジュールは、これらのnginxのまたはApache Webサーバーに統合することができた場合、それはより完璧ではないでしょう?

この記事の主人公:Openresty、あなたは簡単に私たちを助け、すぐにこれが作られた完全であるアイデアを得ることができます。チュン(Githubのは)あなたはそれが最も一般的に使用されるパッケージnginxの+モジュールと見られますが、Openrestyできるプロジェクトを後援しました。重要な特徴はOpenresty、nginxの年に統合され、上述した認証サービスを使用する方法について説明し、我々は次の記事を開始します、LuaのWebフレームワークは、nginxの中で達成することができます達成するためのロジックを使用することができるということです。

インストール

Openrestyの2つの方法でインストールされ、一つは公式が提供するコンパイル済みのパッケージを使用してコンパイルしてインストールしたソースコードを使用することです:
特別の公式ウェブサイトを参照してインストールマニュアル

こんにちは世界

あなたはOpenrestyインストール場所を変更していない場合は、デフォルトではデモ/使用/ローカルの下に/ openrestyディレクトリにインストールされます。私たちは今、こんにちは世界レベルを書いてみることができます。

Openrestyのための作業ディレクトリを作成し、プロファイルを作成します。

ます。mkdir〜/ openresty_work
CD〜/ openresty_workの
タッチnginx.conf

次に、設定nginx.confにルーティングルール

worker_processes 1;
error_log logs/error.log; events { worker_connections 1024; } http { server { listen 8080; location /hello { default_type text/html; content_by_lua_block { ngx.say("Hello Openresty.") } } } } 

命令が呼び出され介しcontent_by_lua_block命令以上のような構成に比べて、通常とnginxの構成ファイルが、それは、アクセス経路、意志出力対応するコンテンツまでの時間である。このディレクティブはOpenrestyあるLuaNginxModuleは、機能モジュールを提供します要求が入ってきたときに、nginxのは、出力の内容は、LUAが提供する、LUA仮想マシンを起動します。

私たちは、使用できるcontent_by_lua_fileコマンドの置換をcontent_by_lua_block、関連するコードは、LUAファイルに書き込まれます。

location /hello {
            content_by_lua_file lua/hello.lua;
        }

--- hello.lua
ngx.say("Hello Openresty.") 

上記寝具を使用して、我々は、当社認定のサービスを構築するために始めることができる認証方法が使用してJWT

Openrestyリクエストのライフサイクルは4つの段階に分かれています。

 
Paste_Image.png

当社認定のサービスはリライト/アクセスフェーズ、第2フェーズでマウントされます。

次に、ライブラリを使用する必要があるの準備:
Luaの-Resty-JWTを
する、ファイルと設定lua_package_pathフォルダにクローンhello.luaのダウン後に:

lua_package_path "/root/openresty_work/lua/?.lua;/root/openresty_work/lua/lua-resty-jwt/lib/?.lua;;";

構造上の考えは、単純に、ユーザに配布されるJWTトークンのアイデンティティを検証、ログイン要求をユーザーに提供することである。次に、ユーザのニーズがOpenrestyを入力するように要求した後に、ヘッダ内のトークンに追加認定インターフェースにアクセスするLUAから抽出されたトークン認証。

nginxの設定ファイル

server {
                listen 8080;
                location /hello {
                        content_by_lua_file lua/hello.lua;
                }
                location /login {
                        content_by_lua_file lua/sign.lua;
                }
                location /service1 {
                        access_by_lua_file lua/verify.lua;
                        # 需要反向代理在这配置
                }
                location /service {
                        access_by_lua_file lua/verify.lua;
                        # ...
                }
        }

以下は、関連のluaファイル構成です
↓sign.lua:

local jwt = require 'resty.jwt'

-- 只允许POST请求
if ngx.req.get_method() ~= 'POST' then ngx.status = 405 ngx.say("Mehtod Not Allow") return end -- 获取请求body ngx.req.read_body() local body_raw = ngx.req.get_body_data() local body_json = cjson.decode(body_raw) local username = body_json['username'] local password = body_json['password'] if not username or not password then ngx.log(ngx.ERR, username, password) ngx.status = 400 ngx.say('无法获取账号或者密码') return end -- 验证账号和密码是否正确,如果验证失败则做如下处理 if not this_is_a_auth_method(username, password) then ngx.status = 401 ngx.say('认证失败') return end 

↓verify.lua:

local jwt = require 'resty.jwt'

-- 从请求中提取header并从header从获取token字段
local headers = ngx.req.get_headers()
local token = headers['token']

-- 检查token是否存在
if not token then 
    ngx.status = 400
    ngx.say('无法获取token')
    return 
end 

-- 验证token
local jwt_obj = jwt:verify(vars.jwt_salt(), token)
if not jwt_obj['verified'] then 
    ngx.status = 401
    ngx.say('无效的token')
    return 
end 

この時点で、プロトタイプがOpenresty認定ゲートウェイが出ている使用して構築された。動作環境に関連した会社はありませんので、それは文、上記のコードを注意しなければならない、私は、これだけテストし、実証済みの読み、実行に直接コピーすることはできませんしませんでした:)

本番環境でこの認証ゲートウェイを使用する場合は、そのようなクロスドメインの問題、エージェンシー問題静的ファイル、などなど、考慮すべき多くのものがあります。

:個人の連絡先はOpenresty時間が長い、場所のテキストは、必然的に、コメントを送信したり、私に修正を電子メールで送信するために間違っているか、悪い表現歓迎されますされていない  [email protected]  、感謝を。

Openrestyのために、個人的には、キーはnginxのはOpenrestyのために、それがもたらすことができる利点があり、Webサーバに加えて、より多くのビジネスを取るために聞かせて認識しない認識することであることがそれに興味があると思います。

  1. 极致的性能.上文没有提到Openresty的性能, 其实Openresty的编程模型和NodeJS很像, 在Openresty的世界里面,所有东西都是非阻塞的,更难得可贵的是, 它不需要使用NodeJS中的回调函数, 代码写起来其实还是同步模型, 配合C语言编写的Nginx, 最快的脚本语言lua+luajit解释器,这套方案的性能无可挑剔了.

  2. 降低了Nginx模块的开发难度. Nginx + C/C++能做的, Openresty用lua都能做.开发效率高了, 性能还不怎么降, 何乐而不为呢?

おすすめ

転載: www.cnblogs.com/lgj8/p/12095539.html
おすすめ