다음을 통해 공유


Microsoft Entra로 보호된 CRUD API 시뮬레이션

앱을 빌드할 때 백 엔드 API와 상호 작용하는 경우가 많습니다. 이러한 API를 아직 사용할 수 없거나 다른 팀이 최신 요구 사항을 충족하도록 업데이트하는 경우가 있습니다. 대기를 방지하기 위해 일반적으로 필요한 데이터를 반환하는 모의 API를 만듭니다. 이 방법은 차단을 해제하지만 결국 실제 API로 대체하는 API를 빌드하는 데 시간을 할애해야 합니다. Microsoft Entra를 사용하여 API를 보호해야 하는 경우 더욱 복잡해집니다. 시간 낭비를 방지하기 위해 개발 프록시를 사용하여 CRUD API를 시뮬레이션하고 개발 속도를 높일 수 있습니다.

이 기능을 CrudApiPlugin사용하면 메모리 내 데이터 저장소를 사용하여 CRUD(만들기, 읽기, 업데이트, 삭제) API를 시뮬레이션할 수 있습니다. 간단한 구성 파일을 사용하여 모의 API에서 지원하는 URL과 반환되는 데이터를 정의할 수 있습니다. 또한 플러그 인은 클라이언트 쪽 애플리케이션에서 도메인 간 사용을 위해 CORS를 지원합니다. 또한 플러그 인은 Microsoft Entra 인증을 지원하므로 Microsoft Entra를 사용하여 모의 API를 보호하고 프로덕션 환경과 동일한 앱 인증 흐름을 구현할 수 있습니다.

시나리오

사용자가 고객을 관리할 수 있는 앱을 빌드한다고 가정해 보겠습니다. 데이터를 얻으려면 백 엔드 API의 /customers 엔드포인트를 호출해야 합니다. API는 Microsoft Entra로 보호됩니다. 백 엔드 팀이 작업을 완료할 때까지 기다리지 않도록 개발자 프록시를 사용하여 API를 시뮬레이션하고 필요한 데이터를 반환하기로 결정합니다.

시작하기 전에

먼저 고객 데이터를 사용하여 시뮬레이션된 CRUD API를 만듭니다. API가 작동하는지 확인한 후 Microsoft Entra를 사용하여 보호할 수 있습니다.

예제 1: 단일 범위를 사용하여 Microsoft Entra로 보호된 CRUD API 시뮬레이션

첫 번째 예제에서는 단일 범위로 전체 API를 보호합니다. 사용자가 고객에 대한 정보를 얻거나 업데이트해야 하는 경우에도 동일한 권한을 사용합니다.

파일에서 customers-api.json Entra에 대한 정보를 추가합니다.

{
  "$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v0.24.0/crudapiplugin.schema.json",
  "baseUrl": "https://api.contoso.com/v1/customers",
  "dataFile": "customers-data.json",
  "auth": "entra",
  "entraAuthConfig": {
    "audience": "https://api.contoso.com",
    "issuer": "https://login.microsoftonline.com/contoso.com",
    "scopes": ["api://contoso.com/user_impersonation"]
  },
  "actions": [
    {
      "action": "getAll"
    },
    {
      "action": "getOne",
      "url": "/{customer-id}",
      "query": "$.[?(@.id == {customer-id})]"
    },
    {
      "action": "create"
    },
    {
      "action": "merge",
      "url": "/{customer-id}",
      "query": "$.[?(@.id == {customer-id})]"
    },
    {
      "action": "delete",
      "url": "/{customer-id}",
      "query": "$.[?(@.id == {customer-id})]"
    }
  ]
}

속성을 지정하도록 entra 설정 auth 하면 API가 Microsoft Entra로 보호됩니다. 속성에서 entraAuthConfig 구성 세부 정보를 지정합니다. 속성은 audience API의 대상 그룹을 지정하고, issuer 속성은 토큰의 발급자를 지정하며 scopes , 속성은 API에 액세스하는 데 필요한 범위를 지정합니다. API 파일의 루트 수준에서 정의 scopes 하므로 모든 작업에는 동일한 범위가 필요합니다.

지정된 대상 그룹, 발급자 및 범위가 있는 토큰 없이 API를 호출하려고 하면 응답을 받 401 Unauthorized 습니다.

참고 항목

이 단계에서 개발자 프록시는 토큰의 유효성을 검사하지 않습니다. 토큰이 있고 필요한 대상 그룹, 발급자 및 범위가 있는지 확인합니다. 이는 실제 Microsoft Entra 앱 등록이 아직 없고 실제 토큰을 가져올 수 없는 초기 개발 중에 편리합니다.

예제 2: 다양한 작업에 대해 다양한 범위를 사용하여 Microsoft Entra로 보호되는 CRUD API 시뮬레이션

대부분의 경우 다른 API 작업에는 다른 권한이 필요합니다. 예를 들어 고객에 대한 정보를 가져오려면 업데이트하는 것과 다른 권한이 필요할 수 있습니다. 이 예제에서는 다양한 범위로 다른 API 작업을 보호합니다.

customers-api.json 다음과 같이 파일을 업데이트합니다.

{
  "$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v0.24.0/crudapiplugin.schema.json",
  "baseUrl": "https://api.contoso.com/v1/customers",
  "dataFile": "customers-data.json",
  "auth": "entra",
  "entraAuthConfig": {
    "audience": "https://api.contoso.com",
    "issuer": "https://login.microsoftonline.com/contoso.com"
  },
  "actions": [
    {
      "action": "getAll",
      "auth": "entra",
      "entraAuthConfig": {
        "scopes": ["api://contoso.com/customer.read"]
      }
    },
    {
      "action": "getOne",
      "url": "/{customer-id}",
      "query": "$.[?(@.id == {customer-id})]",
      "auth": "entra",
      "entraAuthConfig": {
        "scopes": ["api://contoso.com/customer.read"]
      }
    },
    {
      "action": "create",
      "auth": "entra",
      "entraAuthConfig": {
        "scopes": ["api://contoso.com/customer.write"]
      }
    },
    {
      "action": "merge",
      "url": "/{customer-id}",
      "query": "$.[?(@.id == {customer-id})]",
      "auth": "entra",
      "entraAuthConfig": {
        "scopes": ["api://contoso.com/customer.write"]
      }
    },
    {
      "action": "delete",
      "url": "/{customer-id}",
      "query": "$.[?(@.id == {customer-id})]",
      "auth": "entra",
      "entraAuthConfig": {
        "scopes": ["api://contoso.com/customer.write"]
      }
    }
  ]
}

이번에는 API 파일의 루트 수준에서 지정 scopes 하지 않습니다. 대신 각 작업에 대해 지정합니다. 이렇게 하면 다양한 범위로 다른 작업을 보호할 수 있습니다. 예를 들어 고객에 대한 정보를 가져오려면 범위가 api://contoso.com/customer.read 필요하지만 고객을 업데이트하려면 범위가 api://contoso.com/customer.write 필요합니다.

토큰 유효성 검사

개발자 프록시를 사용하면 Microsoft Entra로 보호되는 CRUD API를 시뮬레이션하고 유효한 토큰을 사용하고 있는지 확인할 수 있습니다. Microsoft Entra에서 앱 등록이 있는 경우 토큰 유효성을 검사하는 것이 편리하지만 팀은 여전히 API를 빌드하고 있습니다. 앱을 보다 정확하게 테스트할 수 있습니다.

개발자 프록시가 액세스 토큰의 유효성을 검사하도록 하려면 속성에 entraAuthConfig 속성을 추가하고 validateSigningKey 다음으로 true설정합니다.

{
  "$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v0.24.0/crudapiplugin.schema.json",
  "baseUrl": "https://api.contoso.com/v1/customers",
  "dataFile": "customers-data.json",
  "auth": "entra",
  "entraAuthConfig": {
    "audience": "https://api.contoso.com",
    "issuer": "https://login.microsoftonline.com/contoso.com",
    "scopes": ["api://contoso.com/user_impersonation"],
    "validateSigningKey": true
  },
  "actions": [
    {
      "action": "getAll"
    },
    {
      "action": "getOne",
      "url": "/{customer-id}",
      "query": "$.[?(@.id == {customer-id})]"
    },
    {
      "action": "create"
    },
    {
      "action": "merge",
      "url": "/{customer-id}",
      "query": "$.[?(@.id == {customer-id})]"
    },
    {
      "action": "delete",
      "url": "/{customer-id}",
      "query": "$.[?(@.id == {customer-id})]"
    }
  ]
}

자체 제작 토큰으로 API를 호출하려고 하면 응답을 받습니다 401 Unauthorized . 개발자 프록시는 Microsoft Entra에서 발급한 유효한 토큰이 있는 요청만 허용합니다.

다음 단계

CrudApiPlugin에 대해 자세히 알아봅니다.

샘플

관련 개발 프록시 샘플도 참조하세요.