메인 콘텐츠로 건너뛰기

APISIX

현재 APISIX 플러그인을 통해 Casdoor를 APISIX에 연결하고 APISIX 뒤의 API를 보호하는 두 가지 방법이 있습니다: 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를 사용하여 "httpbin.org:80"을 가리키는 라우트 "/anything/*"를 생성하고 "authz-casdoor" 플러그인을 활성화했습니다. 이 라우트는 이제 Casdoor의 인증 보호 아래에 있습니다.

속성

이름유형요구사항기본값유효설명
endpoint_addr문자열필수Casdoor의 URL.
client_id문자열필수Casdoor의 클라이언트 ID.
client_secret문자열필수Casdoor의 클라이언트 비밀번호.
callback_url문자열필수상태와 코드를 받는 데 사용되는 콜백 URL.

endpoint_addr 및 callback_url은 '/'로 끝나지 않아야 합니다

"authz-casdoor" 플러그인의 설정에서 네 가지 매개변수를 볼 수 있습니다.

첫 번째는 "callback_url"입니다. 이것은 OAuth2의 콜백 URL입니다. 이 콜백 URL은 라우트에 지정한 "uri"에 속해야 한다는 점을 강조해야 합니다. 예를 들어, 이 예에서는 http://localhost:9080/anything/callback이 분명히 "/anything/*"에 속합니다. 이 방법만으로, 콜백_url로의 방문이 플러그인에 의해 가로채고 활용될 수 있습니다(따라서 플러그인은 OAuth2의 코드와 상태를 얻을 수 있습니다). 콜백_url의 로직은 플러그인에 의해 완전히 구현되므로, 이 콜백을 구현하기 위해 서버를 수정할 필요가 없습니다.

두 번째 매개변수 "endpoint_addr"는 분명히 Casdoor의 URL입니다. 세 번째와 네 번째 매개변수는 "client_id"와 "client_secret"이며, 이는 앱을 등록할 때 Casdoor에서 얻을 수 있습니다.

어떻게 작동하나요?

이 라우트를 이전에 방문한 적이 없는 새로운 사용자가 방문하려고 한다고 가정해 보겠습니다 (http://localhost:9080/anything/d?param1=foom2=bar). "authz-casdoor"가 활성화되어 있으므로, 이 방문은 먼저 "authz-casdoor" 플러그인에 의해 처리됩니다. 세션을 확인하고 이 사용자가 아직 인증받지 않았다는 것을 확인한 후, 방문이 중단됩니다. 사용자가 방문하려는 원래 URL을 유지하면서, 그들은 Casdoor의 로그인 페이지로 리디렉션됩니다.

사용자 이름과 비밀번호(또는 그들이 사용하는 어떤 방법이든)로 성공적으로 로그인한 후, Casdoor는 이 사용자를 "code"와 "state"가 지정된 GET 매개변수와 함께 "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