Overview
OpenID Connect(OIDC)認証メカニズムを使用すると、 AzureやGoogle Cloud Platform (GCP )などのサードパーティのIdPを使用してMongoDBに認証できます。
このメカニズムは、 MongoDB AtlasまたはMongoDB Enterprise Advancedに認証されている場合、およびMongoDB v7.0 以降に認証されている場合にのみ使用できます。
Tip
OIDC 認証
MongoDB Atlas をOIDC認証用に構成する方法の詳細については、Atlas ドキュメントの「OIDC を使用した Workforce IdP の設定」を参照してください。
MongoDBで OIDC認証を使用する方法の詳細については、 MongoDB Serverマニュアルの 「OpenID Connect 認証」 と「MongoDB Serverパラメーター」 を参照してください。
コード プレースホルダー
このページのコード例では、次のプレースホルダーを使用します。
+srv
: MongoDB Atlasクラスターに接続している場合にのみ、このオプションを接続文字列のプレフィックスに含めます。+srv
オプションの詳細については、 MongoDB Serverマニュアルの「 接続文字列の形式 」を参照してください。<Azure ID>
: Azure IMDS で認証する場合のAzureマネージド ID または エンタープライズアプリケーションのクライアントIDまたはアプリケーションID 。<hostname>
: MongoDBデプロイのネットワーク アドレス。<port>
: MongoDBデプロイのポート番号。 このパラメーターを省略すると、ドライバーはデフォルトのポート番号(27017
)を使用します。 MongoDB Atlasクラスターに接続するときにポートを指定する必要はありません。<audience>
: MongoDBデプロイで構成されたaudience
パラメータの値。
このページのコード例を使用するには、これらのプレースホルダーを独自の値に置き換えます。
重要
パーセント エンコーディング
ユーザー名とパスワードは、 MongoDB URI に含める前に、パーセント エンコードする必要があります。quote_plus()
urllib.parse モジュールで使用可能な メソッドは、このタスクを実行する 1 つの方法です 。例、 を呼び出すとquote_plus("and / or")
stringand+%2F+or
が返されます。
ユーザー名またはパスワードをMongoClient
に引数として渡す場合は、これらをパーセント エンコードしないでください。
アプリケーションでの OIDC 認証の使用
次のセクションでは、MONGODB-OIDC 認証メカニズムを使用してさまざまなプラットフォームに認証する方法について説明します。
注意
Python の標準ライブラリは非同期 HTTP リクエストをサポートしていないため、PyMongo からのすべての OIDC リクエストは同期され、 asyncio
ループをブロックします。
Azure IMDS
If your application runs on an Azure VM, or otherwise uses the Azure Instance Metadata Service (IMDS), you can authenticate to MongoDB by using PyMongo's built-in Azure support.
Azure IMDS 用の OIDC は、MongoClient
コンストラクターに引数を渡す方法と、 接続stringのパラメーターを使用する方法の 2 通りがあります。
まず、次の例に示すように、認証メカニズムプロパティ用のPython辞書を作成します。
properties = {"ENVIRONMENT": "azure", "TOKEN_RESOURCE": "<audience>"}
次に、次の接続オプションを設定します。
username
: Azureマネージド ID を使用している場合は、管理対象 ID のクライアントIDにこれを設定します。authMechanism
:"MONGODB-OIDC"
に設定します。authMechanismProperties
: 前のステップで作成したproperties
辞書に設定します。
次のコード例は、 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 )
接続stringに次の接続オプションを含めます。
username
: Azureマネージド ID を使用している場合は、管理対象 ID のクライアントIDにこれを設定します。authMechanism
:MONGODB-OIDC
に設定します。authMechanismProperties
:ENVIRONMENT:azure,TOKEN_RESOURCE:<audience>
に設定します。次のコード例は、 接続stringでこれらのオプションを設定する方法を示しています。
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
アプリケーションが Azure VM で実行されており、VM に関連付けられている管理対象 ID が 1 つだけの場合は、 username
接続オプションを省略できます。
GCP IMDS
If your application runs on a Google Compute Engine VM, or otherwise uses the GCP Instance Metadata Service, you can authenticate to MongoDB by using PyMongo's built-in GCP support.
GCP IMDS 用の OIDC は、MongoClient
コンストラクターに引数を渡す方法と、 接続stringのパラメーターを使用する方法の 2 通りがあります。
まず、次の例に示すように、認証メカニズムプロパティ用のPython辞書を作成します。
properties = {"ENVIRONMENT": "gcp", "TOKEN_RESOURCE": "<audience>"}
次に、次の接続オプションを設定します。
authMechanism
:"MONGODB-OIDC"
に設定します。authMechanismProperties
: 前のステップで作成したproperties
辞書に設定します。
次のコード例は、 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 )
接続stringに次の接続オプションを含めます。
authMechanism
:MONGODB-OIDC
に設定します。authMechanismProperties
:ENVIRONMENT:gcp,TOKEN_RESOURCE:<audience>
に設定します。
次のコード例は、 接続stringでこれらのオプションを設定する方法を示しています。
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)
その他の Azure 環境
If your application runs on Azure Functions, App Service Environment (ASE), or Azure Kubernetes Service (AKS), you can use the azure-identity package to fetch authentication credentials.
まず、次の例に示すように、 pip を使用してazure-identity
ライブラリをインストールします。
python3 -m pip install azure-identity
次に、 OIDCCallback
クラスから継承する クラスを定義します。 このクラスでは、OIDC トークンをOIDCCallbackResult
オブジェクトの形式で返すfetch()
メソッドを実装する必要があります。
次の例は、 MyCallback
という名前のコールバック クラスを定義する方法を示しています。 このクラスには、標準のサービス アカウント トークン ファイルの場所内のファイルから OIDC トークンを検索するfetch()
メソッドが含まれています。
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)
コールバック クラスを定義したら、カスタム コールバック クラスのインスタンスである 1 つのキー"OIDC_CALLBACK"
を含む Python 辞書を作成します。
properties = {"OIDC_CALLBACK": MyCallback()}
最後に、 MongoClient
コンストラクターに引数を渡して、次の接続オプションを設定します。
authMechanism
:"MONGODB-OIDC"
に設定します。authMechanismProperties
: 前のステップで作成したproperties
辞書に設定します。
from pymongo import MongoClient from azure.identity import DefaultAzureCredential from pymongo.auth_oidc import OIDCCallback, OIDCCallbackContext, OIDCCallbackResult # define callback, properties, and MongoClient 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) properties = {"OIDC_CALLBACK": MyCallback()} client = MongoClient( "mongodb[+srv]://<hostname>:<port>", authMechanism="MONGODB-OIDC", authMechanismProperties=properties )
GCP GKE
アプリケーションが、構成された サービス アカウント を持つGCP Google Kubernetes Engine(GKE)クラスターで実行される場合は、標準のサービスアカウント トークンファイルの場所から OIDC トークンを読み取ることができます。
まず、 OIDCCallback
クラスから継承するクラスを定義します。 このクラスでは、OIDC トークンをOIDCCallbackResult
オブジェクトの形式で返すfetch()
メソッドを実装する必要があります。
次の例は、 MyCallback
という名前のコールバック クラスを定義する方法を示しています。 このクラスには、標準のサービス アカウント トークン ファイルの場所内のファイルから OIDC トークンを検索するfetch()
メソッドが含まれています。
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)
コールバック クラスを定義したら、カスタム コールバック クラスのインスタンスである 1 つのキー"OIDC_CALLBACK"
を含む Python 辞書を作成します。
properties = {"OIDC_CALLBACK": MyCallback()}
最後に、 MongoClient
コンストラクターに引数を渡して、次の接続オプションを設定します。
authMechanism
:"MONGODB-OIDC"
に設定します。authMechanismProperties
: 前のステップで作成したproperties
辞書に設定します。
from pymongo import MongoClient from pymongo.auth_oidc import OIDCCallback, OIDCCallbackContext, OIDCCallbackResult # define callback, properties, and MongoClient 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) properties = {"OIDC_CALLBACK": MyCallback()} client = MongoClient( "mongodb[+srv]://<hostname>:<port>", authMechanism="MONGODB-OIDC", authMechanismProperties=properties )