Visão geral
O mecanismo de autenticação OpenID Connect (OIDC) permite que você autentique no MongoDB usando um provedor de identidade de terceiros, como o Azure ou o Google Cloud Platform (GCP).
Você pode usar esse mecanismo somente ao autenticar para MongoDB Atlas ou Enterprise Advanced e somente ao autenticar para MongoDB v7.0 ou posterior.
Dica
Autenticação OIDC
Para saber mais sobre como configurar o MongoDB Atlas para autenticação OIDC, consulte Configurar Federação de Identidade da Força de Trabalho com OIDC na documentação do Atlas .
Para obter mais informações sobre o uso da autenticação OIDC com o MongoDB, consulte Autenticação do OpenID Connect e Parâmetros do MongoDB Server no manual do MongoDB Server .
Espaços reservados de código
Os exemplos de código nesta página usam os seguintes espaços reservados:
+srv
: inclua essa opção no prefixo da string de conexão somente se estiver se conectando a um cluster MongoDB Atlas . Para saber mais sobre a+srv
opção, consulte Formatos de connection string no manual do MongoDB Server .<Azure ID>
: o ID do cliente ou do ID do aplicativo de identidade gerenciada pelo Azure ou do aplicação empresarial , se estiver autenticando no Azure IMDS.<hostname>
: O endereço de rede da sua implantação MongoDB .<port>
: o número da porta da sua implantação do MongoDB . Se você omitir este parâmetro, o driver utilizará o número de porta padrão (27017
). Você não precisa especificar uma porta ao se conectar a um cluster MongoDB Atlas .<audience>
: O valor do parâmetro doaudience
configurado em sua deployment do MongoDB .
Para usar os exemplos de código nesta página, substitua esses espaços reservados por seus próprios valores.
Importante
Codificação percentual
Você deve codificar um nome de usuário e uma senha antes de incluí-los em um URI MongoDB. O método quote_plus()
, disponível no módulo urllib.parse, é uma maneira de executar esta tarefa. Por exemplo, chamar quote_plus("and / or")
retorna a string and+%2F+or
.
Não codifique percentualmente o nome de usuário ou a senha ao passá-los como argumentos para MongoClient
.
Usando a autenticação OIDC em seu aplicativo
As seções a seguir descrevem como usar o mecanismo de autenticação MONGODB-OIDC para autenticar em várias plataformas.
Observação
Como a Biblioteca Padrão do Python não suporta solicitações HTTP assíncronas, todas as solicitações OIDC do PyMongo são síncronas. A partir do PyMongo v4.14, as solicitações OIDC síncronas não bloqueiam o loop asyncio
.
IMDS do Azure
Se o seu aplicação for executado em um Azure VM ou de outra forma usar o Azure Instance Metadata Service (IMDS), você poderá autenticar no MongoDB usando o suporte integrado do Azure do PyMongo.
Você pode configurar o OIDC para o Azure IMDS de duas maneiras: passando argumentos para o construtor MongoClient
ou por meio de parâmetros em sua connection string.
Observação
Se seus valores authMechanismProperties
incluírem uma vírgula, você deverá usar o construtor MongoClient
para definir suas opções de autenticação.
Primeiro, crie um dicionário Python para suas propriedades do mecanismo de autenticação , conforme mostrado no exemplo a seguir:
properties = {"ENVIRONMENT": "azure", "TOKEN_RESOURCE": "<audience>"}
Em seguida, defina as seguintes opções de conexão:
username
: Se você estiver usando uma identidade gerenciada pelo Azure, defina para a ID do cliente da identidade gerenciada.authMechanism
: Defina como"MONGODB-OIDC"
.authMechanismProperties
: defina para o dicionárioproperties
que você criou na etapa anterior.
O seguinte exemplo de código mostra como definir estas opções ao criar um 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 )
Inclua as seguintes opções de conexão em sua connection string:
username
: Se você estiver usando uma identidade gerenciada pelo Azure, defina para a ID do cliente da identidade gerenciada.authMechanism
: Defina comoMONGODB-OIDC
.authMechanismProperties
: Defina comoENVIRONMENT:azure,TOKEN_RESOURCE:<audience>
.O exemplo de código a seguir mostra como definir essas opções em sua string de conexão:
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)
Dica
Se seu aplicativo estiver em execução em uma VM do Azure e somente uma identidade gerenciada estiver associada à VM, você poderá omitir a opção de conexão username
.
GCP IMDS
Se seu aplicação é executado em uma VM do Google Compute Engine ou usa o GCP Instance Metadata Service, você pode autenticar no MongoDB usando o suporte integrado ao GCP do PyMongo.
Você pode configurar o OIDC para o GCP IMDS de duas maneiras: passando argumentos para o construtor MongoClient
ou por meio de parâmetros em sua connection string.
Observação
Se seus valores authMechanismProperties
incluírem uma vírgula, você deverá usar o construtor MongoClient
para definir suas opções de autenticação.
Primeiro, crie um dicionário Python para as propriedades do mecanismo de autenticação , conforme mostrado no exemplo a seguir.
properties = {"ENVIRONMENT": "gcp", "TOKEN_RESOURCE": "<audience>"}
Em seguida, defina as seguintes opções de conexão:
authMechanism
: Defina como"MONGODB-OIDC"
.authMechanismProperties
: defina para o dicionárioproperties
que você criou na etapa anterior.
O seguinte exemplo de código mostra como definir estas opções ao criar um 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 )
Inclua as seguintes opções de conexão em sua connection string:
authMechanism
: Defina comoMONGODB-OIDC
.authMechanismProperties
: Defina comoENVIRONMENT:gcp,TOKEN_RESOURCE:<audience>
.
O exemplo de código a seguir mostra como definir essas opções em sua string de conexão:
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)
Outros ambientes Azure
Se a sua aplicação for executada no Azure Functions, App Service Environment (ASE) ou Azure Kubernetes Service (AKS), você poderá usar o pacote azure-identity para buscar credenciais de autenticação.
Primeiro, use o pip para instalar a biblioteca azure-identity
, como mostrado no exemplo a seguir:
python3 -m pip install azure-identity
Em seguida, defina uma classe que herda da classe OIDCCallback
. Esta classe deve implementar um método fetch()
, que retorna o token OIDC na forma de um objeto OIDCCallbackResult
.
O exemplo seguinte mostra como definir uma classe de retorno de chamada MyCallback
. Essa classe inclui um método fetch()
que recupera um token OIDC de um arquivo no local padrão do arquivo de token de conta de serviço.
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)
Após definir sua classe de retorno de chamada, crie um dicionário Python que contenha uma chave, "OIDC_CALLBACK"
, cujo valor seja uma instância de sua classe de retorno de chamada personalizada:
properties = {"OIDC_CALLBACK": MyCallback()}
Finalmente, defina as seguintes opções de conexão passando os seguintes argumentos para o construtor MongoClient
:
authMechanism
: Defina como"MONGODB-OIDC"
.authMechanismProperties
: defina para o dicionárioproperties
que você criou na etapa anterior.
Selecione a aba Synchronous ou Asynchronous para ver o código correspondente:
client = MongoClient( "mongodb[+srv]://<hostname>:<port>", authMechanism="MONGODB-OIDC", authMechanismProperties=properties )
client = AsyncMongoClient( "mongodb[+srv]://<hostname>:<port>", authMechanism="MONGODB-OIDC", authMechanismProperties=properties )
GCP GKE
Se seu aplicação for executado em um cluster GCP do Google Kubernetes Engine (GKE) com uma conta de serviço configurada, você poderá ler o token OIDC a partir do local padrão do arquivo de token de conta de serviço.
Primeiro, defina uma classe que herda da classe OIDCCallback
. Esta classe deve implementar um método fetch()
, que retorna o token OIDC na forma de um objeto OIDCCallbackResult
.
O exemplo seguinte mostra como definir uma classe de retorno de chamada MyCallback
. Essa classe inclui um método fetch()
que recupera um token OIDC de um arquivo no local padrão do arquivo de token de conta de serviço.
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)
Após definir sua classe de retorno de chamada, crie um dicionário Python que contenha uma chave, "OIDC_CALLBACK"
, cujo valor seja uma instância de sua classe de retorno de chamada personalizada:
properties = {"OIDC_CALLBACK": MyCallback()}
Finalmente, defina as seguintes opções de conexão passando os seguintes argumentos para o construtor MongoClient
:
authMechanism
: Defina como"MONGODB-OIDC"
.authMechanismProperties
: defina para o dicionárioproperties
que você criou na etapa anterior.
Selecione a aba Synchronous ou Asynchronous para ver o código correspondente:
client = MongoClient( "mongodb[+srv]://<hostname>:<port>", authMechanism="MONGODB-OIDC", authMechanismProperties=properties )
client = AsyncMongoClient( "mongodb[+srv]://<hostname>:<port>", authMechanism="MONGODB-OIDC", authMechanismProperties=properties )
Kubernetes
Se seu aplicação é executado em um cluster do Kubernetes, você pode autenticar no MongoDB usando o suporte integrado do PyMongo ao Kubernetes.
Você pode configurar o OIDC para o Kubernetes de duas maneiras: passando argumentos para o construtor MongoClient
ou por meio de parâmetros em sua string de conexão. Selecione nas seguintes guias para ver como ativar a autenticação do Kubernetes para seu aplicação:
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)
Se você especificar Kubernetes OIDC como o mecanismo de autenticação, o driver lerá o conteúdo do token OIDC de um dos seguintes locais:
AZURE_FEDERATED_TOKEN_FILE
variável de ambiente para aplicativos em execução no Azure Kubernetes Service (AKS)AWS_WEB_IDENTITY_TOKEN_FILE
variável de ambiente para aplicativos em execução no Elastic Kubernetes Service (EKS)/var/run/secrets/kubernetes.io/serviceaccount/token
arquivo, o local padrão para todos os outros aplicativos, incluindo aqueles que são executados no Google Kubernetes Engine (GKE)
Você deve armazenar seu token OIDC no local que corresponde ao serviço que você usa para executar seu aplicação.