Docs Menu
Docs Home
/ /
Data API

Puntos finales HTTPS personalizados

Puedes definir puntos de conexión HTTPS personalizados para crear rutas de API o webhooks específicos de la aplicación que se integren con servicios externos. Un punto de conexión personalizado utiliza una función sin servidor que escribes para gestionar las solicitudes entrantes de una URL y un método HTTP específicos.

Nota

Los puntos finales HTTPS personalizados no son compatibles con puntos finales privados.

Los puntos finales utilizan solicitudes HTTPS estándar cifradas, lo que significa que no es necesario instalar controladores de base de datos ni bibliotecas para llamarlos. En su lugar, se envían solicitudes como esta desde cualquier 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"
}'

Un punto final maneja uno o más métodos HTTP enviados a una URL específica.

Los puntos finales de una aplicación comparten una URL base. Esta URL usa el ID de la aplicación para dirigirse de forma única a ella.

Las aplicaciones distribuidas globalmente emplean el siguiente formato:

URL base del punto final (aplicaciones globales):
https://data.mongodb-api.com/app/<App ID>/endpoint

Los puntos finales en una aplicación implementada localmente usan una URL base específica para la región de implementación de la aplicación (por ejemplo, us-east-1)

URL base del punto final (aplicaciones locales)
https://<Region>.aws.data.mongodb-api.com/app/<App ID>/endpoint

Cada endpoint HTTPS tiene una ruta que sirve como nombre para el endpoint. La ruta de un endpoint es arbitraria y específica de tu aplicación. Sin embargo, aparece en la ruta URL del endpoint y por lo tanto debe ser representativa de la acción que realiza la ruta.

Los nombres de las rutas deben comenzar con una barra diagonal (/) y pueden contener barras diagonales adicionales para indicar una ruta anidada.

Una ruta de punto final
/my/nested/route

Para llamar a un punto final, agregue su ruta a la URL base de su aplicación y envíe una solicitud HTTP.

Una URL de punto final
https://data.mongodb-api.com/app/<App ID>/endpoint/my/nested/route

Cada punto final de su aplicación maneja uno o más Métodos HTTPPara una ruta determinada. Por ejemplo, podría tener una sola ruta que acepte POST solicitudes para crear un nuevo recurso y una GET para listar los recursos existentes.

Puede definir varios puntos de conexión personalizados que sirvan a la misma ruta, pero que gestionen diferentes métodos de solicitud. También puede definir un único punto de conexión para la ruta que gestione todos los métodos.

Los puntos finales personalizados admiten los siguientes métodos HTTP estándar:

Puede configurar la API de datos para su aplicación desde la interfaz de usuario de App Services o implementando archivos de configuración con la CLI de App Services:

  1. Haga clic HTTPS Endpoints en el menú de navegación de la izquierda y luego haga clic en Add An Endpoint.

  2. Define el punto final Route. Los nombres de ruta deben comenzar con una barra diagonal (/) y pueden contener barras diagonales adicionales para indicar una ruta anidada.

  3. Seleccione un método HTTP para el punto final en el menú desplegable. Puede elegir un método específico (p. ej., GET POSTo) o configurar el punto final para que acepte cualquier método HTTP (p. ANY ej.,).

  4. Elija un tipo de respuesta, JSON o EJSON. Puede habilitar Respond With Result para incluir automáticamente el valor de retorno de la función de punto final como cuerpo de la respuesta.

  5. Escriba una función de punto final que gestione las solicitudes del punto final. También puede especificar una función existente por nombre.

  6. Para mayor seguridad, puede configurar la autorización de solicitud.

  7. Guardar la configuración de la API de datos.

  8. Configure permisos de acceso para permitir solicitudes de lectura y escritura de datos de forma segura.

  9. Guarde e implemente su aplicación.

  1. Obtenga la última versión de su aplicación.

    appservices pull --remote="<Your App ID>"
  2. Defina un objeto de configuración para el punto final 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. Definir reglas para una o más colecciones.

    fuentes_de_datos/mongodb-atlas/<db><collection>/<colección>/rules.json
    {
    "database": "<Database Name>",
    "collection": "<Collection Name>",
    "roles": [<Role>],
    "filters": [<Filter>]
    }
  4. Implementa tu aplicación.

    appservices push

Los puntos finales personalizados se ejecutan en el contexto de un usuario específico, lo que permite que su aplicación aplique reglas y valide esquemas de documentos para cada solicitud.

De forma predeterminada, los endpoints utilizan la autenticación de aplicaciones, que requiere que cada solicitud incluya las credenciales de uno de los usuarios de la aplicación, como una clave API o JWT. También puede configurar otros esquemas de autenticación personalizados para adaptarlos a las necesidades de su aplicación.

Para obtener ejemplos de cómo autenticar solicitudes, consulte Autenticar solicitudes de API de datos.

La autenticación de la aplicación requiere que los usuarios inicien sesión con un proveedor de autenticación que haya habilitado para su aplicación. Las solicitudes pueden incluir un token de acceso otorgado por el proveedor de autenticación o las credenciales con las que el usuario iniciaría sesión (por ejemplo, su clave API o correo electrónico y contraseña).

La autenticación de ID de usuario ejecuta todas las solicitudes como un único usuario de aplicación preseleccionado. Esto resulta útil si todas las solicitudes deben tener los mismos permisos, independientemente de quién haya llamado al endpoint.

Para seleccionar el usuario, especifica su ID de cuenta de usuario en la configuración del endpoint.

functions/config.json
[
{
...,
"run_as_user_id": "628e47baf4c2ac2796fc8a91"
}
]

La autenticación de scripts llama a una función para determinar el usuario de la aplicación al que se ejecuta una solicitud. Puede usar esto para implementar esquemas de autenticación y autorización personalizados.

La función debe devolver el ID de cuenta de un usuario de la aplicación existente como una cadena o { "runAsSystem": true } para ejecutar la solicitud como un usuario del sistema que tiene acceso completo a las API de CRUD y agregación de MongoDB y no está sujeto a ninguna regla, rol o permiso limitado.

Para definir la función, especifique el código fuente en la configuración del punto final.

functions/config.json
[
{
...,
"run_as_user_id_script_source": "exports = () => {return \"628e47baf4c2ac2796fc8a91\"}"
}
]

La autenticación del sistema configura un punto final para ejecutarse como un usuario del sistema que no requiere credenciales, tiene acceso completo a las API de CRUD y agregación de MongoDB y no está sujeto a ninguna regla, rol o permiso limitado.

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

Tip

Los nuevos puntos finales que cree en la interfaz de usuario utilizan la autenticación del sistema de manera predeterminada.

Un punto final puede requerir que los usuarios autenticados proporcionen información de autorización adicional en la solicitud. El esquema de autorización para cada punto final personalizado se define configurando la función de punto final.

Los endpoints admiten de forma nativa un conjunto de esquemas de autorización integrados que utilizan una cadena secreta para demostrar que la solicitud está autorizada. También puede definir un esquema de autorización personalizado que pueda usar junto con los esquemas integrados o en lugar de ellos.

Para saber cómo configurar la autorización para una función específica, consulte Definir una función.

Los puntos finales admiten los siguientes esquemas de autorización integrados:

Todos los usuarios autenticados están autorizados a llamar al punto final. Las solicitudes autenticadas no necesitan incluir información de autorización.

Los usuarios autenticados deben demostrar que están autorizados a llamar al punto final incluyendo una cadena específica como valor del parámetro de consulta secret.

Define la cadena en un secreto y hace referencia al secreto por nombre en la configuración del punto final.

http_endpoints/config.json
[
{
...,
"verification_method": "SECRET_AS_QUERY_PARAM",
"secret_name": "secret_verification_string"
}
]

Para saber cómo incluir el secreto en una solicitud,consulte Autorizar la solicitud.

Los usuarios autenticados deben demostrar que están autorizados a llamar al punto final incluyendo un encabezado Endpoint-Signature que contenga un código hexadecimal. Hash HMAC SHA-256 generado a partir del cuerpo de la solicitud y una cadena secreta.

Define la cadena en un secreto y hace referencia al secreto por nombre en la configuración del punto final.

Para saber cómo firmar sus solicitudes,consulte Autorizar la solicitud.

Puedes definir una expresión de autorización personalizada para determinar si se permite la ejecución de una solicitud autenticada entrante. La expresión se evalúa para cada solicitud y debe dar true como resultado para permitirla. Si da como false resultado, la solicitud no se autoriza y falla con un error. Las solicitudes que no superan la autorización no se contabilizan para el uso facturado de tu aplicación.

Las expresiones de autorización pueden usar variables como para %%user %%request autorizar según los datos del usuario que llama o para tomar decisiones según las características específicas de cada solicitud entrante.

Para definir un esquema de autorización personalizado, especifique la expresión en la configuración de la función del punto final:

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

Cada endpoint personalizado está asociado con una función que se ejecuta cada vez que el endpoint recibe una solicitud entrante. En la función, puedes importar librerías desde npm, conectarte a un clúster MongoDB Atlas vinculado y llamar a otras funciones sin servidor.

Para definir una nueva función al crear un punto final en la interfaz de usuario de App Services, navegue a la Function sección y seleccione en el + New Function menú desplegable.

Dependiendo del flujo de trabajo, también puedes definir y editar funciones de gestión de endpoints:

Las funciones de punto final siempre reciben dos argumentos:

  • Un objeto de solicitud que le permite acceder a los encabezados de solicitud entrantes, parámetros de consulta y datos del cuerpo.

  • Un objeto de respuesta que se utiliza para configurar la respuesta HTTPS que se envía al llamador.

Para ver una función de muestra y un ejemplo de solicitud y respuesta, consulte Ejemplo.

Un objeto de punto final personalizado Request representa la solicitud HTTP que llamó al punto final. Puede acceder a los encabezados, parámetros de consulta y datos del cuerpo de la solicitud entrante.

Objeto de solicitud de punto final
{
"headers": { "<Header>": ["<Header Value>"] },
"query": { "<Query Parameter>": "<Parameter Value>" },
"body": <BSON.Binary>
}
Campo
Descripción

query

Un objeto donde cada campo asigna un parámetro de consulta URL a su valor. Si una clave se usa varias veces en la cadena de consulta, solo se representa la primera vez en este objeto. Para trabajar con la cadena de consulta completa, utilice context.request.rawQueryString.

Ejemplo

El siguiente objeto query representa la cadena de consulta ?regions=na,eu&currency=USD:

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

headers

Un objeto donde cada campo asigna un nombre de encabezado de solicitud a una matriz de uno o más valores.

Ejemplo

{
"Content-Type": ["application/json"],
"Accept": ["application/json"],
"X-CustomHeader": ["some-value", "some-other-value"]
}

body

Un objeto BSON.Binary que contiene el cuerpo de la solicitud. Si la solicitud no incluye cuerpo, este valor undefined es.

Para acceder a los datos en el cuerpo de la solicitud, debe serializar el binario:

// 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);

Un objeto de punto final personalizado Response permite configurar la respuesta HTTPS enviada al emisor. Se puede configurar el código de estado, personalizar los encabezados e incluir datos en el cuerpo de la respuesta.

Método
Descripción
setStatusCode(code)
- code: number

Establezca el código de estado de respuesta HTTP.

Ejemplo

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

Establecer el cuerpo de la respuesta HTTP.

Si body es una cadena, el punto final la codifica automáticamente como BSON.Binary.

Ejemplo

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

Establezca el encabezado de respuesta HTTP especificado por name con el valor pasado en el value argumento. Esto anula cualquier otro valor que ya se haya asignado a ese encabezado.

Ejemplo

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

Establece la cabecera HTTP de respuesta especificada por name con el valor proporcionado en el argumento value. A diferencia de setHeader, esto no sobrescribe otros valores que ya hayan sido asignados a la cabecera.

Ejemplo

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

Considere una función de punto final que analiza el cuerpo de una solicitud POST entrante, almacena el cuerpo analizado en una colección MongoDB y luego responde al llamador:

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);
}
};

La función recibe la siguiente solicitud 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"
}

Después de que la función verifica que el cuerpo de la solicitud entrante esté definido, almacena el cuerpo analizado como un nuevo documento en una colección llamada myCollection. La salida resultante muestra la respuesta configurada, que incluye un mensaje personalizado y insertedId.

Puede llamar a un punto final personalizado desde cualquier cliente HTTPS estándar.

curl -s "https://data.mongodb-api.com/app/myapp-abcde/endpoint/hello" \
-X POST \
-H "Accept: application/json" \
-H "apiKey: TpqAKQgvhZE4r6AOzpVydJ9a3tB1BLMrgDzLlBLbihKNDzSJWTAHMVbsMoIOpnM6" \
-d '{
"name": "Casey"
}'

Se requiere HTTP/1.1 o superior al realizar solicitudes.

Una solicitud puede incluir un encabezado Accept para solicitar un formato de datos específico para el cuerpo de la respuesta, ya sea JSON o EJSON. Si una solicitud no incluye un encabezado Accept válido, la respuesta utiliza el formato de datos predeterminado especificado en la configuración del punto de conexión.

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

Si un punto final está configurado para usar la autenticación de aplicaciones, debe incluir un token de acceso de usuario válido o credenciales de inicio de sesión con cada solicitud.

En general, la autenticación de portador con un token de acceso ofrece mayor rendimiento y es más segura que los encabezados de credenciales. Utilice un token de acceso en lugar de encabezados de credenciales siempre que sea posible. El token permite ejecutar múltiples solicitudes sin tener que volver a autenticar al usuario. También permite enviar solicitudes desde un navegador web que implemente CORS.

Para usar un token de acceso, primero autentique al usuario mediante un proveedor de autenticación de App Services. Luego, obtenga el token de acceso devuelto por App Services e inclúyalo en el encabezado de autorización de la solicitud mediante un esquema de token de portador. Para obtener más información sobre cómo adquirir y usar un token de acceso,consulte Autenticación 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

Otra opción es incluir credenciales de inicio de sesión válidas para el usuario en las cabeceras de la solicitud.

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

No uses claves API en clientes orientados al usuario

Si se autentica desde un navegador u otra aplicación cliente, evite usar una clave API para iniciar sesión. En su lugar, utilice otro proveedor de autenticación que acepte las credenciales proporcionadas por el usuario. Nunca almacene localmente claves API ni otras credenciales confidenciales.

Dependiendo de la configuración del punto final, es posible que sus solicitudes deban incluir información de autorización adicional.

Todos los usuarios autenticados están autorizados a llamar al punto final. Las solicitudes autenticadas no necesitan incluir información de autorización.

Los usuarios autenticados deben demostrar que están autorizados a llamar al punto final incluyendo la cadena secreta del punto final como valor del parámetro de consulta secret.

Ejemplo

La siguiente solicitud curl utiliza la validación de parámetros de consulta secretos con la cadena 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=" }'

Los usuarios autenticados deben demostrar que están autorizados a llamar al punto final incluyendo un Endpoint-Signature encabezado que contenga un hash HMAC SHA- codificado en hexadecimal256 generado a partir del cuerpo de la solicitud y la cadena secreta del punto final.

Endpoint-Signature: sha256=<hex encoded hash>

Puede utilizar la siguiente función para generar la firma de 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");
};

Ejemplo

La siguiente solicitud curl incluye un encabezado de firma de carga útil firmado con el 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!" }'

Volver

Puntos finales de la API de datos

En esta página