Funções: Validar uma Chave de API com o API Gateway
Neste tutorial, você usa o Oracle Functions para validar uma chave de API transmitida do Oracle API Gateway. Uma chave de API é um método simples para proteger uma API exigindo que o cliente especifique um determinado token. O gateway pode usar o token como um autorizador personalizado para validar solicitações. Você cria uma função Python que valida o token e retorna uma resposta JSON autenticada.
As principais tarefas incluem:
- Reúna as informações necessárias.
- Crie um aplicativo para sua função.
- Crie uma função "Hello World!".
- Converta sua função para validar a chave da API.
- Implemente e teste sua função.
- Criar um Gateway de API para sua função
- Chame sua função pela internet usando seu Gateway de API.
Para obter informações adicionais, consulte:
Antes de Começar
Para executar este tutorial com sucesso, você precisa ter o seguinte:
- Uma conta do Oracle Cloud Infrastructure paga. Consulte Cadastrando-se no Oracle Cloud Infrastructure.
- Sua conta do OCI configurada para suportar o desenvolvimento do Oracle Functions. Consulte Início Rápido do Oracle Functions no Cloud Shell.
- Conclusão de um dos dois tutoriais de introdução do Oracle Functions.
- A conclusão de um dos dois tutoriais resulta em:
- O Oracle Functions está instalado e configurado para criar aplicativos e implantar funções.
- O Oracle Registry é configurado para armazenar imagens de funções.
- O Docker é conectado ao Oracle Registry.
- A VCN necessária e os recursos obrigatórios necessários para o Oracle Functions.
- Um par de chaves de API e um token de autenticação.
CLI da Oracle
- Python 3.6+ e pip3.
- Mecanismo Docker: um computador Linux ou uma VM Linux. Consulte Requisitos do mecanismo Docker para ver as versões e distribuições suportadas.
- Docker Desktop: Disponível para MacOS ou Windows 10.
- Windows 10: atualização 2004 do Windows 10 com WSL 2 e Ubuntu ou outra distribuição instalada.
- Consulte Windows Subsystem for Linux Installation Guide for Windows 10.
- Instale o Docker Desktop para Windows 10.
Observação
O Docker inclui suporte especial ao Linux para WSL 2 no Windows 10 atualização 2004. - MacOS: Consulte Install Docker Desktop for MacOS.
- Windows 10: atualização 2004 do Windows 10 com WSL 2 e Ubuntu ou outra distribuição instalada.
Oracle Cloud Shell
- Se você usar o Cloud Shell, a lista anterior de software já estará instalada.
1. Reunir as Informações Necessárias
Recolha todas as informações necessárias para concluir o tutorial. Copie as informações a seguir no seu bloco de notas.
Para criar um compartimento, consulte Criar um compartimento. Depois que seu compartimento for criado, salve o OCID e o nome do compartimento.
Para obter o OCID do compartimento de um compartimento existente:
- Abra o menu de navegação e clique em Identidade e Segurança. Em Identidade, clique em Compartimentos.
- Selecione seu compartimento.
- Clique no link Copiar do campo OCID.
Salve o OCID e o nome do compartimento.
Verifique se você tem as seguintes informações anotadas para o tutorial.
-
Nome do Compartimento:
<your-compartment-name>Exemplo:
my-compartment -
ID do Compartimento:
<your-compartment-OCID>Exemplo:
ocid1.compartment.oc1.aaaaaaa... -
Nome da VCN:
<your-vcn-name>Exemplo:
my-vcnAbra o menu de navegação e clique em Networking. Em seguida, clique em Virtual Cloud Networks.
-
Nome da Sub-rede Pública da VCN:
<Public-Subnet-your-vcn-name>Exemplo:
Public-Subnet-my-vcnAbra o menu de navegação e clique em Networking. Em seguida, clique em Virtual Cloud Networks. Clique na VCN criada.
2. Executar Configuração Obrigatória
Execute toda a configuração necessária para o tutorial.
Para criar um aplicativo, siga estas etapas.
- Abra o menu de navegação e clique em Serviços ao Desenvolvedor. Em Funções, clique em Aplicativos.
- Selecione seu compartimento na lista suspensa Compartimento.
- Clique em Criar Aplicativo.
- Preencha os dados do form.
- Nome:
<your-app-name> - VCN:
<your-vcn-name> - Sub-redes:
<Public-Subnet-your-vcn-name>
- Nome:
- Clique em Criar.
Seu aplicativo foi criado.
- Abra o menu de navegação e clique em Networking. Em seguida, clique em Virtual Cloud Networks.
- Clique no nome da VCN que você usou para seu aplicativo Oracle Functions.
- Com sua nova VCN exibida, clique no link de sub-rede Pública.
As informações da sub-rede pública são exibidas com as Listas de Segurança na parte inferior da página.
- Clique no link Lista de Segurança Padrão ou no link da lista de segurança apropriado.
As Regras de Entrada padrão da sua VCN são exibidas.
- Clique em Adicionar Regras de Entrada.
Uma caixa de diálogo Adicionar Regras de Entrada é exibida.
- Preencha a regra de entrada com as informações a seguir. Depois que todos os dados forem inseridos, clique em Adicionar Regras de Entrada
Preencha a regra de entrada da seguinte forma:
- Sem monitoramento de estado: Marcado
- Tipo de Origem: CIDR
- CIDR de Origem: 0.0.0.0/0
- Protocolo IP: TCP
- Intervalo de Portas de Origem: (leave-blank)
- Faixa de Portas de Destino: 443
- Descrição: VCN para aplicativos
Depois que você clicar em Adicionar Regra de Entrada, serão permitidas conexões HTTPS à sua sub-rede pública.
Em seguida, configure uma política que permita que o API Gateway chame funções.
Primeiro, crie um Grupo Dinâmico para o API Gateway.
- Abra o menu de navegação e clique em Identidade e Segurança. Em Identity, clique em Dynamic Groups.
- Clique em Criar Grupo Dinâmico.
- Preencha as informações a seguir para definir seu grupo dinâmico.
- Nome:
<name-for-your-dynamic-group> - Em Regras de Correspondência, use a Regra 1:
<the-rule-text>.
Aqui está o nome da amostra e a regra que você precisa preencher.
- Nome: api-gtw-func-dynamic-group
- Em Regras de Correspondência, use a Regra 1:
ALL {resource.type = 'ApiGateway', resource.compartment.id = 'ocid1.compartment.<your-compartment-OCID>'}
- Nome:
- Clique em Criar.
Agora crie a política para o API Gateway.
- Abra o menu de navegação e clique em Identidade e Segurança. Em Identidade, clique em Políticas.
- Clique em Criar Política.
- Para definir sua política, preencha as informações a seguir.
- Nome:
<name-for-your-policy> - Descrição:
<description-for policy> - Compartimento:
<name-of-functions-compartment>
Para a seção Criador de Política:
- Clique em Mostrar editor manual.
- Informe a política na caixa de texto, por exemplo:
Allow dynamic-group api-gtw-func-dynamic-group to use functions-family in compartment <your-compartment-name>Observação
O último parâmetro é o nome do compartimento, não o OCID do compartimento.
- Nome:
- Clique em Criar.
Você criou uma política para permitir que o API Gateway use Funções.
- Abra um terminal.
- Crie um diretório para armazenar suas funções e passe para esse diretório.
mkdir my-dir-name cd my-dir-name - Crie uma função "Hello World" do Python com Fn.
fn init --runtime python my-func-nameEsse comando cria um diretório chamado
my-func-namecom a função e os arquivos de configuração nele. - Passe para o diretório.
- Implante a função.
fn -v deploy --app your-app-nameVárias mensagens são exibidas à medida que as imagens do Docker são criadas, enviadas para o OCIR e por fim implantadas no Oracle Functions.
- Chame a função.
fn invoke your-app-name my-func-nameRetorna:
{"message": "Hello World"} - Chame a função com um parâmetro.
echo -n '{"name":"Bob"}' | fn invoke your-app-name my-func-nameRetorna:
{"message": "Hello Bob"}
3. Criar um Gateway de API
Para chamar sua função, crie um Gateway de API.
Para criar um Gateway de API:
- Abra o menu de navegação e clique em Serviços ao Desenvolvedor. Em Gerenciamento de API, clique em Gateways.
- Selecione seu compartimento na lista suspensa Compartimento.
- Clique em Criar Gateway
- Preencha as informações a seguir para definir seu Gateway de API.
- Nome:
<your-gateway-name> - Tipo:
<Public> - Compartimento:
<your-compartment-name> - Rede Virtual na Nuvem em <your-vcn-name>:
<select-your-vcn> - Sub-rede em <your-compartment-name:
<your-public-subnet-name>
- Nome:
- Clique em Criar. Aguarde alguns minutos para que o seu Gateway de API seja criado.
Em seguida, crie uma implantação para seu Gateway de API.
- Clique em Implantações na seção Recursos do lado esquerdo da tela.
- Clique em Criar Implantação.
- Certifique-se de que Totalmente Novo esteja selecionado para o tipo de implantação.
- Para definir sua implantação, preencha a seção Informações Básicas.
- Nome:
<your-deployment-name> - Prefixo de Caminho (exemplo):
/tokens - Compartimento:
<your-compartment-name> - Políticas de Solicitação de API: Utilizar valores padrão
- Políticas de Registro em Log de API: Utilizar valor padrão de Informações
- Nome:
- Clique em Próximo. A caixa de diálogo Rotas é exibida com a opção Rota 1 selecionada.
- Para definir sua rota, preencha a seção Rota 1.
- Campo:
<your-route-path>Exemplo:
/val-token - Métodos:
GET POST - Tipo: Oracle Functions
- Aplicativo em <your-compartment-name>: Selecione o aplicativo Functions criado.
- Nome da Função: Selecione a função que você criou na seção de configuração.
- Campo:
- Clique em Próximo. A caixa de diálogo Revisar é exibida, resumindo as opções feitas.
- Clique em Criar. Sua implantação é criada.
- Clique no link Implantações do seu gateway. Copie o ponto final base da implantação criada.
Por exemplo:
https://aaaaa.apigateway.us-ashburn-X.oci.customer-oic.com/tokens
Com o Gateway de API e a implantação criados, agora você pode testar a instalação. Crie um script simples para o comando curl. Para criar o URL para curl, adicione seu caminho de implantação ao seu ponto final.
- Crie o arquivo de script:
touch gtw01.sh && chmod 755 gtw01.sh - Adicione o comando curl ao arquivo de script:
#!/bin/bash curl <your-api-gateway-endpoint>/val-token - O comando retorna:
{"message":"Hello World"}
Você conectou seu Gateway de API a uma função Python com texto padronizado. Em seguida, você atualiza sua função Python para exibir informações transmitidas em uma solicitação HTTP.
4. Atualizar Função para Validar a Chave da API
Em seguida, modifique a função Python de texto padronizado para validar uma chave de API.
Se você observar a função de texto padronizado, sua função Python será semelhante a esta.
import io
import json
import logging
from fdk import response
def handler(ctx, data: io.BytesIO = None):
name = "World"
try:
body = json.loads(data.getvalue())
name = body.get("name")
except (Exception, ValueError) as ex:
logging.getLogger().info('error parsing json payload: ' + str(ex))
logging.getLogger().info("Inside Python Hello World function")
return response.Response(
ctx, response_data=json.dumps(
{"message": "Hello {0}".format(name)}),
headers={"Content-Type": "application/json"}
)Usando esse código como ponto de partida, as seções que vêm depois convertem a função em uma função Python que valida uma chave de API e retorna um token.
O Oracle Functions permite que você armazene dados de configuração no seu contexto que está disponível em sua solicitação. Os dados de configuração podem ser armazenados em um aplicativo ou em uma função. O comando a seguir armazena a chave de API na configuração do seu aplicativo.
fn config app <your-app-name> FN_API_KEY ABCD
A string "ABCD" é um valor de chave de amostra.
Para obter mais informações sobre como definir valores de configuração da função, consulte o tutorial do Fn Project no contexto de runtime.
Primeiro, atualize o func.py para pacotes necessários.
- Atualize as instruções
importemfunc.pypara a validação de pacotes necessários:import io import json import logging import datetime from datetime import timedelta from fdk import responseO pacote
datetimeé usado para definir um tempo de expiração para o token retornado. - Em seguida, remova o corpo principal da função. O método
responsee o código relacionado são adicionados de volta à medida que avançamos.import io import json import logging import datetime from datetime import timedelta from fdk import response def handler(ctx, data: io.BytesIO = None):
Agora você está pronto para atualizar a função com o código de validação.
Em seguida, adicione o código para validar a chave de API e retornar um token na resposta. Veja a seguir o código com comentários.
import io
import json
import logging
import datetime
from datetime import timedelta
from fdk import response
def handler(ctx, data: io.BytesIO = None):
auth_token = "invalid"
token = "invalid"
apiKey = "invalid"
expiresAt = (datetime.datetime.utcnow() + timedelta(seconds=60)).replace(tzinfo=datetime.timezone.utc).astimezone().replace(microsecond=0).isoformat()
try:
auth_token = json.loads(data.getvalue())
token = auth_token.get("token")
app_context = dict(ctx.Config())
apiKey = app_context['FN_API_KEY']
if token == apiKey:
return response.Response(
ctx,
status_code=200,
response_data=json.dumps({"active": True, "principal": "foo", "scope": "bar", "clientId": "1234", "expiresAt": expiresAt, "context": {"username": "wally"}})
)
except (Exception, ValueError) as ex:
logging.getLogger().info('error parsing json payload: ' + str(ex))
pass
return response.Response(
ctx,
status_code=401,
response_data=json.dumps({"active": False, "wwwAuthenticate": "API-key"})
)
- A função
handlerrecebe informações do sistema sobre a solicitação atual por meio dos parâmetrosctxedata. - A função assume que
FN_API_KEYé definido na configuração do aplicativo. Em seguida, a função compara o valor de configuração com o valor de token enviado da solicitação POSTcurl:-d '{"token":"ABCD"}'. - Se os valores forem correspondentes, uma mensagem JSON de validação será retornada. Se eles não corresponderem, um código 401 será retornado com dados de erro JSON.
O código da função está concluído. Agora você está pronto para testar a função.
- Reimplante a função atualizada.
- Chame a função para garantir que ela esteja funcionando.
- Atualize o script
gtw01.shpara passar os dadosPOSTpara o script./bin/bash curl -X POST -d '{"token":"ABCD"}' https://aaaaa.apigateway.us-ashburn-X.oci.customer-oic.com/tokens/val-token - Execute o script:
gtw01.sh | jq - Se as chaves de API forem correspondentes, a saída do script será semelhante a:
{ "active": true, "principal": "foo", "scope": "bar", "clientId": "1234", "expiresAt": "2020-12-16T22:48:50+00:00", "context": { "username": "wally" } }Se as chaves de API não corresponderem, uma mensagem de erro será retornada.
{ "active": false, "wwwAuthenticate": "API-key" }Você pode fazer download do código-fonte completo para a função no site Amostras do Oracle Function aqui.
Parabéns, você converteu a função Python de texto padronizado em uma nova função que valida uma chave de API. A função demonstra como os dados podem ser passados para o Gateway de API e processados em uma função.
O Que Vem a Seguir
Você criou com sucesso um Gateway de API e chamou uma função dele. Você atualizou a função para validar uma chave de API.
Para explorar mais informações sobre desenvolvimento com produtos Oracle, confira estes sites: