Partilhar via


Simule uma API CRUD protegida com o Microsoft Entra

Ao criar aplicativos, você geralmente interage com APIs de back-end. Às vezes, essas APIs ainda não estão disponíveis ou outras equipes estão atualizando-as para atender aos requisitos mais recentes. Para evitar esperar, você normalmente cria uma API simulada que retorna os dados necessários. Embora essa abordagem desbloqueie você, ela exige que você gaste tempo na criação de uma API que você eventualmente substitui pela real. Fica ainda mais complicado, quando você precisa proteger sua API com o Microsoft Entra. Para evitar perder tempo, você pode usar o Dev Proxy para simular uma API CRUD e acelerar o desenvolvimento.

Usando o CrudApiPlugin, você pode simular uma API CRUD (Criar, Ler, Atualizar, Excluir) com um armazenamento de dados na memória. Usando um arquivo de configuração simples, você pode definir quais URLs sua API simulada suporta e quais dados ela retorna. O plugin também suporta CORS para uso entre diferentes domínios a partir de aplicações do lado do cliente. O plug-in também suporta a autenticação Microsoft Entra, para que você possa proteger sua API simulada com o Microsoft Entra e implementar o mesmo fluxo de autenticação para seu aplicativo como em seu ambiente de produção.

Cenário

Digamos que você esteja criando um aplicativo que permite que os usuários gerenciem clientes. Para obter os dados, precisas de chamar o /customers endpoint da API de back-end. A API é protegida com o Microsoft Entra. Para evitar esperar que a equipe de back-end termine seu trabalho, você decide usar o Dev Proxy para simular a API e retornar os dados necessários.

Antes de começar

Você começa criando uma API CRUD simulada com dados do cliente. Depois de confirmar que a API funciona, você pode protegê-la com o Microsoft Entra.

Exemplo 1: Simular uma API CRUD protegida com o Microsoft Entra usando um único escopo

No primeiro exemplo, você protege toda a API com um único escopo. Não importa se os usuários precisam obter informações sobre os clientes ou atualizá-los, eles usam a mesma permissão.

No customers-api.json arquivo, adicione informações sobre o Entra.

{
  "$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v1.0.0/crudapiplugin.apifile.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})]"
    }
  ]
}

Ao definir a auth propriedade para entra, você especifica que a API é protegida pelo Microsoft Entra. Na propriedade entraAuthConfig, especifica os detalhes da configuração. A audience propriedade especifica a audiência da API, a issuer propriedade especifica o emissor dos tokens e a scopes propriedade especifica os escopos necessários para acessar a API. Como você define scopes no nível raiz do arquivo de API, todas as ações exigem o mesmo escopo.

Se você tentar chamar a API sem um token com o público, o emissor e os escopos especificados, obterá uma 401 Unauthorized resposta.

Nota

Neste estágio, o Dev Proxy não valida o token. Ele apenas verifica se o token está presente e tem o público, o emissor e os escopos necessários. Isso é conveniente durante o desenvolvimento inicial, quando você ainda não tem um registro real do aplicativo Microsoft Entra e não consegue obter um token real.

Exemplo 2: Simular uma API CRUD protegida com o Microsoft Entra usando escopos diferentes para ações diferentes

Em muitos casos, diferentes operações de API exigem permissões diferentes. Por exemplo, obter informações sobre clientes pode exigir uma permissão diferente de atualizá-los. Neste exemplo, você protege diferentes ações de API com escopos diferentes.

Atualize o customers-api.json arquivo da seguinte maneira:

{
  "$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v1.0.0/crudapiplugin.apifile.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"]
      }
    }
  ]
}

Desta vez, você não especifica o scopes no nível raiz do arquivo de API. Em vez disso, você os especifica para cada ação. Dessa forma, você pode proteger diferentes ações com diferentes escopos. Por exemplo, obter informações sobre clientes requer o api://contoso.com/customer.read escopo, enquanto atualizar clientes requer o api://contoso.com/customer.write escopo.

Validar tokens

O Dev Proxy permite simular uma API CRUD protegida com o Microsoft Entra, e verificar se você está usando um token válido. A validação do token é conveniente quando você tem um registro de aplicativo no Microsoft Entra, mas a equipe ainda está criando a API. Ele permite que você teste seu aplicativo com mais precisão.

Se pretender que o Dev Proxy valide o token de acesso, adicione a propriedade validateSigningKey à propriedade entraAuthConfig e defina-a como true:

{
  "$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v1.0.0/crudapiplugin.apifile.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})]"
    }
  ]
}

Se você tentar chamar a API com um token criado automaticamente, obterá uma 401 Unauthorized resposta. O Dev Proxy permite apenas solicitações com um token válido emitido pelo Microsoft Entra.

Próximo passo

Saiba mais sobre o CrudApiPlugin.

Exemplos

Consulte também os exemplos relacionados de Dev Proxy: