OIDC (Federação de Identidade do Volume de Trabalho)
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 por cento para um nome de usuário e senha antes de incluí-los em um URI MongoDB . O quote_plus()
método, 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 e bloqueiam o loop asyncio
.
IMDS do Azure
Se seu aplicação for executado em uma VM do Azure ou usar o Serviço de Metadados de Instância do Azure (IMDS), você pode 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. Se você estiver usando um principal de serviço para representar um aplicativo empresarial, defina para o ID do aplicativo do principal de serviç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": "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. Se você estiver usando um principal de serviço para representar um aplicativo empresarial, defina para o ID do aplicativo do principal de serviço.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 Serviço de Metadados de Instância GCP, você pode autenticar no MongoDB usando o suporte GCP integrado 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 o seu aplicação for executado no Azure Functions, App Service Environment (ASE) ou Azure Kubernetes Service (AKS), você pode usar a identidade azure pacote 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 o seu aplicação for executado em um cluster GCP do Google Kubernetes Engine (GKE) com uma conta de serviço configurada, você pode ler o token OIDC a partir do local padrão do arquivo de token da 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)