Join us Sept 17 at .local NYC! Use code WEB50 to save 50% on tickets. Learn more >
MongoDB Event
Docs Menu
Docs Home
/ / /
Pymongo ドライバー
/ /

OIDC (ワークロード IdP)

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に引数として渡す場合は、これらをパーセント エンコードしないでください。

次のセクションでは、MONGODB-OIDC 認証メカニズムを使用してさまざまなプラットフォームに認証する方法について説明します。

注意

Python の標準ライブラリは非同期 HTTP リクエストをサポートしていないため、PyMongo からのすべての OIDC リクエストは同期され、 asyncioループをブロックします。

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接続オプションを省略できます。

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)

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 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
)

戻る

AWS IAM

項目一覧