メインコンテンツにスキップ

APISIX

現在、APISIXプラグインを介してAPISIXに接続し、APISIXの背後にあるAPIを保護するためにCasdoorを使用する2つの方法があります:APISIXのCasdoorプラグインを使用するか、APISIXのOIDCプラグインを使用するかです。

APISIXのCasdoorプラグインを介してCasdoorに接続する

このプラグイン、authz-casdoorは、APIのコードを変更することなく、すべてのリクエストが認証されるようにAPISIXの背後にあるAPIを保護することができます。

有効にする方法

ルートを作成するときにこのプラグインを指定し、必要なすべてのフィールドを提供する必要があります。 こちらは一例です。

curl "http://127.0.0.1:9180/apisix/admin/routes/1" -H "X-API-KEY: edd1c9f034335f136f87ad84b625c8f1" -X PUT -d '
{
"methods": ["GET"],
"uri": "/anything/*",
"plugins": {
"authz-casdoor": {
"endpoint_addr":"http://localhost:8000",
"callback_url":"http://localhost:9080/anything/callback",
"client_id":"7ceb9b7fda4a9061ec1c",
"client_secret":"3416238e1edf915eac08b8fe345b2b95cdba7e04"
}
},
"upstream": {
"type": "roundrobin",
"nodes": {
"httpbin.org:80": 1
}
}
}'

この例では、APISIXの管理APIを使用して、ルート「/anything/*」を「httpbin.org:80」に指向させ、「authz-casdoor」プラグインを有効にしました。 このルートは現在、Casdoorの認証保護の下にあります。

属性

名前タイプ要件デフォルト有効説明
endpoint_addrstringrequiredCasdoorのURL。
client_idstringrequiredCasdoor内のクライアントID。
client_secretstringrequiredCasdoor内のクライアントシークレット。
callback_urlstringrequired状態とコードを受け取るために使用されるコールバックURL。

endpoint_addrとcallback_urlは'/'で終わらないようにしてください

「authz-casdoor」プラグインの設定では、4つのパラメータが見られます。

最初の一つは「callback_url」です。 これはOAuth2のコールバックURLです。 このコールバックURLはルートで指定した「uri」に属している必要がありますと強調されるべきです。 例えば、この例では、http://localhost:9080/anything/callbackは明らかに「/anything/*」に属しています。 この方法により、callback_urlへの訪問はプラグインによって傍受され、利用されることができます(プラグインがOAuth2でコードと状態を取得できるようにするため)。 callback_urlのロジックはプラグインによって完全に実装されているため、このコールバックを実装するためにサーバーを変更する必要はありません。

2番目のパラメータ「endpoint_addr」は明らかにCasdoorのURLです。 3番目と4番目のパラメータは「client_id」と「client_secret」で、アプリをCasdoorに登録するときに取得できます。

どのように機能するか?

このルートを初めて訪れる新しいユーザーが訪れるとします(http://localhost:9080/anything/d?param1=foom2=bar)。 「authz-casdoor」が有効になっていることを考えると、この訪問は最初に「authz-casdoor」プラグインによって処理されます。 セッションをチェックし、このユーザーが認証されていないことを確認した後、訪問は傍受されます。 ユーザーが訪れたい元のURLを保持したまま、Casdoorのログインページにリダイレクトされます。

ユーザー名とパスワード(または使用する他の方法)で正常にログインした後、CasdoorはGETパラメータ「code」と「state」を指定して「callback_url」にこのユーザーをリダイレクトします。 「callback_url」がプラグインによって知られているため、今回「callback_url」への訪問が傍受されると、OAuth2の「Authorization code Grant Flow」のロジックがトリガーされます。 つまり、プラグインはアクセストークンを要求して、このユーザーが本当にログインしているかどうかを確認します。 この確認の後、プラグインはこのユーザーを以前に保持していた彼らが訪れたい元のURLにリダイレクトします。 ログイン状態もセッションに保持されます。

次に、このユーザーがこのルートの背後にあるURLを訪れたいと思ったとき(例えば、http://localhost:9080/anything/d)、このユーザーが以前に認証されていることが発見された後、このプラグインはもうこのユーザーをリダイレクトしません。 この方法により、ユーザーはこのルートの下で何でも訪れることができ、干渉されることはありません。

APISIXのOIDCプラグインを介してCasdoorに接続する

CasdoorはOIDCプロトコルを使用してAPISIXに接続でき、このドキュメントではそれをどのように行うかを示します。

以下は設定で使用されるいくつかの名前です:

CASDOOR_HOSTNAME:Casdoorサーバーがデプロイされているドメイン名またはIP。

APISIX_HOSTNAME:APISIXがデプロイされているドメイン名またはIP。

ステップ1:CasdoorとAPISIXをデプロイする

まず、CasdoorAPISIXをデプロイします。

成功したデプロイメントの後、以下を確認する必要があります:

  1. Casdoorは正常にログインして使用できます。
  2. Casdoorのorigin値(conf/app.conf)をCASDOOR_HOSTNAMEに設定します。 Casdoor conf

ステップ2:Casdoorアプリケーションを設定する

  1. 新しいCasdoorアプリケーションを作成するか、既存のものを使用します。
  2. リダイレクトURLを追加します:http://APISIX_HOSTNAME/REDIRECTWHATYOUWANT、そしてREDIRECTWHATYOUWANTを望むリダイレクトURLに置き換えます。
  3. トークン形式オプションに「JWT-Empty」を選択します。
  4. 望むプロバイダーを追加し、他の設定を構成します。

アプリケーション設定 アプリケーション設定ページで、上の写真に示されているようにClient IDClient Secretの値を見つけることができます。 次のステップでそれらを使用します。

お気に入りのブラウザを開いて、http://CASDOOR_HOSTNAME/.well-known/openid-configurationを訪れます。そこでCasdoorのOIDC設定を見つけることができます。

ステップ3:APISIXを設定する

APISIXには公式のOIDCサポートがあり、lua-resty-openidcを使用して実装されています。

APISIX OIDCドキュメントに従って設定をカスタマイズできます。 以下のルーティング設定が使用されます:

# Use your own X-Api-Key
$ curl -X POST APISIX_HOSTNAME/apisix/admin/routes -H "X-Api-Key: edd1c9f034335f136f87ad84b625c8f1" -d '{
"uri": "/get",
"name": "apisix_casdoor_test",
"plugins": {
"openid-connect": {
"client_id": "Client ID",
"client_secret": "Client Secret",
"discovery": "http://CASDOOR_HOSTNAME/.well-known/openid-configuration",
"introspection_endpoint_auth_method": "client_secret_basic",
"logout_path": "/logout",
"realm": "master",
"redirect_uri": "http://APISIX_HOSTNAME/REDIRECTWHATYOUWANT",
"bearer_only": false,
"set_id_token_header": false,
"access_token_in_authorization_header": true,
"set_access_token_header": true,
"set_userinfo_header": false,
"realm": "master"
}
},
"upstream": {
"type": "roundrobin",
"nodes": {
"httpbin.org:80": 1
}
}
}'

今、http://APISIX_HOSTNAME/getを訪れると、ブラウザはCasdoorのログインページにリダイレクトされます。 正常にログインした後、以下のスクリーンショットに示されているようにhttpbin.orgへのリクエストが送信されたことがわかります。 APISIX_Result