Menu Docs
Página inicial do Docs
/ /
Serviços Atlas App
/

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"
}'

Um endpoint lida com um ou mais métodos HTTP enviados para uma URL específica.

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:

URL Base do Endpoint (Aplicações Globais):
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)

URL Base do Endpoint (Aplicações Locais)
https://<Region>.aws.data.mongodb-api.com/app/<App ID>/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.

Uma rota de endpoint
/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.

An endpoint URL
https://data.mongodb-api.com/app/<App ID>/endpoint/my/nested/route

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:

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:

  1. Clique em HTTPS Endpoints no menu de navegação esquerdo e clique em Add An Endpoint.

  2. 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.

  3. Escolha um método HTTP para o endpoint no menu suspenso. Você pode escolher um método específico (por exemplo, GET ou POST) ou configurar o endpoint para aceitar qualquer método HTTP (como ANY).

  4. 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.

  5. 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.

  6. Para maior segurança, você pode configurar a autorização de solicitação.

  7. Salve a configuração do Data API.

  8. Configure permissões de acesso para permitir que as solicitações leiam e escrevam dados com segurança.

  9. Salve e implante sua aplicação.

  1. Puxe a versão mais recente do seu aplicativo.

    appservices pull --remote="<Your App ID>"
  2. 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>
    }
    ]
  3. 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>]
    }
  4. Implemente seu aplicativo.

    appservices push

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.

functions/config.json
[
{
...,
"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.

functions/config.json
[
{
...,
"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.

functions/config.json
[
{
...,
"run_as_system": true
}
]

Dica

Os novos endpoints criados na UI usam a autenticação do sistema por padrã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.

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.

http_endpoints/config.json
[
{
...,
"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.

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:

http_endpoints/config.json
[
{
...,
"can_evaluate": {
"%%request.requestHeaders.x-secret-key": "my-secret"
}
}
]

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:

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.

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.

Objeto de Solicitação de Endpoint
{
"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.

Exemplo

O seguinte objeto query representa a string de query ?regions=na,eu&currency=USD:

{
"regions": "na&eu",
"currency": "USD"
}
headers

Um objeto onde cada campo mapeia um nome de cabeçalho da solicitação para uma array de um ou mais valores.

Exemplo

{
"Content-Type": ["application/json"],
"Accept": ["application/json"],
"X-CustomHeader": ["some-value", "some-other-value"]
}
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á undefined.

Para acessar os dados no corpo da solicitação, você precisa serializar o binário:

// Convert the request body to a JSON string
const serialized = request.body.text();
// Parse the string into a usable object
const body = JSON.parse(serialized);

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

response.setStatusCode(201);
setBody(body)
- body: string | BSON.Binary

Defina o corpo da resposta HTTP .

Se o body for uma string, o endpoint codificará automaticamente como BSON.Binary.

Exemplo

response.setBody(
"{'message': 'Hello, World!'}"
);
setHeader(name, value)
- name: string
- value: string

Defina o cabeçalho da resposta HTTP especificada por name para o valor passado no argumento value. Isso substitui quaisquer outros valores que já tenham sido atribuídos a esse cabeçalho.

Exemplo

response.setHeader(
"Content-Type",
"application/json"
);
addHeader(name, value)
- name: string
- value: string

Defina a resposta HTTP cabeçalho especificada por name com o valor passado no argumento value. Ao contrário de setHeader, isso não substitui outros valores já atribuídos ao cabeçalho.

Exemplo

response.addHeader(
"Cache-Control",
"max-age=600"
);
response.addHeader(
"Cache-Control",
"min-fresh=60"
)

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.

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.

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"
}

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.

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!" }'

Voltar

Endpoints da Data API [obsoletos]