Overview
El mecanismo de autenticación OpenID Connect (OIDC) le permite autenticarse en MongoDB mediante un proveedor de identidad de terceros, como Azure o Google Cloud Platform (GCP).
Puede utilizar este mecanismo solo cuando se autentique en MongoDB Atlas o MongoDB Enterprise Advanced, y solo cuando se autentique en MongoDB v7.0 o posterior.
Tip
Autenticación OIDC
Para obtener más información sobre cómo configurar MongoDB Atlas para la autenticación OIDC, consulte Configurar Workforce Identity Federation con OIDC en la documentación de Atlas.
Para obtener más información sobre el uso de la autenticación OIDC con MongoDB, consulte Autenticación de OpenID Connect y Parámetros del servidor MongoDB en el manual del servidor MongoDB.
Marcadores de posición de código
Los ejemplos de código de esta página utilizan los siguientes marcadores de posición:
+srvIncluya esta opción en el prefijo de la cadena de conexión solo si se conecta a un clúster de MongoDB Atlas. Para obtener más información sobre la+srvopción, consulte "Formatos de cadena de conexión" en el manual de MongoDB Server.<Azure ID>:El identificador de cliente o el identificador de aplicación de la identidad administrada de Azure o la aplicación empresarial, si se autentica en Azure IMDS.<hostname>: La dirección de red de tu implementación de MongoDB.<port>El número de puerto de su implementación de MongoDB. Si omite este parámetro, el controlador usa el número de puerto predeterminado (27017). No es necesario especificar un puerto al conectarse a un clúster de MongoDB Atlas.<audience>:El valor del parámetroaudienceconfigurado en su implementación de MongoDB.
Para utilizar los ejemplos de código en esta página, reemplace estos marcadores de posición con sus propios valores.
Importante
Codificación porcentual
Debes codificar porcentualmente un nombre de usuario y contraseña antes de incluirlos en una URI de MongoDB. El método quote_plus(), disponible en el urllib.parse módulo, es una forma de realizar esta tarea. Por ejemplo, al llamar a quote_plus("and / or") se devuelve la string and+%2F+or.
No codifique en porcentaje el nombre de usuario ni la contraseña al pasarlos como argumentos a MongoClient.
Uso de la autenticación OIDC en su aplicación
Las siguientes secciones describen cómo utilizar el mecanismo de autenticación MONGODB-OIDC para autenticarse en varias plataformas.
Nota
Dado que la biblioteca estándar de Python no admite solicitudes HTTP asíncronas, todas las solicitudes OIDC de PyMongo son síncronas. A partir de PyMongo v4.14, las solicitudes OIDC síncronas no bloquean el bucle asyncio.
IMDS de Azure
Si su aplicación se ejecuta en una máquina virtual de Azure o utiliza el Servicio de metadatos de instancia de Azure (IMDS), puede autenticarse en MongoDB mediante el soporte integrado de Azure de PyMongo.
Puede configurar OIDC para Azure IMDS de dos maneras: pasando argumentos al constructor MongoClient o mediante parámetros en su cadena de conexión.
Nota
Si sus valores authMechanismProperties incluyen una coma, debe utilizar el constructor MongoClient para configurar sus opciones de autenticación.
Primero, cree un diccionario de Python para las propiedades de su mecanismo de autenticación, como se muestra en el siguiente ejemplo:
properties = {"ENVIRONMENT": "azure", "TOKEN_RESOURCE": "<audience>"}
A continuación, configure las siguientes opciones de conexión:
username:Si usa una identidad administrada de Azure, configúrelo en el identificador de cliente de la identidad administrada.authMechanism:Establecer en"MONGODB-OIDC".authMechanismProperties: Establezca en el diccionariopropertiesque creó en el paso anterior.
El siguiente ejemplo de código muestra cómo configurar estas opciones al crear un MongoClient:
from pymongo import MongoClient # define properties and MongoClient properties = {"ENVIRONMENT": "azure", "TOKEN_RESOURCE": "<audience>"} client = MongoClient( "mongodb[+srv]://<hostname>:<port>", username="<Azure ID>", authMechanism="MONGODB-OIDC", authMechanismProperties=properties )
Incluya las siguientes opciones de conexión en su cadena de conexión:
username:Si usa una identidad administrada de Azure, configúrelo en el identificador de cliente de la identidad administrada.authMechanism:Establecer enMONGODB-OIDC.authMechanismProperties:Establecer enENVIRONMENT:azure,TOKEN_RESOURCE:<audience>.El siguiente ejemplo de código muestra cómo configurar estas opciones en su cadena de conexión:
from pymongo import MongoClient # define URI and MongoClient uri = ("mongodb[+srv]://<hostname>:<port>/?" "username=<username>" "&authMechanism=MONGODB-OIDC" "&authMechanismProperties=ENVIRONMENT:azure,TOKEN_RESOURCE:<percent-encoded audience>") client = MongoClient(uri)
Tip
Si su aplicación se ejecuta en una máquina virtual de Azure y solo una identidad administrada está asociada con la máquina virtual, puede omitir la opción de conexión username.
GCP IMDS
Si su aplicación se ejecuta en una máquina virtual de Google Compute Engine o utiliza el servicio de metadatos de instancia de GCP, puede autenticarse en MongoDB mediante el soporte de GCP integrado de PyMongo.
Puede configurar OIDC para GCP IMDS de dos maneras: pasando argumentos al constructor MongoClient o mediante parámetros en su cadena de conexión.
Nota
Si sus valores authMechanismProperties incluyen una coma, debe utilizar el constructor MongoClient para configurar sus opciones de autenticación.
Primero, cree un diccionario de Python para las propiedades de su mecanismo de autenticación, como se muestra en el siguiente ejemplo.
properties = {"ENVIRONMENT": "gcp", "TOKEN_RESOURCE": "<audience>"}
A continuación, configure las siguientes opciones de conexión:
authMechanism:Establecer en"MONGODB-OIDC".authMechanismProperties: Establezca en el diccionariopropertiesque creó en el paso anterior.
El siguiente ejemplo de código muestra cómo configurar estas opciones al crear un MongoClient:
from pymongo import MongoClient # define properties and MongoClient properties = {"ENVIRONMENT": "gcp", "TOKEN_RESOURCE": "<audience>"} client = MongoClient( "mongodb[+srv]://<hostname>:<port>", authMechanism="MONGODB-OIDC", authMechanismProperties=properties )
Incluya las siguientes opciones de conexión en su cadena de conexión:
authMechanism:Establecer enMONGODB-OIDC.authMechanismProperties:Establecer enENVIRONMENT:gcp,TOKEN_RESOURCE:<audience>.
El siguiente ejemplo de código muestra cómo configurar estas opciones en su cadena de conexión:
from pymongo import MongoClient # define URI and MongoClient uri = ("mongodb[+srv]://<hostname>:<port>/?" "&authMechanism=MONGODB-OIDC" "&authMechanismProperties=ENVIRONMENT:gcp,TOKEN_RESOURCE:<percent-encoded audience>") client = MongoClient(uri)
Otros entornos de Azure
Si su aplicación se ejecuta en Funciones de Azure, entorno de servicios de aplicaciones (ASE) o Servicio de Kubernetes de Azure (AKS), puede utilizar el paquete azure-identity para obtener credenciales de autenticación.
Primero, use pip para instalar la biblioteca azure-identity, como se muestra en el siguiente ejemplo:
python3 -m pip install azure-identity
A continuación, defina una clase que herede de la clase OIDCCallback. Esta clase debe implementar un método fetch(), que devuelve el token OIDC como un objeto OIDCCallbackResult.
El siguiente ejemplo muestra cómo definir una clase de devolución de llamada llamada MyCallback. Esta clase incluye un método fetch() que recupera un token OIDC de un archivo en la ubicación estándar del archivo de tokens de la cuenta de servicio.
audience = "<audience>" client_id = "<Azure ID>" class MyCallback(OIDCCallback): def fetch(self, context: OIDCCallbackContext) -> OIDCCallbackResult: credential = DefaultAzureCredential(managed_identity_client_id=client_id) token = credential.get_token(f"{audience}/.default").token return OIDCCallbackResult(access_token=token)
Después de definir su clase de devolución de llamada, cree un diccionario de Python que contenga una clave, "OIDC_CALLBACK", cuyo valor sea una instancia de su clase de devolución de llamada personalizada:
properties = {"OIDC_CALLBACK": MyCallback()}
Por último, configure las siguientes opciones de conexión pasando los siguientes argumentos al constructor MongoClient:
authMechanism:Establecer en"MONGODB-OIDC".authMechanismProperties: Establezca en el diccionariopropertiesque creó en el paso anterior.
Seleccione el Synchronous o pestaña Asynchronous para ver el código correspondiente:
client = MongoClient( "mongodb[+srv]://<hostname>:<port>", authMechanism="MONGODB-OIDC", authMechanismProperties=properties )
client = AsyncMongoClient( "mongodb[+srv]://<hostname>:<port>", authMechanism="MONGODB-OIDC", authMechanismProperties=properties )
GCP GKE
Si su aplicación se ejecuta en un clúster de Google Kubernetes Engine (GKE) de GCP con una cuenta de servicio configurada, puede leer el token OIDC desde la ubicación del archivo de token de la cuenta de servicio estándar.
Primero, defina una clase que herede de la clase OIDCCallback. Esta clase debe implementar un método fetch(), que devuelve el token OIDC como un objeto OIDCCallbackResult.
El siguiente ejemplo muestra cómo definir una clase de devolución de llamada llamada MyCallback. Esta clase incluye un método fetch() que recupera un token OIDC de un archivo en la ubicación estándar del archivo de tokens de la cuenta de servicio.
class MyCallback(OIDCCallback): def fetch(self, context: OIDCCallbackContext) -> OIDCCallbackResult: with open("/var/run/secrets/kubernetes.io/serviceaccount/token") as fid: token = fid.read() return OIDCCallbackResult(access_token=token)
Después de definir su clase de devolución de llamada, cree un diccionario de Python que contenga una clave, "OIDC_CALLBACK", cuyo valor sea una instancia de su clase de devolución de llamada personalizada:
properties = {"OIDC_CALLBACK": MyCallback()}
Por último, configure las siguientes opciones de conexión pasando los siguientes argumentos al constructor MongoClient:
authMechanism:Establecer en"MONGODB-OIDC".authMechanismProperties: Establezca en el diccionariopropertiesque creó en el paso anterior.
Selecciona la pestaña Synchronous o Asynchronous para ver el código correspondiente:
client = MongoClient( "mongodb[+srv]://<hostname>:<port>", authMechanism="MONGODB-OIDC", authMechanismProperties=properties )
client = AsyncMongoClient( "mongodb[+srv]://<hostname>:<port>", authMechanism="MONGODB-OIDC", authMechanismProperties=properties )
Kubernetes
Si su aplicación se ejecuta en un clúster de Kubernetes, puede autenticarse en MongoDB utilizando el soporte de Kubernetes integrado de PyMongo.
Puede configurar OIDC para Kubernetes de dos maneras: pasando argumentos al constructor MongoClient o mediante parámetros en su cadena de conexión. Seleccione una de las siguientes pestañas para ver cómo habilitar la autenticación de Kubernetes para su aplicación:
properties = {"ENVIRONMENT": "k8s"} client = MongoClient( "mongodb[+srv]://<hostname>:<port>", authMechanism="MONGODB-OIDC", authMechanismProperties=properties )
uri = ("mongodb[+srv]://<hostname>:<port>/?" "authMechanism=MONGODB-OIDC" "&authMechanismProperties=ENVIRONMENT:k8s") client = MongoClient(uri)
properties = {"ENVIRONMENT": "k8s"} client = AsyncMongoClient( "mongodb[+srv]://<hostname>:<port>", authMechanism="MONGODB-OIDC", authMechanismProperties=properties )
uri = ("mongodb[+srv]://<hostname>:<port>/?" "authMechanism=MONGODB-OIDC" "&authMechanismProperties=ENVIRONMENT:k8s") client = AsyncMongoClient(uri)
Si especifica Kubernetes OIDC como mecanismo de autenticación, el controlador lee el contenido del token OIDC desde una de las siguientes ubicaciones:
AZURE_FEDERATED_TOKEN_FILEVariable de entorno para aplicaciones que se ejecutan en Azure Kubernetes Service (AKS)AWS_WEB_IDENTITY_TOKEN_FILEVariable de entorno para aplicaciones que se ejecutan en Elastic Kubernetes Service (EKS)/var/run/secrets/kubernetes.io/serviceaccount/tokenarchivo, la ubicación predeterminada para todas las demás aplicaciones, incluidas las que se ejecutan en Google Kubernetes Engine (GKE)
Debes almacenar tu token OIDC en la ubicación que corresponda al servicio que utilizas para ejecutar tu aplicación.