OIDC (ワークロード IdP)
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 に含める前に、パーセント エンコードする必要があります。urllib.parse モジュールで使用可能な quote_plus()
メソッドは、このタスクを実行する 1 つの方法です 。例、quote_plus("and / or")
を呼び出すと string and+%2F+or
が返されます。
ユーザー名またはパスワードをMongoClient
に引数として渡す場合は、これらをパーセント エンコードしないでください。
アプリケーションでの OIDC 認証の使用
次のセクションでは、MONGODB-OIDC 認証メカニズムを使用してさまざまなプラットフォームに認証する方法について説明します。
注意
Python の標準ライブラリは非同期 HTTP リクエストをサポートしていないため、PyMongo からのすべての OIDC リクエストは同期され、 asyncio
ループをブロックします。
Azure IMDS
アプリケーションが Azure VM 上で実行され、 や Azure インスタンス メタデータ サービス が使用される場合 (MDS)に設定されている場合は、PyMongo に組み込まれている Azure サポートを使用して MongoDB に認証できます。
Azure IMDS 用の OIDC は、MongoClient
コンストラクターに引数を渡す方法と、 接続stringのパラメーターを使用する方法の 2 通りがあります。
注意
authMechanismProperties
値にカンマが含まれている場合は、認証オプションを設定するためにMongoClient
コンストラクタを使用する必要があります。
まず、次の例に示すように、認証メカニズムプロパティ用のPython辞書を作成します。
properties = {"ENVIRONMENT": "azure", "TOKEN_RESOURCE": "<audience>"}
次に、次の接続オプションを設定します。
username
: Azure マネージド ID を使用している場合は、管理対象 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 にこれを設定します。 サービス プリンシパル を使用してエンタープライズ アプリケーションを表す場合は、これをサービス プリンシパルのアプリケーション 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
アプリケーションが Google Compute Engine VM で実行され、または GCP インスタンス メタデータ サービス を使用している場合 、PyMongo に組み込まれている GCP サポートを使用して MongoDB に認証できます。
GCP IMDS 用の OIDC は、MongoClient
コンストラクターに引数を渡す方法と、 接続stringのパラメーターを使用する方法の 2 通りがあります。
注意
authMechanismProperties
値にカンマが含まれている場合は、認証オプションを設定するためにMongoClient
コンストラクタを使用する必要があります。
まず、次の例に示すように、認証メカニズムプロパティ用の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 環境
アプリケーションが Azure Functions、App Service environment(ASE)、または Azure Kubernetes Service(AKS)で実行される場合は、Azure -ID を使用できます 認証資格情報を取得するためのパッケージ。
まず、次の例に示すように、 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
辞書に設定します。
対応するコードを表示するには、Synchronous タブまたは Asynchronousタブを選択します。
client = MongoClient( "mongodb[+srv]://<hostname>:<port>", authMechanism="MONGODB-OIDC", authMechanismProperties=properties )
client = AsyncMongoClient( "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
辞書に設定します。
対応するコードを表示するには、Synchronous タブまたは Asynchronousタブを選択します。
client = MongoClient( "mongodb[+srv]://<hostname>:<port>", authMechanism="MONGODB-OIDC", authMechanismProperties=properties )
client = AsyncMongoClient( "mongodb[+srv]://<hostname>:<port>", authMechanism="MONGODB-OIDC", authMechanismProperties=properties )
Kubernetes
アプリケーションがKubernetesクラスターで実行される場合は、PyMongo に組み込まれているKubernetesサポートを使用してMongoDBに認証できます。
Kubernetes用の OIDC は、MongoClient
コンストラクターに引数を渡す方法と、接続文字列のパラメーターを使用する方法の 2 通りがあります。 アプリケーションのKubernetes認証を有効にする方法を確認するには、次のタブから を選択します。
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)