Adicionando Políticas de Solicitação de Autenticação e Autorização
Descubra como adicionar políticas de solicitação para fornecer autenticação e autorização com o Gateway de API.
Você pode adicionar políticas de solicitação para fornecer autenticação e autorização usando:
- tokens de acesso de vários argumentos definidos pelo usuário passados para funções de autorizador de vários argumentos (consulte Adicionando Políticas de Solicitação de Autenticação e Autorização para Tokens de Acesso de Vários Argumentos e Funções de Autorizador (Recomendado))
- tokens de acesso de argumento único passados para funções de autorizador de argumento único (consulte Adicionando Políticas de Solicitação de Autenticação e Autorização para Tokens de Acesso de Argumento Único e Funções de Autorizador)
Adicionando Políticas de Solicitação de Autenticação e Autorização para Tokens de Acesso de Vários Argumentos e Funções de Autorizador (Recomendado)
Você pode adicionar políticas de solicitação para fornecer autenticação e autorização usando tokens de acesso de vários argumentos e funções de autorizador de vários argumentos definidos pelo usuário:
Usando a Console para Adicionar Políticas de Solicitação de Autenticação e Autorização de Vários Argumentos
Para adicionar políticas de solicitação de autenticação e autorização para tokens de acesso com vários argumentos a uma especificação de implantação de API usando a Console:
-
Crie ou atualize uma implantação de API usando a Console. Selecione a opção Totalmente Nova e insira os detalhes na página Informações Básicas.
Para obter mais informações, consulte Implantando uma API em um Gateway de API por meio da Criação de uma Implantação de API e Atualizando um Gateway de API.
- Selecione Próximo para exibir a página Autenticação.
-
Selecione Autenticação Única para especificar que você deseja usar um único servidor de autenticação para todas as solicitações.
Estas instruções pressupõem que você deseja usar um único servidor de autenticação. Como alternativa, se você quiser usar vários servidores de autenticação, selecione Multiautenticação e siga as instruções em Usando a Console para Adicionar Vários Servidores de Autenticação à mesma Implantação de API.
-
Marque ou desmarque a caixa de seleção Ativar Acesso Anônimo: para especificar se os usuários finais não autenticados (ou seja, anônimos) podem acessar rotas na implantação de API.
Por padrão, essa opção não está selecionada. Se você nunca quiser que usuários anônimos possam acessar rotas, não selecione essa opção. Observe que, se você selecionar essa opção, também precisará especificar explicitamente cada rota para a qual o acesso anônimo é permitido, selecionando Anônimo como o Tipo de Autorização em cada política de autorização da rota.
- Selecione Função do autorizador na lista de opções Tipo de autenticação.
- Especifique a função de autorizador de multi-argumento a ser usada para autenticar o token de acesso de multi-argumento:
- Aplicativo Oracle Functions no <compartment-name>: O nome do aplicativo no OCI Functions que contém a função de autorizador. Você pode selecionar um aplicativo de outro compartimento.
- Nome da Função: O nome da função de autorizador no OCI Functions.
- Selecione Função de autorizador de vários argumentos para especificar que você deseja passar um ou mais elementos de uma solicitação como token de acesso a uma função de autorizador que pode aceitar tokens de acesso de vários argumentos.
- No painel Argumentos de função, especifique uma ou mais variáveis de contexto que forneçam valores para passar à função de autorizador como argumentos com nomes de argumento informados:
- Especifique uma variável de contexto fornecendo um valor a ser passado para a função de autorizador como um argumento:
- Tabela de contexto: Selecione na lista a tabela de contexto que contém a variável de contexto:
- Tabela de contexto
request.query
, contendo nomes e valores de parâmetros de consulta incluídos na solicitação - Tabela de contexto
request.headers
, contendo nomes e valores de cabeçalho incluídos na solicitação - Tabela de contexto
request.cert
, contendo uma versão codificada em Base64 do certificado apresentada por um cliente de API e validada com sucesso durante um handshake mTLS - Tabela de contexto
request.host
, contendo o nome do host para o qual a solicitação foi enviada (extraída do campo de cabeçalhoHost
na solicitação) - Tabela de contexto
request.body
, contendo o corpo da solicitação
- Tabela de contexto
- Nome do cabeçalho ou Nome do parâmetro de consulta: Se você tiver selecionado a tabela de contexto
request.headers
ourequest.params
, informe o nome do cabeçalho ou do parâmetro de consulta que deseja transmitir à função de autorizador. Por exemplo,X-Api-Key
,state
. - Nome do argumento: Informe o nome do argumento ao qual atribuir o valor da variável de contexto. O argumento é passado para a função de autorizador. O nome do argumento informado deve corresponder ao nome do argumento que a função de autorizador espera receber.
- Tabela de contexto: Selecione na lista a tabela de contexto que contém a variável de contexto:
- Especifique variáveis e argumentos de contexto adicionais conforme necessário (se necessário, selecione Outro argumento).
- Especifique uma variável de contexto fornecendo um valor a ser passado para a função de autorizador como um argumento:
-
Opcionalmente, personalize como armazenar em cache a resposta de uma função de autorizador com vários argumentos:
- Selecione Mostrar opções avançadas.
O painel Cache de resultados de função mostra quais argumentos estão presentes na chave de cache. A chave de cache identifica exclusivamente a resposta armazenada em cache retornada pela função de autorizador, usando argumentos e valores de argumento informados na solicitação de autenticação original. Por padrão, todos os argumentos e valores de argumentos (exceto um argumento com um valor da tabela de contexto
request.body
) que você especificou para passar à função de autorizador são usados para criar a chave de cache. - Para adicionar ou remover argumentos da chave de cache, selecione Editar.
- Marque ou desmarque os argumentos passados para a função de autorizador para incluí-los ou excluí-los da chave de cache.
- Selecione Mostrar opções avançadas.
-
Opcionalmente, personalize como tratar uma resposta de autenticação com falha de uma função de autorizador com vários argumentos configurando uma política de falha de validação:
- Selecione Mostrar opções avançadas.
O painel Resposta personalizada para autenticação com falha mostra o código de status HTTP e o corpo da mensagem a serem retornados ao cliente da API se a função de autorizador não puder autenticar a solicitação. Por padrão, o gateway de API envia um código de status HTTP 401 e o cabeçalho
WWW-Authenticate
na resposta. Consulte Observações sobre Políticas de Falha de Validação e o Tratamento de Respostas de Autenticação com Falha das Funções de Autorizador de Vários Argumentos. - Especifique um código de status (e um corpo de mensagem opcional) para retornar ao cliente de API se a função de autorizador não puder autenticar a solicitação:
- Código de status HTTP: Informe um código de status HTTP alternativo (por exemplo,
500
). Como alternativa, você pode incluir uma variável de contexto para retornar o código retornado pela função de autorizador. Por exemplo, se a função de autorizador retornar um código de resposta no parâmetroresponseCode
, especifiquerequest.auth[responseCode]
. - Corpo da mensagem: Informe um corpo da mensagem. Por exemplo,
Unfortunately, authentication failed.
O corpo da mensagem pode incluir qualquer variável de contexto (excetorequest.body
). Por exemplo,Unfortunately, authentication failed ${request.auth[my-auth-variable]}
.
- Código de status HTTP: Informe um código de status HTTP alternativo (por exemplo,
-
Opcionalmente, modifique os cabeçalhos da resposta que o gateway de API retorna ao cliente de API selecionando Mostrar opções avançadas e especificando uma política de resposta de transformação de cabeçalho:
-
Para limitar os cabeçalhos incluídos em uma resposta, especifique:
-
Para alterar o nome de um cabeçalho incluído em uma resposta (mantendo seu valor original), especifique:
-
Para adicionar um novo cabeçalho a uma resposta (ou para alterar ou manter os valores de um cabeçalho existente já incluído em uma resposta), especifique:
Para obter mais informações sobre políticas de resposta de transformação de cabeçalho, consulte Adicionando Políticas de Resposta de Transformação de Cabeçalho
-
- Selecione Mostrar opções avançadas.
-
Selecione Próximo para informar detalhes de rotas individuais na implantação de API na página Rotas.
-
Na seção Rota 1, especifique a primeira rota na implantação de API que mapeia um caminho e um ou mais métodos para um serviço de back-end:
-
Caminho: Um caminho para chamadas de API usando os métodos listados para o serviço de back-end. Observe que o caminho da rota que você especificar:
- é relativo ao prefixo do caminho de implantação
- deve ser precedido por uma barra ( / ) e pode ser apenas uma barra
- pode conter várias barras (desde que elas não sejam adjacentes) e pode terminar com uma barra
- pode incluir caracteres alfanuméricos maiúsculos e minúsculos
- pode incluir os caracteres especiais
$ - _ . + ! * ' ( ) , % ; : @ & =
- pode incluir parâmetros e curingas (consulte Adicionando Parâmetros de Caminho e Curingas a Caminhos de Rota)
- Métodos: Um ou mais métodos aceitos pelo serviço de back-end, separados por vírgulas. Por exemplo,
GET, PUT
. -
Adicionar um único backend ou Adicionar vários backends: Se todas as solicitações devem ser roteadas para o mesmo back-end ou para rotear solicitações para diferentes back-ends de acordo com a variável de contexto e as regras informadas.
Essas instruções pressupõem que você deseja usar um único back-end; portanto, selecione Adicionar um único backend. Como alternativa, se você quiser usar back-ends diferentes, selecione Adicionar vários back-ends e siga as instruções em Usando a Console para Adicionar Seleção de Back-End Dinâmico a uma Especificação de Implantação de API.
-
Tipo de backend: O tipo do serviço de backend, como:
- HTTP: Para um back-end de HTTP, você também precisa especificar um URL, detalhes de timeout e se deve desativar a verificação SSL (consulte Adicionando um URL HTTP ou HTTPS como um Back-End do Serviço API Gateway).
- Oracle Functions: Para um back-end do OCI Functions, você também precisa especificar o aplicativo e a função (consulte Adicionando uma Função no OCI Functions como um Back-End do Serviço API Gateway).
- Resposta Padrão: Para um back-end de resposta padrão, você também precisa especificar o código de status HTTP, o conteúdo no corpo da resposta e um ou mais campos de cabeçalho HTTP (consulte Adicionando Respostas Padrão como um Back-End do Serviço API Gateway).
-
-
Para especificar uma política de autorização que se aplique a uma rota individual, selecione Mostrar Políticas de Solicitação de Rota, selecione o botão Adicionar ao lado de autorização e especifique:
-
Tipo de Autorização: Como conceder acesso à rota. Especifique:
- Qualquer um: Só concede acesso a usuários finais que foram autenticados com sucesso, desde que a função de autorizador também tenha retornado um dos escopos de acesso especificados no campo Escopo Permitido. Nesse caso, a opção Ativar Acesso Anônimo da política de autenticação não tem efeito.
- Anônimo: Concede acesso a todos os usuários finais, mesmo que eles não tenham sido autenticados com sucesso pela função de autorizador. Nesse caso, você deve ter selecionado a opção Ativar Acesso Anônimo da política de autenticação.
- Somente autenticação: Só concede acesso a usuários finais que foram autenticados com sucesso pela função de autorizador. Nesse caso, a opção Ativar Acesso Anônimo da política de autenticação não tem efeito.
- Escopo Permitido: Se você tiver selecionado Qualquer um como o Tipo de Autorização, insira uma lista delimitada por vírgulas de uma ou mais strings que correspondam aos escopos de acesso retornados pela função de autorizador. O acesso só será concedido aos usuários finais que foram autenticados com sucesso se a função de autorizador retornar um dos escopos de acesso especificados. Por exemplo,
read:hello
Observação
Se você não incluir uma política de autorização para uma rota específica, o acesso será concedido como se tal política existisse e o Tipo de Autorização estivesse definido como Somente autenticação. Em outras palavras, independentemente da definição da opção Ativar Acesso Anônimo da política de autenticação:
- somente usuários finais autenticados podem acessar a rota
- todos os usuários finais autenticados podem acessar a rota, independentemente dos escopos de acesso retornados pela função de autorizador
- usuários finais anônimos não podem acessar a rota
-
- Selecione Aplicar Alterações e, em seguida, selecione Próximo para revisar os detalhes informados para a implantação de API.
- Selecione Criar ou Salvar Alterações para criar ou atualizar a implantação de API.
- (Opcional) Confirme se a API foi implantada com êxito, chamando-a (consulte Chamando uma API Implantada em um Gateway de API).
Editando um Arquivo JSON para Adicionar Políticas de Solicitação de Autenticação e Autorização de Vários Argumentos
Para adicionar políticas de solicitação de autenticação e autorização para tokens de acesso com vários argumentos a uma especificação de implantação de API em um arquivo JSON:
-
Usando seu editor de JSON preferido, edite a especificação de implantação de API existente à qual você deseja adicionar a funcionalidade de autenticação e autorização ou crie uma nova especificação de implantação de API (consulte Criando uma Especificação de Implantação de API).
No mínimo, a especificação de implantação de API incluirá uma seção
routes
contendo:- Um caminho. Por exemplo,
/hello
- Um ou mais métodos. Por exemplo,
GET
- Uma definição de um back-end. Por exemplo, um URL ou o OCID de uma função no OCI Functions.
Por exemplo, a seguinte especificação básica de implantação de API define uma função simples sem servidor Hello World no OCI Functions como um único back-end:
{ "routes": [ { "path": "/hello", "methods": ["GET"], "backend": { "type": "ORACLE_FUNCTIONS_BACKEND", "functionId": "ocid1.fnfunc.oc1.phx.aaaaaaaaab______xmq" } } ] }
- Um caminho. Por exemplo,
-
Adicione uma política de solicitação
authentication
que se aplique a todas as rotas na especificação de implantação de API:-
Insira uma seção
requestPolicies
antes da seçãoroutes
, se ainda não existir uma. Por exemplo:{ "requestPolicies": {}, "routes": [ { "path": "/hello", "methods": ["GET"], "backend": { "type": "ORACLE_FUNCTIONS_BACKEND", "functionId": "ocid1.fnfunc.oc1.phx.aaaaaaaaab______xmq" } } ] }
-
Adicione a seguinte política
authentication
à nova seçãorequestPolicies
.{ "requestPolicies": { "authentication": { "type": "<type-value>", "isAnonymousAccessAllowed": <true|false>, "functionId": "<function-ocid>", "parameters": { "<argument-n>": "<context-variable>", "<argument-n>": "<context-variable>", "<argument-n>": "<context-variable>" }, "cacheKey": [ "<cache-key-argument-n>", "<cache-key-argument-n>" ] } }, "routes": [ { "path": "/hello", "methods": ["GET"], "backend": { "type": "ORACLE_FUNCTIONS_BACKEND", "functionId": "ocid1.fnfunc.oc1.phx.aaaaaaaaab______xmq" } } ] }
em que:
-
<type-value>
é o tipo de autenticação. Para usar uma função de autorizador para autenticação, especifiqueCUSTOM_AUTHENTICATION
. "isAnonymousAccessAllowed": <true|false>
indica opcionalmente se usuários finais não autenticados (ou seja, anônimos) podem acessar rotas na especificação de implantação de API. Se você nunca quiser que usuários finais anônimos possam acessar rotas, defina essa propriedade comofalse
. Se você não incluir essa propriedade na políticaauthentication
, o padrãofalse
será usado. Observe que, se você não incluir essa propriedade e defini-la comotrue
, também precisará especificar explicitamente cada rota para a qual o acesso anônimo é permitido, definindo a propriedadetype
como"ANONYMOUS"
na políticaauthorization
de cada rota.-
<function-ocid>
é o OCID da função de autorizador implantada no OCI Functions. <argument-n>
é o nome do argumento ao qual atribuir o valor de uma e somente uma variável de contexto. O argumento é transmitido para a função de autorizador. O nome do argumento informado deve corresponder ao nome do argumento que a função de autorizador espera receber. É possível incluir vários pares de variáveis de contexto de argumento.<context-variable>
é uma variável de contexto cujo valor você deseja designar ao argumento correspondente.<context-variable>
deve estar no formato<context-table-name>
ou<context-table-name>[<key>]
, em que<context-table-name>
é um dos seguintes:request.query
, uma tabela de contexto que contém nomes e valores de parâmetros de consulta incluídos na solicitação. Se quiser especificar um parâmetro de consulta, especifique a tabela de contextorequest.query
e o nome do parâmetro de consulta como chave no formatorequest.query[<query-parameter-name>]
. Por exemplo,request.query[state]
request.headers
, uma tabela de contexto que contém nomes e valores de cabeçalho incluídos na solicitação. Se quiser especificar um cabeçalho, especifique a tabela de contextorequest.headers
e o nome do cabeçalho como a chave no formatorequest.headers[<header-name>]
. Por exemplo,request.headers[X-Api-Key]
- Tabela de contexto
request.cert
, contendo uma versão codificada em Base64 do certificado apresentada por um cliente de API e validada com sucesso durante um handshake mTLS request.host
, uma tabela de contexto contendo o nome do host para o qual a solicitação foi enviada (extraída do campo de cabeçalhoHost
na solicitação)request.body
, uma tabela de contexto que contém o corpo da solicitação.
"cacheKey": ["<cache-key-argument-n>", "<cache-key-argument-n>"]
opcionalmente restringe a chave de cache para usar apenas os argumentos especificados. A chave de cache identifica exclusivamente a resposta em cache retornada da função de autorizador, usando argumentos e valores de argumentos informados na solicitação de autenticação original. Por padrão, todos os argumentos e valores de argumentos (exceto para um argumento com um valor da tabela de contextorequest.body
) na listaparameters: {…}
são usados para criar a chave de cache. Um argumento especificado para<cache-key-argument-n>
deve ser um dos argumentos na listaparameters: {…}
. Consulte Observações sobre o Armazenamento em Cache dos Resultados da Função do Autorizador de Vários Argumentos.
-
- Opcionalmente, adicione um
validationFailurePolicy
à seção de políticaauthentication
:{ "requestPolicies": { "authentication": { "type": "<type-value>", "isAnonymousAccessAllowed": <true|false>, "functionId": "<function-ocid>", "parameters": { "<argument-n>": "<context-variable>", "<argument-n>": "<context-variable>", "<argument-n>": "<context-variable>" }, "cacheKey": [ "<cache-key-argument-n>", "<cache-key-argument-n>" ], "validationFailurePolicy": { "type": "MODIFY_RESPONSE", "responseCode": "<alternative-response-code>", "responseMessage": "<custom-message-body>", "responseTransformations": { "headerTransformations": { <valid-header-transformation-response-policy> } } } } }, "routes": [ { "path": "/hello", "methods": ["GET"], "backend": { "type": "ORACLE_FUNCTIONS_BACKEND", "functionId": "ocid1.fnfunc.oc1.phx.aaaaaaaaab______xmq" } } ] }
em que:
"validationFailurePolicy": {…}
opcionalmente permite que você altere o código de status HTTP, o corpo da mensagem e os cabeçalhos na resposta ao cliente da API se a função de autorizador não puder autenticar uma solicitação. Por padrão, o gateway de API envia um código de status HTTP 401 e o cabeçalhoWWW-Authenticate
na resposta. Consulte Observações sobre Políticas de Falha de Validação e o Tratamento de Respostas de Autenticação com Falha das Funções de Autorizador com Vários Argumentos.<policy-type>
é o tipo de política de falha de validação. Para modificar a resposta, especifiqueMODIFY_RESPONSE
."responseCode": "<alternative-response-code>"
especifica um código de status HTTP alternativo. Por exemplo,"responseCode": "500"
. Como alternativa, você pode incluir uma variável de contexto para retornar o código retornado pela função de autorizador. Por exemplo, se a função de autorizador retornar um código de resposta no parâmetroresponseCode
, especifique"request.auth[responseCode]"
."responseMessage": "<custom-message-body>"
especifica o conteúdo a ser incluído no corpo da mensagem. Por exemplo,"responseMessage": "Unfortunately, authentication failed."
. O corpo da mensagem pode incluir qualquer variável de contexto (excetorequest.body
). Por exemplo,"responseMessage": "Unfortunately, authentication failed ${request.auth[my-auth-variable]}"
."headerTransformations": {<valid-header-transformation-response-policy>}
é uma política de resposta de transformação de cabeçalho válida. Consulte Editando um arquivo JSON para adicionar políticas de resposta de transformação de cabeçalho.
-
-
Adicione uma política de solicitação
authorization
para cada rota na especificação de implantação de API:-
Insira uma seção
requestPolicies
após a primeira seçãobackend
da rota, se ainda não existir. Por exemplo:{ "requestPolicies": { "authentication": { "type": "CUSTOM_AUTHENTICATION", . . . } }, "routes": [ { "path": "/hello", "methods": ["GET"], "backend": { "type": "ORACLE_FUNCTIONS_BACKEND", "functionId": "ocid1.fnfunc.oc1.phx.aaaaaaaaab______xmq" }, "requestPolicies": {} } ] }
-
Adicione a seguinte política
authorization
à seçãorequestPolicies
:{ "requestPolicies": { "authentication": { "type": "CUSTOM_AUTHENTICATION", . . . } }, "routes": [ { "path": "/hello", "methods": ["GET"], "backend": { "type": "ORACLE_FUNCTIONS_BACKEND", "functionId": "ocid1.fnfunc.oc1.phx.aaaaaaaaab______xmq" }, "requestPolicies": { "authorization": { "type": <"AUTHENTICATION_ONLY"|"ANY_OF"|"ANONYMOUS">, "allowedScope": [ "<scope>" ] } } } ] }
em que:
-
"type": <"AUTHENTICATION_ONLY"|"ANY_OF"|"ANONYMOUS">
indica como conceder acesso à rota:"AUTHENTICATION_ONLY"
: Só concede acesso a usuários finais que foram autenticados com sucesso. Nesse caso, a propriedade"isAnonymousAccessAllowed"
na políticaauthentication
da especificação de implantação de API não tem efeito."ANY_OF"
: Só concede acesso a usuários finais que foram autenticados com sucesso, desde que a função de autorizador também tenha retornado um dos escopos de acesso especificados na propriedadeallowedScope
. Nesse caso, a propriedade"isAnonymousAccessAllowed"
na políticaauthentication
da especificação de implantação de API não tem efeito."ANONYMOUS"
: Concede acesso a todos os usuários finais, mesmo que eles não tenham sido autenticados com sucesso. Nesse caso, você deve definir explicitamente a propriedade"isAnonymousAccessAllowed"
comotrue
na políticaauthentication
da especificação de implantação de API.
-
"allowedScope": [ "<scope>" ]
é uma lista delimitada por vírgulas de uma ou mais strings que correspondem aos escopos de acesso retornados pela função de autorizador. Nesse caso, você deve definir a propriedadetype
como"ANY_OF"
(a propriedade"allowedScope"
será ignorada se a propriedadetype
estiver definida como"AUTHENTICATION_ONLY"
ou"ANONYMOUS"
). Observe também que, se você especificar mais de um escopo, o acesso à rota será concedido se qualquer um dos escopos especificados for retornado pela função de autorizador.
Por exemplo, a política de solicitação a seguir define uma rota
/hello
que só permite que usuários finais autenticados com o escoporead:hello
a acessem:{ "requestPolicies": { "authentication": { "type": "CUSTOM_AUTHENTICATION", . . . } }, "routes": [ { "path": "/hello", "methods": ["GET"], "backend": { "type": "ORACLE_FUNCTIONS_BACKEND", "functionId": "ocid1.fnfunc.oc1.phx.aaaaaaaaab______xmq" }, "requestPolicies": { "authorization": { "type": "ANY_OF", "allowedScope": [ "read:hello" ] } } } ] }
-
- Adicione uma política de solicitação
authorization
para todas as rotas restantes na especificação de implantação de API.
Observação
Se você não incluir uma política
authorization
para uma rota específica, o acesso será concedido como se tal política não existisse e a propriedadetype
estivesse definida como"AUTHENTICATION_ONLY"
. Em outras palavras, independentemente da definição da propriedadeisAnonymousAccessAllowed
na políticaauthentication
da especificação de implantação de API:- somente usuários finais autenticados podem acessar a rota
- todos os usuários finais autenticados podem acessar a rota, independentemente dos escopos de acesso retornados pela função de autorizador
- usuários finais anônimos não podem acessar a rota
-
- Salve o arquivo JSON que contém a especificação de implantação de API.
-
Use a especificação de implantação de API ao criar ou atualizar uma implantação de API das seguintes formas:
- especificando o arquivo JSON na Console quando você selecionar a opção Carregar uma API existente
- especificando o arquivo JSON em uma solicitação à API REST do serviço API Gateway
Para obter mais informações, consulte Implantando uma API em um Gateway de API por meio da Criação de uma Implantação de API e Atualizando um Gateway de API.
- (Opcional) Confirme se a API foi implantada com êxito, chamando-a (consulte Chamando uma API Implantada em um Gateway de API).
Observações sobre o Uso de Funções de Autorizador de Vários Argumentos e Tokens de Acesso
Observações sobre o Armazenamento em Cache dos Resultados da Função de Autorizador de Vários Argumentos
Ao usar funções de autorizador, o gateway de API armazena internamente a resposta da função de autorizador em cache por padrão. O armazenamento em cache da resposta permite que a resposta seja reutilizada posteriormente para responder a uma solicitação de autenticação semelhante, sem chamar a função de autorizador novamente.
Para identificar exclusivamente uma resposta em cache retornada por uma função de autorizador para uma solicitação de autenticação, o gateway de API usa uma chave de cache derivada dos argumentos e valores de argumentos passados para a função de autorizador que provocou a resposta. Se os valores de argumento e argumento de uma solicitação de autenticação subsequente corresponderem a uma chave de cache, a resposta armazenada no cache será usada em vez de chamar a função de autorizador desnecessariamente.
No caso de funções de autorizador com vários argumentos, por padrão, todos os argumentos e valores de argumento (exceto para um argumento com um valor da tabela de contexto request.body
) passados para a função de autorizador são usados para criar a chave de cache. No entanto, você pode personalizar os argumentos e os valores de argumentos usados para criar a chave de cache, de modo que a chave de cache só inclua os argumentos e os valores de argumentos especificados. Observe que, se você remover argumentos e valores de argumentos da chave de cache, poderá introduzir o risco de uma solicitação de autenticação inválida recebida corresponder à chave de cache de uma resposta anterior a uma solicitação autenticada com sucesso. Só remova argumentos da chave de cache se tiver certeza de que os argumentos não desempenham nenhum papel na autenticação da solicitação.
Observações sobre Políticas de Falha de Validação e o Tratamento de Respostas de Autenticação com Falha das Funções do Autorizador de Vários Argumentos
Ao usar uma função de autorizador de vários argumentos, você pode definir uma política de falha de validação. Uma política de falha de validação permite personalizar o código de status HTTP, a mensagem e os cabeçalhos de resposta que o gateway de API envia a um cliente de API no caso de uma resposta de autenticação com falha de uma função de autorizador com vários argumentos.
Uma função de autorizador de vários argumentos deve retornar uma resposta HTTP 200 (com o corpo JSON da resposta contendo "active": false
e um cabeçalho WWW-Authenticate
) se um token de acesso tiver sido verificado com sucesso com um provedor de identidades, mas o provedor de identidades tiver determinado que o token é inválido,
Se a função de autorizador retornar uma resposta HTTP 200 com "active": false
no corpo da resposta, por padrão, o gateway de API enviará um código de status HTTP 401 para o cliente de API (junto com o cabeçalho WWW-Authenticate
na resposta). No entanto, você pode definir uma política de falha de validação para especificar outro código de status HTTP a ser retornado e para especificar uma mensagem personalizada a ser retornada no corpo da resposta.
Você também pode incluir uma política de resposta de transformação de cabeçalho em uma política de falha de validação para modificar o cabeçalho da resposta que o gateway de API retorna ao cliente de API. Ao incluir uma política de resposta de transformação de cabeçalho em uma política de falha de validação, você pode:
- limitar os cabeçalhos incluídos em uma resposta
- alterar o nome de um cabeçalho incluído em uma resposta (mantendo seu valor original)
- adicionar um novo cabeçalho a uma resposta (ou alterar ou manter os valores de um cabeçalho existente já incluído em uma resposta)
Para obter mais informações sobre como adicionar uma política de falha de validação, consulte Editando um Arquivo JSON para Adicionar Políticas de Solicitação para Autenticação e Autorização de Vários Argumentos.
Exemplo de Especificação de Implantação Usando Tokens de Acesso com Vários Argumentos
A seguinte especificação de implantação de API define:
- Uma política de solicitação de autenticação que chama uma função de autorizador de vários argumentos para executar a autenticação.
- Uma política de solicitação de autorização que especifica o que os usuários finais autenticados podem fazer.
{
"requestPolicies": {
"authentication": {
"type": "CUSTOM_AUTHENTICATION",
"functionId": "ocid1.fnfunc.oc1.phx.aaaaaaaaac2______kg6fq",
"isAnonymousAccessAllowed": true,
"parameters": {
"xapikey": "request.headers[X-Api-Key]",
"referer": "request.headers[Referer]",
"state": "request.query[state]",
"city": "request.query[city]",
"cert": "request.cert",
"body": "request.body",
"host": "request.host"
},
"cacheKey": [
"xapikey", "referer"
],
"validationFailurePolicy": {
"type": "MODIFY_RESPONSE",
"responseCode": "request.auth[responseCode]",
"responseMessage": "Unfortunately, authentication failed.",
"responseTransformations": {
"headerTransformations": {
"setHeaders": {
"items": [
{
"name": "Location",
"values": [
"${request.auth[location]}"
]
}
]
},
"filterHeaders": {
"type": "BLOCK",
"items": [
{
"name": "topSecret"
}
]
}
}
}
}
}
},
"routes": [
{
"path": "/hello",
"methods": ["GET"],
"backend": {
"type": "ORACLE_FUNCTIONS_BACKEND",
"functionId": "ocid1.fnfunc.oc1.phx.aaaaaaaaab______xmq"
},
"requestPolicies": {
"authorization": {
"type": "ANY_OF",
"allowedScope": [ "read:hello" ]
}
}
}
]
}
A política de solicitação de autenticação nesta especificação de implantação de API:
- Especifica a função de autorizador de vários argumentos a ser chamada para executar a autenticação e define os argumentos
xapikey
,referer
,state
,city
,cert
,body
ehost
a serem passados para a função de autorizador. Os valores desses argumentos são obtidos de variáveis de contexto que têm valores da solicitação original. - Define uma chave de cache personalizada para identificar exclusivamente a resposta em cache retornada da função de autorizador. Em vez de usar a chave de cache padrão (que inclui todos os argumentos enviados à função de autorizador e é recomendado), essa política de solicitação de autenticação especifica que a chave de cache deve incluir apenas os valores dos argumentos
xapikey
ereferrer
passados para a função de autorizador. - Inclui uma política de falha de validação que modifica a resposta de falha de validação padrão para substituir o código de status HTTP 401 padrão pelo valor da variável de contexto
request.auth[responseCode]
. A variável de contextorequest.auth[responseCode]
tem o valor de um parâmetro de autenticação (nesse caso, chamadoresponseCode
) retornado pela função de autorizador. Da mesma forma, a mensagem de falha de validação padrão é substituída por uma string de mensagem personalizada ("Unfortunately, authentication failed."
). - Inclui uma política de solicitação de transformação de cabeçalho na política de falha de validação que adiciona o cabeçalho
location
à resposta de falha de validação. O cabeçalholocation
recebe o valor da variável de contextorequest.auth[location]
, que tem o valor de um parâmetro de autenticação (neste caso, chamadolocation
) retornado pela função de autorizador. A política de solicitação de transformação de cabeçalho também remove cabeçalhos chamadostopSecret
da resposta.
A política de solicitação de autorização nesta especificação de implantação de API só permite que usuários finais autenticados pela função de autorizador e com o escopo read:hello
acessem a rota /hello
.
Adicionando Políticas de Solicitação de Autenticação e Autorização para Tokens de Acesso de Argumento Único e Funções de Autorizador
Você pode adicionar políticas de solicitação para fornecer autenticação e autorização usando tokens de acesso de argumento único e funções de autorizador de argumento único:
A Oracle recomenda o uso de funções de autorizador com vários argumentos em vez de funções de autorizador com argumento único por causa de sua versatilidade adicional. As funções de autorizador de argumento único foram fornecidas em versões anteriores e continuam a ser suportadas. No entanto, como as funções de autorizador de vários argumentos também podem aceitar tokens de acesso de argumento único contidos nos cabeçalhos de solicitação e no parâmetro de consulta, não há motivo para criar novas funções de autorizador de argumento único. Além disso, as funções de autorizador de argumento único estão planejadas para descontinuação em uma versão futura.
Usando a Console para Adicionar Políticas de Solicitação de Autenticação e Autorização de Argumento Único
Para adicionar políticas de solicitação de autenticação e autorização para tokens de acesso de argumento único a uma especificação de implantação de API usando a Console:
-
Crie ou atualize uma implantação de API usando a Console. Selecione a opção Totalmente Nova e insira os detalhes na página Informações Básicas.
Para obter mais informações, consulte Implantando uma API em um Gateway de API por meio da Criação de uma Implantação de API e Atualizando um Gateway de API.
- Selecione Próximo para exibir a página Autenticação.
-
Selecione Autenticação Única para especificar que você deseja usar um único servidor de autenticação para todas as solicitações.
Estas instruções pressupõem que você deseja usar um único servidor de autenticação. Como alternativa, se você quiser usar vários servidores de autenticação, selecione Multiautenticação e siga as instruções em Usando a Console para Adicionar Vários Servidores de Autenticação à mesma Implantação de API.
-
Marque ou desmarque a caixa de seleção Ativar Acesso Anônimo: para especificar se os usuários finais não autenticados (ou seja, anônimos) podem acessar rotas na implantação de API.
Por padrão, essa opção não está selecionada. Se você nunca quiser que usuários anônimos possam acessar rotas, não selecione essa opção. Observe que, se você selecionar essa opção, também precisará especificar explicitamente cada rota para a qual o acesso anônimo é permitido, selecionando Anônimo como o Tipo de Autorização em cada política de autorização da rota.
- Selecione Função do autorizador na lista de opções Tipo de autenticação.
- Especifique a função de autorizador de argumento único a ser usada para autenticar o token de acesso de argumento único:
- Aplicativo Oracle Functions no <compartment-name>: O nome do aplicativo no OCI Functions que contém a função de autorizador. Você pode selecionar um aplicativo de outro compartimento.
- Nome da Função: O nome da função de autorizador no OCI Functions.
- Selecione Função de autorizador de argumento único para especificar que você deseja passar um token de acesso de argumento único em um cabeçalho ou parâmetro de consulta para uma função de autorizador de argumento único.
- No painel Token de acesso, identifique o token de acesso a ser usado para autenticação:
- Local do token: Selecione Cabeçalho ou Parâmetro de Consulta para especificar o local do token de acesso na solicitação.
- Nome do cabeçalho do token ou Nome do Parâmetro do Token: Dependendo do local do token de acesso, informe o nome do cabeçalho ou do parâmetro de consulta que contém o token de acesso.
-
Selecione Próximo para informar detalhes de rotas individuais na implantação de API na página Rotas.
-
Na seção Rota 1, especifique a primeira rota na implantação de API que mapeia um caminho e um ou mais métodos para um serviço de back-end:
-
Caminho: Um caminho para chamadas de API usando os métodos listados para o serviço de back-end. Observe que o caminho da rota que você especificar:
- é relativo ao prefixo do caminho de implantação
- deve ser precedido por uma barra ( / ) e pode ser apenas uma barra
- pode conter várias barras (desde que elas não sejam adjacentes) e pode terminar com uma barra
- pode incluir caracteres alfanuméricos maiúsculos e minúsculos
- pode incluir os caracteres especiais
$ - _ . + ! * ' ( ) , % ; : @ & =
- pode incluir parâmetros e curingas (consulte Adicionando Parâmetros de Caminho e Curingas a Caminhos de Rota)
- Métodos: Um ou mais métodos aceitos pelo serviço de back-end, separados por vírgulas. Por exemplo,
GET, PUT
. -
Adicionar um único backend ou Adicionar vários backends: Se todas as solicitações devem ser roteadas para o mesmo back-end ou para rotear solicitações para diferentes back-ends de acordo com a variável de contexto e as regras informadas.
Essas instruções pressupõem que você deseja usar um único back-end; portanto, selecione Adicionar um único backend. Como alternativa, se você quiser usar back-ends diferentes, selecione Adicionar vários back-ends e siga as instruções em Usando a Console para Adicionar Seleção de Back-End Dinâmico a uma Especificação de Implantação de API.
-
Tipo de backend: O tipo do serviço de backend, como:
- HTTP: Para um back-end de HTTP, você também precisa especificar um URL, detalhes de timeout e se deve desativar a verificação SSL (consulte Adicionando um URL HTTP ou HTTPS como um Back-End do Serviço API Gateway).
- Oracle Functions: Para um back-end do OCI Functions, você também precisa especificar o aplicativo e a função (consulte Adicionando uma Função no OCI Functions como um Back-End do Serviço API Gateway).
- Resposta Padrão: Para um back-end de resposta padrão, você também precisa especificar o código de status HTTP, o conteúdo no corpo da resposta e um ou mais campos de cabeçalho HTTP (consulte Adicionando Respostas Padrão como um Back-End do Serviço API Gateway).
-
-
Para especificar uma política de autorização que se aplique a uma rota individual, selecione Mostrar Políticas de Solicitação de Rota, selecione o botão Adicionar ao lado de autorização e especifique:
-
Tipo de Autorização: Como conceder acesso à rota. Especifique:
- Qualquer um: Só concede acesso a usuários finais que foram autenticados com sucesso, desde que a função de autorizador também tenha retornado um dos escopos de acesso especificados no campo Escopo Permitido. Nesse caso, a opção Ativar Acesso Anônimo da política de autenticação não tem efeito.
- Anônimo: Concede acesso a todos os usuários finais, mesmo que eles não tenham sido autenticados com sucesso pela função de autorizador. Nesse caso, você deve ter selecionado a opção Ativar Acesso Anônimo da política de autenticação.
- Somente autenticação: Só concede acesso a usuários finais que foram autenticados com sucesso pela função de autorizador. Nesse caso, a opção Ativar Acesso Anônimo da política de autenticação não tem efeito.
- Escopo Permitido: Se você tiver selecionado Qualquer um como o Tipo de Autorização, insira uma lista delimitada por vírgulas de uma ou mais strings que correspondam aos escopos de acesso retornados pela função de autorizador. O acesso só será concedido aos usuários finais que foram autenticados com sucesso se a função de autorizador retornar um dos escopos de acesso especificados. Por exemplo,
read:hello
Observação
Se você não incluir uma política de autorização para uma rota específica, o acesso será concedido como se tal política existisse e o Tipo de Autorização estivesse definido como Somente autenticação. Em outras palavras, independentemente da definição da opção Ativar Acesso Anônimo da política de autenticação:
- somente usuários finais autenticados podem acessar a rota
- todos os usuários finais autenticados podem acessar a rota, independentemente dos escopos de acesso retornados pela função de autorizador
- usuários finais anônimos não podem acessar a rota
-
- Selecione Próximo para revisar os detalhes informados para a implantação de API.
- Selecione Criar ou Salvar Alterações para criar ou atualizar a implantação de API.
- (Opcional) Confirme se a API foi implantada com êxito, chamando-a (consulte Chamando uma API Implantada em um Gateway de API).
Editando um Arquivo JSON para Adicionar Políticas de Solicitação de Autenticação e Autorização de um Único Argumento
Para adicionar políticas de solicitação de autenticação e autorização para tokens de acesso de argumento único a uma especificação de implantação de API em um arquivo JSON:
-
Usando seu editor de JSON preferido, edite a especificação de implantação de API existente à qual você deseja adicionar a funcionalidade de autenticação e autorização ou crie uma nova especificação de implantação de API (consulte Criando uma Especificação de Implantação de API).
No mínimo, a especificação de implantação de API incluirá uma seção
routes
contendo:- Um caminho. Por exemplo,
/hello
- Um ou mais métodos. Por exemplo,
GET
- Uma definição de um back-end. Por exemplo, um URL ou o OCID de uma função no OCI Functions.
Por exemplo, a seguinte especificação básica de implantação de API define uma função simples sem servidor Hello World no OCI Functions como um único back-end:
{ "routes": [ { "path": "/hello", "methods": ["GET"], "backend": { "type": "ORACLE_FUNCTIONS_BACKEND", "functionId": "ocid1.fnfunc.oc1.phx.aaaaaaaaab______xmq" } } ] }
- Um caminho. Por exemplo,
-
Adicione uma política de solicitação
authentication
que se aplique a todas as rotas na especificação de implantação de API:-
Insira uma seção
requestPolicies
antes da seçãoroutes
, se ainda não existir uma. Por exemplo:{ "requestPolicies": {}, "routes": [ { "path": "/hello", "methods": ["GET"], "backend": { "type": "ORACLE_FUNCTIONS_BACKEND", "functionId": "ocid1.fnfunc.oc1.phx.aaaaaaaaab______xmq" } } ] }
-
Adicione a seguinte política
authentication
à nova seçãorequestPolicies
.{ "requestPolicies": { "authentication": { "type": "<type-value>", "isAnonymousAccessAllowed": <true|false>, "functionId": "<function-ocid>", <"tokenHeader"|"tokenQueryParam">: <"<token-header-name>"|"<token-query-param-name>"> } }, "routes": [ { "path": "/hello", "methods": ["GET"], "backend": { "type": "ORACLE_FUNCTIONS_BACKEND", "functionId": "ocid1.fnfunc.oc1.phx.aaaaaaaaab______xmq" } } ] }
em que:
-
<type-value>
é o tipo de autenticação. Para usar uma função de autorizador para autenticação, especifiqueCUSTOM_AUTHENTICATION
. "isAnonymousAccessAllowed": <true|false>
indica opcionalmente se usuários finais não autenticados (ou seja, anônimos) podem acessar rotas na especificação de implantação de API. Se você nunca quiser que usuários finais anônimos possam acessar rotas, defina essa propriedade comofalse
. Se você não incluir essa propriedade na políticaauthentication
, o padrãofalse
será usado. Observe que, se você não incluir essa propriedade e defini-la comotrue
, também precisará especificar explicitamente cada rota para a qual o acesso anônimo é permitido, definindo a propriedadetype
como"ANONYMOUS"
na políticaauthorization
de cada rota.-
<function-ocid>
é o OCID da função de autorizador implantada no OCI Functions. <"tokenHeader"|"tokenQueryParam">: <"<token-header-name>"|"<token-query-param-name>">
indica se é um cabeçalho de solicitação que contém o token de acesso (e, em caso afirmativo, o nome do cabeçalho) ou um parâmetro de consulta que contém o token de acesso (e, em caso afirmativo, o nome do parâmetro de consulta). Observe que você pode especificar"tokenHeader": "<token-header-name>"
ou"tokenQueryParam": "<token-query-param-name>">
, mas não ambos.
Por exemplo, a seguinte política
authentication
especifica uma função do OCI que validará o token de acesso no cabeçalho de solicitação de Autorização:{ "requestPolicies": { "authentication": { "type": "CUSTOM_AUTHENTICATION", "isAnonymousAccessAllowed": false, "functionId": "ocid1.fnfunc.oc1.phx.aaaaaaaaac2______kg6fq", "tokenHeader": "Authorization" } }, "routes": [ { "path": "/hello", "methods": ["GET"], "backend": { "type": "ORACLE_FUNCTIONS_BACKEND", "functionId": "ocid1.fnfunc.oc1.phx.aaaaaaaaab______xmq" } } ] }
-
-
-
Adicione uma política de solicitação
authorization
para cada rota na especificação de implantação de API:-
Insira uma seção
requestPolicies
após a primeira seçãobackend
da rota, se ainda não existir. Por exemplo:{ "requestPolicies": { "authentication": { "type": "CUSTOM_AUTHENTICATION", "isAnonymousAccessAllowed": false, "functionId": "ocid1.fnfunc.oc1.phx.aaaaaaaaac2______kg6fq", "tokenHeader": "Authorization" } }, "routes": [ { "path": "/hello", "methods": ["GET"], "backend": { "type": "ORACLE_FUNCTIONS_BACKEND", "functionId": "ocid1.fnfunc.oc1.phx.aaaaaaaaab______xmq" }, "requestPolicies": {} } ] }
-
Adicione a seguinte política
authorization
à seçãorequestPolicies
:{ "requestPolicies": { "authentication": { "type": "CUSTOM_AUTHENTICATION", "isAnonymousAccessAllowed": false, "functionId": "ocid1.fnfunc.oc1.phx.aaaaaaaaac2______kg6fq", "tokenHeader": "Authorization" } }, "routes": [ { "path": "/hello", "methods": ["GET"], "backend": { "type": "ORACLE_FUNCTIONS_BACKEND", "functionId": "ocid1.fnfunc.oc1.phx.aaaaaaaaab______xmq" }, "requestPolicies": { "authorization": { "type": <"AUTHENTICATION_ONLY"|"ANY_OF"|"ANONYMOUS">, "allowedScope": [ "<scope>" ] } } } ] }
em que:
-
"type": <"AUTHENTICATION_ONLY"|"ANY_OF"|"ANONYMOUS">
indica como conceder acesso à rota:"AUTHENTICATION_ONLY"
: Só concede acesso a usuários finais que foram autenticados com sucesso. Nesse caso, a propriedade"isAnonymousAccessAllowed"
na políticaauthentication
da especificação de implantação de API não tem efeito."ANY_OF"
: Só concede acesso a usuários finais que foram autenticados com sucesso, desde que a função de autorizador também tenha retornado um dos escopos de acesso especificados na propriedadeallowedScope
. Nesse caso, a propriedade"isAnonymousAccessAllowed"
na políticaauthentication
da especificação de implantação de API não tem efeito."ANONYMOUS"
: Concede acesso a todos os usuários finais, mesmo que eles não tenham sido autenticados com sucesso. Nesse caso, você deve definir explicitamente a propriedade"isAnonymousAccessAllowed"
comotrue
na políticaauthentication
da especificação de implantação de API.
-
"allowedScope": [ "<scope>" ]
é uma lista delimitada por vírgulas de uma ou mais strings que correspondem aos escopos de acesso retornados pela função de autorizador. Nesse caso, você deve definir a propriedadetype
como"ANY_OF"
(a propriedade"allowedScope"
será ignorada se a propriedadetype
estiver definida como"AUTHENTICATION_ONLY"
ou"ANONYMOUS"
). Observe também que, se você especificar mais de um escopo, o acesso à rota será concedido se qualquer um dos escopos especificados for retornado pela função de autorizador.
Por exemplo, a política de solicitação a seguir define uma rota
/hello
que só permite que usuários finais autenticados com o escoporead:hello
a acessem:{ "requestPolicies": { "authentication": { "type": "CUSTOM_AUTHENTICATION", "isAnonymousAccessAllowed": false, "functionId": "ocid1.fnfunc.oc1.phx.aaaaaaaaac2______kg6fq", "tokenHeader": "Authorization" } }, "routes": [ { "path": "/hello", "methods": ["GET"], "backend": { "type": "ORACLE_FUNCTIONS_BACKEND", "functionId": "ocid1.fnfunc.oc1.phx.aaaaaaaaab______xmq" }, "requestPolicies": { "authorization": { "type": "ANY_OF", "allowedScope": [ "read:hello" ] } } } ] }
-
- Adicione uma política de solicitação
authorization
para todas as rotas restantes na especificação de implantação de API.
Observação
Se você não incluir uma política
authorization
para uma rota específica, o acesso será concedido como se tal política não existisse e a propriedadetype
estivesse definida como"AUTHENTICATION_ONLY"
. Em outras palavras, independentemente da definição da propriedadeisAnonymousAccessAllowed
na políticaauthentication
da especificação de implantação de API:- somente usuários finais autenticados podem acessar a rota
- todos os usuários finais autenticados podem acessar a rota, independentemente dos escopos de acesso retornados pela função de autorizador
- usuários finais anônimos não podem acessar a rota
-
- Salve o arquivo JSON que contém a especificação de implantação de API.
-
Use a especificação de implantação de API ao criar ou atualizar uma implantação de API das seguintes formas:
- especificando o arquivo JSON na Console quando você selecionar a opção Carregar uma API existente
- especificando o arquivo JSON em uma solicitação à API REST do serviço API Gateway
Para obter mais informações, consulte Implantando uma API em um Gateway de API por meio da Criação de uma Implantação de API e Atualizando um Gateway de API.
- (Opcional) Confirme se a API foi implantada com êxito, chamando-a (consulte Chamando uma API Implantada em um Gateway de API).