Endpoints HTTPS Personalizados [Obsoleto]HTTPS endpoints
Nesta página
- Estrutura de um Endpoint
- URL base
- Rotas de endpoint
- Métodos de HTTP
- Criar um Endpoint HTTPS Personalizado
- Autenticação
- Autorização
- Escrever uma Função de Endpoint
- Dados da solicitação de acesso
- Retornar uma Resposta HTTPS
- Exemplo
- Chamar um Endpoint Personalizado
- Escolher um Formato de Dados de Resposta
- Autenticar a Solicitação
- Autorizar a Solicitação
Você pode definir pontos de conexão HTTPS personalizados para criar rotas de API específicas da aplicação ou webhooks que se integram a serviços externos. Um ponto de conexão personalizado usa uma função sem servidor que você escreve para lidar com as solicitações recebidas para uma URL e um método HTTP específicos.
Observação
Os HTTPS endpoints personalizados não são permitidos em endpoints privados.
Os pontos de conexão usam requisições HTTPS padrão e criptografadas, o que significa que você não precisa instalar nenhum driver de banco de dados ou bibliotecas opinativas para chamá-los. Em vez disso, você envia solicitações como essa de qualquer cliente HTTP:
curl -s "https://data.mongodb-api.com/app/myapp-abcde/endpoint/hello" \ -X POST \ -H "Accept: application/json" \ -H "apiKey: TpqAKQgvhZE4r6AOzpVydJ9a3tB1BLMrgDzLlBLbihKNDzSJWTAHMVbsMoIOpnM6" \ -d '{ "name": "Casey" }'
Estrutura de um Endpoint
Um endpoint lida com um ou mais métodos HTTP enviados para uma URL específica.
URL base
Os pontos de conexão em uma aplicação compartilham uma URL base. A URL usa seu ID da aplicação para apontar exclusivamente para sua aplicação.
Aplicações implantadas globalmente utilizam o seguinte formato:
https://data.mongodb-api.com/app/<App ID>/endpoint
Os pontos de extremidade em um aplicativo implantado localmente usam uma URL base específica para a região de sistema do aplicativo (por exemplo, us-east-1
)
https://<Region>.aws.data.mongodb-api.com/app/<App ID>/endpoint
Rotas de endpoint
Cada endpoint HTTPS tem uma rota que serve como nome para o endpoint. A rota de um endpoint é arbitrária e específica para sua aplicação. No entanto, ele aparece no caminho da URL do terminal e, portanto, deve representar a ação que a rota executa.
Os nomes de rota devem começar com uma barra (/
) e podem conter barras adicionais para indicar um caminho agrupado.
/my/nested/route
Você chama um ponto de conexão anexando sua rota à URL base de sua aplicação e enviando uma requisição HTTP.
https://data.mongodb-api.com/app/<App ID>/endpoint/my/nested/route
Métodos de HTTP
Cada endpoint em sua aplicação lida com um ou mais métodos HTTP para determinada rota. Por exemplo, você pode ter uma única rota que aceite solicitações POST
para criar um novo recurso e uma solicitação GET
para listar os recursos existentes.
Você pode definir vários endpoints personalizados que atendem à mesma rota, mas manipulam métodos de solicitação diferentes. Alternativamente, você pode definir um único endpoint para a rota que lida com todos os métodos.
Os endpoints personalizados são compatíveis com os seguintes métodos HTTP padrão:
Criar um Endpoint HTTPS Personalizado
Você pode configurar a API de dados para sua aplicação na UI do App Services ou implantando arquivos de configuração com a App Services CLI:
Clique em HTTPS Endpoints no menu de navegação esquerdo e clique em Add An Endpoint.
Defina o ponto de conexão Route. Os nomes de rota devem começar com uma barra (
/
) e podem conter barras adicionais para indicar um caminho agrupado.Escolha um método HTTP para o endpoint no menu suspenso. Você pode escolher um método específico (por exemplo,
GET
ouPOST
) ou configurar o endpoint para aceitar qualquer método HTTP (comoANY
).Escolha um tipo de resposta, JSON ou EJSON. Você pode habilitar Respond With Result para incluir automaticamente o valor de retorno da função de endpoint como corpo da resposta.
Escreva uma função de ponto de conexão que lide com solicitações para o ponto de conexão. Alternativamente, especifique uma função existente por nome.
Para maior segurança, você pode configurar a autorização de solicitação.
Salve a configuração do Data API.
Configure permissões de acesso para permitir que as solicitações leiam e escrevam dados com segurança.
Salve e implante sua aplicação.
Puxe a versão mais recente do seu aplicativo.
appservices pull --remote="<Your App ID>" Defina um objeto de configuração para o endpoint personalizado.
http_endpoints/config.json[ { "route": "<Endpoint route name>", "http_method": "<HTTP method>", "function_name": "<Endpoint function name", "validation_method": "<Authorization scheme>", "respond_result": <boolean>, "fetch_custom_user_data": <boolean>, "create_user_on_auth": <boolean>, "disabled": <boolean> } ] Defina regras para uma ou mais collections.
data_sources/mongodb-atlas/<db>/<collection>/rules.json{ "database": "<Database Name>", "collection": "<Collection Name>", "roles": [<Role>], "filters": [<Filter>] } Implemente seu aplicativo.
appservices push
Autenticação
Os pontos de conexão personalizados são executados no contexto de um usuário específico, o que permite que sua aplicação aplique regras e valide esquemas de documentos para cada solicitação.
Por padrão, os endpoints usam a Autenticação de Aplicativo, que exige que cada solicitação inclua credenciais para um dos usuários do aplicativo, como uma chave API ou JWT. Você também pode configurar outros esquemas de autenticação personalizados para atender às necessidades do seu aplicativo.
Para ver exemplos de como autenticar solicitações, consulte Autenticar Solicitações de API de Dados.
A autenticação do aplicativo exige que os usuários façam login com um fornecedor de autenticação que você habilitou para sua aplicação. As solicitações podem incluir um token de acesso concedido pelo fornecedor de autenticação ou as credenciais com as quais o usuário faria login (por exemplo, a chave API ou o e-mail e a senha deles).
A autenticação do ID do usuário executa todas as solicitações como um único usuário de aplicação pré-selecionado. Isso é útil se todas as solicitações tiverem as mesmas permissões, independentemente de quem chamou o endpoint.
Para selecionar o usuário, especifique o ID da conta de usuário na configuração do endpoint.
[ { ..., "run_as_user_id": "628e47baf4c2ac2796fc8a91" } ]
A autenticação de script chama uma função para determinar qual usuário do aplicação um pedido é executado. Você pode usar isso para implementar esquemas de autenticação e autorização personalizados.
A função deve retornar um ID da conta de um usuário de aplicação existente como uma string ou { "runAsSystem": true }
para executar a solicitação como um usuário do sistema que tenha acesso total às APIs de Agregação e CRUD do MongoDB e não esteja sujeito a nenhuma regra, função ou permissão limitada.
Para definir a função, especifique o código-fonte na configuração do endpoint.
[ { ..., "run_as_user_id_script_source": "exports = () => {return \"628e47baf4c2ac2796fc8a91\"}" } ]
A autenticação do sistema configura um endpoint para ser executado como um usuário do sistema que não requer credenciais, tem acesso total às APIs de Agregação e CRUD do MongoDB e não está sujeito a nenhuma regra, função ou permissão limitada.
[ { ..., "run_as_system": true } ]
Dica
Os novos endpoints criados na UI usam a autenticação do sistema por padrão.
Autorização
Um ponto de conexão pode exigir que os usuários autenticados forneçam informações adicionais na solicitação. Você define o esquema de autorização para cada ponto de conexão personalizado configurando a função de ponto de conexão.
Os endpoints oferecem suporte nativo a um conjunto de esquemas de autorização internos que usam uma string secreta para provar que a solicitação está autorizada. Você também pode definir um esquema de autorização personalizado que pode ser usado junto com os esquemas integrados ou em vez deles.
Para saber como configurar a autorização para uma função específica, consulte Definir uma função.
Esquemas de autorização integrados
Os endpoints suportam os seguintes esquemas de autorização integrados:
Todos os usuários autenticados estão autorizados a chamar o endpoint. Solicitações autenticadas não precisam incluir informações de autorização.
Os usuários autenticados devem provar que estão autorizados a chamar o endpoint, incluindo uma string específica como valor do parâmetro de query secret
.
Você define a string em um segredo e faz referência ao segredo por nome na configuração do endpoint.
[ { ..., "verification_method": "SECRET_AS_QUERY_PARAM", "secret_name": "secret_verification_string" } ]
Para saber como incluir o segredo em uma solicitação, consulte Autorizar a solicitação.
Os usuários autenticados devem provar que estão autorizados a chamar o endpoint incluindo um cabeçalho Endpoint-Signature
que contém um hash HMAC SHA-256 codificado em hexadecimal gerado a partir do corpo da solicitação e uma string secreta.
Você define a string em um segredo e faz referência ao segredo por nome na configuração do endpoint.
Para saber como assinar suas solicitações, consulte Autorizar a solicitação.
Esquemas de autorização personalizados
Você pode definir uma expressão de autorização personalizada para determinar se uma solicitação autenticada de entrada tem permissão para ser executada. A expressão é avaliada para cada solicitação e deve avaliar como true
para permitir a solicitação. Se a expressão avaliar como false
, a solicitação não é autorizada e ocorre uma falha. As solicitações que passam por uma falha na autorização não são contabilizadas no uso para o faturamento da sua aplicação.
As expressões de autorização podem usar variáveis como %%user
para autorizar com base nos dados do usuário que chama ou %%request
para tomar decisões com base nas especificidades de cada solicitação de entrada.
Para definir um esquema de autorização personalizado, especifique a expressão na configuração da função de ponto de conexão:
[ { ..., "can_evaluate": { "%%request.requestHeaders.x-secret-key": "my-secret" } } ]
Escrever uma Função de Endpoint
Cada endpoint personalizado está associado a uma função executada sempre que o endpoint recebe uma solicitação. Na função, você pode importar bibliotecas de npm, conectar-se a um cluster do Atlas MongoDB vinculado e chamar outras funções sem servidor.
Para definir uma nova função ao criar um ponto de conexão na IU do App Services, navegue até a seção Function e selecione + New Function no menu suspenso.
Dependendo do seu fluxo de trabalho, você também pode definir e editar funções de administrador de pontos de conexão:
Na página Functions da UI do App Services.
No diretório
functions
do seu aplicativo utilizando a CLI do App Services.De seu cliente usando a API de administração.
As funções de endpoint sempre recebem dois argumentos:
Um objeto de Solicitação que permite que você acesse cabeçalhos de solicitação recebidos, parâmetros de query e dados do corpo.
Um objeto de Resposta que você utiliza para configurar a resposta HTTPS enviada de volta para o chamador.
Para uma função de amostra e um exemplo de solicitação e resposta, consulte Exemplo.
Dados da solicitação de acesso
Um objeto de endpoint personalizado Request
representa a solicitação HTTP que chamou o endpoint. Você pode acessar os cabeçalhos, os parâmetros de query e os dados do corpo da solicitação recebida.
{ "headers": { "<Header>": ["<Header Value>"] }, "query": { "<Query Parameter>": "<Parameter Value>" }, "body": <BSON.Binary> }
Campo | Descrição | |||||
---|---|---|---|---|---|---|
query | Um objeto onde cada campo mapeia um parâmetro de consulta de URL para seu valor. Se uma chave for usada diversas vezes na cadeia de consulta, apenas a primeira ocorrência será representada neste objeto. Para trabalhar com a cadeia de consulta completa, utilize context.request.rawQueryString. ExemploO seguinte objeto
| |||||
headers | Um objeto onde cada campo mapeia um nome de cabeçalho da solicitação para uma array de um ou mais valores. Exemplo
| |||||
body | Um objeto BSON.Binary que contém o corpo da solicitação. Se a solicitação não incluir um corpo, esse valor será Para acessar os dados no corpo da solicitação, você precisa serializar o binário:
|
Retornar uma Resposta HTTPS
Um objeto de endpoint personalizado Response
permite configurar a resposta HTTPS enviada de volta para o chamador. Você pode definir o código de status, personalizar cabeçalhos e incluir dados no corpo da resposta.
Método | Descrição | |||||||||
---|---|---|---|---|---|---|---|---|---|---|
setStatusCode(code) - code: number | Defina o código de status da resposta HTTP . Exemplo
| |||||||||
setBody(body) - body: string | BSON.Binary | Defina o corpo da resposta HTTP . Se o Exemplo
| |||||||||
setHeader(name, value) - name: string - value: string | Defina o cabeçalho da resposta HTTP especificada por Exemplo
| |||||||||
addHeader(name, value) - name: string - value: string | Defina a resposta HTTP cabeçalho especificada por Exemplo
|
Exemplo
Considere uma função de endpoint que analisa o corpo de uma solicitação POST
recebida, armazena o corpo analisado em uma coleção MongoDB e, em seguida, responde ao chamador:
exports = async function MyCustomEndpoint(request, response) { try { // 1. Parse data from the incoming request if (request.body === undefined) { throw new Error(`Request body was not defined.`); } const body = JSON.parse(request.body.text()); // 2. Handle the request const { insertedId } = await context.services .get("mongodb-atlas") .db("myDb") .collection("myCollection") .insertOne({ date: new Date(), requestBody: body }); // 3. Configure the response response.setStatusCode(201); // tip: You can also use EJSON.stringify instead of JSON.stringify. response.setBody( JSON.stringify({ insertedId, message: "Successfully saved the request body", }) ); } catch (error) { response.setStatusCode(400); response.setBody(error.message); } };
A função recebe a seguinte solicitação POST
:
curl -s "https://data.mongodb-api.com/app/myapp-abcde/endpoint/custom" \ -X POST \ -H "Accept: application/json" \ -H "apiKey: TpqAKQgvhZE4r6AOzpVydJ9a3tB1BLMrgDzLlBLbihKNDzSJWTAHMVbsMoIOpnM6" \ -d '{ "type": "event", "date": "2024-01-01T00:00:00.000Z", "name": "New Year Begins", "comment": "Happy New Year!" }'
{ "message": "Successfully saved the request body", "insertedId": "639a521bbdec9b85ba94014b" }
Após a função verificar se o corpo da solicitação de entrada está definido, ela armazena o corpo analisado como um novo documento em uma coleção denominada myCollection
. A saída resultante exibe a resposta configurada, que inclui uma mensagem personalizada e o insertedId
.
Chamar um Endpoint Personalizado
Você pode chamar um endpoint personalizado de qualquer cliente HTTPS padrão.
curl -s "https://data.mongodb-api.com/app/myapp-abcde/endpoint/hello" \ -X POST \ -H "Accept: application/json" \ -H "apiKey: TpqAKQgvhZE4r6AOzpVydJ9a3tB1BLMrgDzLlBLbihKNDzSJWTAHMVbsMoIOpnM6" \ -d '{ "name": "Casey" }'
HTTP/1.1 ou superior é necessário ao fazer solicitações.
Escolher um Formato de Dados de Resposta
Uma solicitação pode incluir um cabeçalho Accept
para solicitar um formato de dados específico para o corpo da resposta, JSON ou EJSON. Se uma solicitação não incluir um cabeçalho Accept
válido, a resposta usará o formato de dados padrão especificado na configuração do endpoint
curl -s "https://data.mongodb-api.com/app/myapp-abcde/endpoint/hello/latest" \ -X GET \ -H "Accept: application/ejson" \ -H "apiKey: TpqAKQgvhZE4r6AOzpVydJ9a3tB1BLMrgDzLlBLbihKNDzSJWTAHMVbsMoIOpnM6"
{ "greeting": "Hello, Leafie!", "date": { "$date": { "$numberLong": "1654589430998" } } }
curl -s "https://data.mongodb-api.com/app/myapp-abcde/endpoint/hello/latest" \ -X GET \ -H "Accept: application/json" \ -H "apiKey: TpqAKQgvhZE4r6AOzpVydJ9a3tB1BLMrgDzLlBLbihKNDzSJWTAHMVbsMoIOpnM6"
{ "greeting": "Hello, Leafie!", "date": "2022-06-07T08:10:30.998Z" }
Autenticar a Solicitação
Se um ponto de extremidade estiver configurado para usar a autenticação de aplicativo, você deve incluir um token de acesso de usuário válido ou credenciais de login com cada solicitação.
Em geral, a autenticação de portador com um token de acesso tem uma taxa de transferência mais alta e é mais segura do que os cabeçalhos de credenciais. Use um token de acesso em vez de cabeçalhos de credenciais quando possível. O token permite que você execute várias solicitações sem autenticar o usuário novamente. Ele também permite que você envie solicitações de um navegador da Web que imponha o CORS.
Para usar um token de acesso, primeiro autentique o usuário por meio de um fornecedor de autenticação do App Services. Em seguida, obtenha o token de acesso retornado pelo App Services e inclua-o no cabeçalho de autorização da solicitação usando um esquema de token de portador. Para obter mais informações sobre como adquirir e usar um token de acesso, consulte Autenticação de Token de Portador.
curl -X GET \ -H 'Authorization: Bearer <AccessToken>' \ -H 'Content-Type: application/json' \ https://data.mongodb-api.com/app/myapp-abcde/endpoint/hello
Como alternativa, você pode incluir credenciais de login válidas para o usuário nos cabeçalhos de solicitação.
curl -s "https://data.mongodb-api.com/app/myapp-abcde/endpoint/hello" \ -X POST \ -H "Accept: application/json" \ -H "email: bob@example" \ -H "password: Pa55w0rd!" \ -d '{ "name": "Bob" }'
curl -s "https://data.mongodb-api.com/app/myapp-abcde/endpoint/hello" \ -X POST \ -H "Accept: application/json" \ -H "apiKey: TpqAKQgvhZE4r6AOzpVydJ9a3tB1BLMrgDzLlBLbihKNDzSJWTAHMVbsMoIOpnM6" \ -d '{ "name": "Alice" }'
curl -s "https://data.mongodb-api.com/app/myapp-abcde/endpoint/hello" \ -X POST \ -H "Accept: application/json" \ -H "jwtTokenString: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJ0ZXN0LWN1c3RvbS1lbmRwb2ludHMtZWhtenQiLCJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiZXhwIjoyMTQ1OTE2ODAwfQ.pIMvnXWrcDvmPzmE33ZPrwkBAFSwy-GxW8sP-qLtYiw" \ -d '{ "name": "Carlos" }'
Importante
Não use chaves de API em clientes direcionados ao usuário
Se você estiver autenticando de um navegador ou de outro aplicativo de cliente voltado para o usuário, evite usar uma chave API para se conectar. Em vez disso, use outro fornecedor de autenticação que tenha credenciais fornecidas pelo usuário. Nunca armazene chaves API ou outras credenciais sensíveis localmente.
Autorizar a Solicitação
Dependendo da configuração do endpoint, suas solicitações podem precisar incluir informações de autorização adicionais.
Todos os usuários autenticados estão autorizados a chamar o endpoint. Solicitações autenticadas não precisam incluir informações de autorização.
Os usuários autenticados devem provar que estão autorizados a chamar o endpoint, incluindo a string secreta do endpoint como o valor do parâmetro de query secret
.
Exemplo
A seguinte solicitação do curl
utiliza validação de parâmetro de query secreta com a string secreta "Super5ecr3tPa55w0rd"
:
curl -s "https://data.mongodb-api.com/app/myapp-abcde/endpoint/passwordRequired?secret=Super5ecr3tPa55w0rd" \ -X GET \ -H "Accept: application/json" \ -H "apiKey: TpqAKQgvhZE4r6AOzpVydJ9a3tB1BLMrgDzLlBLbihKNDzSJWTAHMVbsMoIOpnM6" \ -d '{ "data": "VGhpcyBpcyBzb21lIGRhdGEgdGhhdCB3YXMgZW5jb2RlZCBhcyBhIEJhc2U2NCBBU0NJSSBzdHJpbmc=" }'
Os usuários autenticados devem provar que estão autorizados a chamar o endpoint incluindo um cabeçalho Endpoint-Signature
que contém um hash HMAC SHA-256 codificado em hexadecimal gerado a partir do corpo da solicitação e da string secreta do endpoint.
Endpoint-Signature: sha256=<hex encoded hash>
Você pode usar a seguinte função para gerar a assinatura da carga útil:
/** * Generate an HMAC request signature. * @param {string} secret - The secret validation string, e.g. "12345" * @param {object} body - The endpoint request body e.g. { "message": "MESSAGE" } * @returns {string} The HMAC SHA-256 request signature in hex format. */ exports = function signEndpointRequest(secret, body) { const payload = EJSON.stringify(body); return utils.crypto.hmac(payload, secret, "sha256", "hex"); };
Exemplo
A seguinte solicitação curl
inclui um cabeçalho de assinatura de carga assinado com o valor secreto Super5ecr3tPa55w0rd
:
curl -s "https://data.mongodb-api.com/app/myapp-abcde/endpoint/sendMessage" \ -X POST \ -H "Accept: application/json" \ -H "apiKey: TpqAKQgvhZE4r6AOzpVydJ9a3tB1BLMrgDzLlBLbihKNDzSJWTAHMVbsMoIOpnM6" \ -H "Endpoint-Signature: sha256=d4f0537db4e230d7a6028a6f7c3bb1b57c9d16f39176d78697e559ac333e0b36" \ -d '{ "message": "Hello!" }'