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_addr | string | required | CasdoorのURL。 | ||
client_id | string | required | Casdoor内のクライアントID。 | ||
client_secret | string | required | Casdoor内のクライアントシークレット。 | ||
callback_url | string | required | 状態とコードを受け取るために使用されるコールバック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=foo¶m2=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をデプロイする
成功したデプロイメントの後、以下を確認する必要があります:
- Casdoorは正常にログインして使用できます。
- Casdoorの
origin
値(conf/app.conf)をCASDOOR_HOSTNAME
に設定します。
ステップ2:Casdoorアプリケーションを設定する
- 新しいCasdoorアプリケーションを作成するか、既存のものを使用します。
- リダイレクトURLを追加します:
http://APISIX_HOSTNAME/REDIRECTWHATYOUWANT
、そしてREDIRECTWHATYOUWANT
を望むリダイレクトURLに置き換えます。 - トークン形式オプションに「JWT-Empty」を選択します。
- 望むプロバイダーを追加し、他の設定を構成します。
アプリケーション設定ページで、上の写真に示されているようにClient ID
とClient 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へのリクエストが送信されたことがわかります。