@@ -384,3 +384,165 @@ would be::
384
384
.. _Assume Role : https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html
385
385
.. _EC2 instance : https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_switch-role-ec2.html
386
386
.. _environment variables : https://docs.aws.amazon.com/lambda/latest/dg/configuration-envvars.html#configuration-envvars-runtime
387
+
388
+ MONGODB-OIDC
389
+ ------------
390
+ .. versionadded :: 4.7
391
+
392
+ The `MONGODB-OIDC authentication mechanism `_ is available in MongoDB 7.0+ on Linux platforms.
393
+
394
+ The MONGODB-OIDC mechanism authenticates using an OpenID Connect (OIDC) access token.
395
+ The driver supports OIDC for workload identity, defined as an identity you assign to a software workload
396
+ (such as an application, service, script, or container) to authenticate and access other services and resources.
397
+
398
+ Credentials can be configured through the MongoDB URI or as arguments to
399
+ :class: `~pymongo.mongo_client.MongoClient `.
400
+
401
+ Built-in Support
402
+ ~~~~~~~~~~~~~~~~
403
+
404
+ The driver has built-in support for Azure IMDS and GCP IMDS environments. Other environments
405
+ are supported with `Custom Callbacks `_.
406
+
407
+ Azure IMDS
408
+ ^^^^^^^^^^
409
+
410
+ For an application running on an Azure VM or otherwise using the `Azure Internal Metadata Service `_,
411
+ you can use the built-in support for Azure, where "<client_id>" below is the client id of the Azure
412
+ managed identity, and ``<audience> `` is the url-encoded ``audience `` `configured on your MongoDB deployment `_.
413
+
414
+ .. code-block :: python
415
+
416
+ import os
417
+
418
+ uri = os.environ[" MONGODB_URI" ]
419
+
420
+ props = {" ENVIRONMENT" : " azure" , " TOKEN_RESOURCE" : " <audience>" }
421
+ c = MongoClient(
422
+ uri,
423
+ username = " <client_id>" ,
424
+ authMechanism = " MONGODB-OIDC" ,
425
+ authMechanismProperties = props,
426
+ )
427
+ c.test.test.insert_one({})
428
+ c.close()
429
+
430
+ If the application is running on an Azure VM and only one managed identity is associated with the
431
+ VM, ``username `` can be omitted.
432
+
433
+ GCP IMDS
434
+ ^^^^^^^^
435
+
436
+ For an application running on an GCP VM or otherwise using the `GCP Internal Metadata Service `_,
437
+ you can use the built-in support for GCP, where ``<audience> `` below is the url-encoded ``audience ``
438
+ `configured on your MongoDB deployment `_.
439
+
440
+ .. code-block :: python
441
+
442
+ import os
443
+
444
+ uri = os.environ[" MONGODB_URI" ]
445
+
446
+ props = {" ENVIRONMENT" : " gcp" , " TOKEN_RESOURCE" : " <audience>" }
447
+ c = MongoClient(uri, authMechanism = " MONGODB-OIDC" , authMechanismProperties = props)
448
+ c.test.test.insert_one({})
449
+ c.close()
450
+
451
+
452
+ Custom Callbacks
453
+ ~~~~~~~~~~~~~~~~
454
+
455
+ For environments that are not directly supported by the driver, you can use :class: `~pymongo.auth_oidc.OIDCCallback `.
456
+ Some examples are given below.
457
+
458
+ AWS EKS
459
+ ^^^^^^^
460
+
461
+ For an EKS Cluster with a configured `IAM OIDC provider `_, the token can be read from a path given by
462
+ the ``AWS_WEB_IDENTITY_TOKEN_FILE `` environment variable.
463
+
464
+ .. code-block :: python
465
+
466
+ import os
467
+ from pymongo.auth_oidc import OIDCCallback, OIDCCallbackContext, OIDCCallbackResult
468
+
469
+
470
+ class MyCallback (OIDCCallback ):
471
+ def fetch (self , context : OIDCCallbackContext) -> OIDCCallbackResult:
472
+ with open (os.environ[" AWS_WEB_IDENTITY_TOKEN_FILE" ]) as fid:
473
+ token = fid.read()
474
+ return OIDCCallbackResult(access_token = token)
475
+
476
+
477
+ uri = os.environ[" MONGODB_URI" ]
478
+ props = {" OIDC_CALLBACK" : MyCallback()}
479
+ c = MongoClient(uri, authMechanism = " MONGODB-OIDC" , authMechanismProperties = props)
480
+ c.test.test.insert_one({})
481
+ c.close()
482
+
483
+
484
+ Other Azure Environments
485
+ ^^^^^^^^^^^^^^^^^^^^^^^^
486
+
487
+ For applications running on Azure Functions, App Service Environment (ASE), or
488
+ Azure Kubernetes Service (AKS), you can use the `azure-identity package `_
489
+ to fetch the credentials. This example assumes you have set environment variables for
490
+ the ``audience `` `configured on your MongoDB deployment `_, and for the client id of the Azure
491
+ managed identity.
492
+
493
+ .. code-block :: python
494
+
495
+ import os
496
+ from azure.identity import DefaultAzureCredential
497
+ from pymongo import MongoClient
498
+ from pymongo.auth_oidc import OIDCCallback, OIDCCallbackContext, OIDCCallbackResult
499
+
500
+ audience = os.environ[" AZURE_AUDIENCE" ]
501
+ client_id = os.environ[" AZURE_IDENTITY_CLIENT_ID" ]
502
+ uri = os.environ[" MONGODB_URI" ]
503
+
504
+
505
+ class MyCallback (OIDCCallback ):
506
+ def fetch (self , context : OIDCCallbackContext) -> OIDCCallbackResult:
507
+ credential = DefaultAzureCredential(managed_identity_client_id = client_id)
508
+ token = credential.get_token(f " { audience} /.default " ).token
509
+ return OIDCCallbackResult(access_token = token)
510
+
511
+
512
+ props = {" OIDC_CALLBACK" : MyCallback()}
513
+ c = MongoClient(uri, authMechanismProperties = props)
514
+ c.test.test.insert_one({})
515
+ c.close()
516
+
517
+ GCP GKE
518
+ ^^^^^^^
519
+
520
+ For a Google Kubernetes Engine cluster with a `configured service account `_, the token can be read from the standard
521
+ service account token file location.
522
+
523
+ .. code-block :: python
524
+
525
+ import os
526
+ from pymongo.auth_oidc import OIDCCallback, OIDCCallbackContext, OIDCCallbackResult
527
+
528
+
529
+ class MyCallback (OIDCCallback ):
530
+ def fetch (self , context : OIDCCallbackContext) -> OIDCCallbackResult:
531
+ with open (" /var/run/secrets/kubernetes.io/serviceaccount/token" ) as fid:
532
+ token = fid.read()
533
+ return OIDCCallbackResult(access_token = token)
534
+
535
+
536
+ uri = os.environ[" MONGODB_URI" ]
537
+ props = {" OIDC_CALLBACK" : MyCallback()}
538
+ c = MongoClient(uri, authMechanism = " MONGODB-OIDC" , authMechanismProperties = props)
539
+ c.test.test.insert_one({})
540
+ c.close()
541
+
542
+ .. _MONGODB-OIDC authentication mechanism : https://www.mongodb.com/docs/manual/core/security-oidc/
543
+ .. _Azure Internal Metadata Service : https://learn.microsoft.com/en-us/azure/virtual-machines/instance-metadata-service
544
+ .. _configured on your MongoDB deployment : https://www.mongodb.com/docs/manual/reference/parameters/#mongodb-parameter-param.oidcIdentityProviders
545
+ .. _GCP Internal Metadata Service : https://cloud.google.com/compute/docs/metadata/querying-metadata
546
+ .. _IAM OIDC provider : https://docs.aws.amazon.com/eks/latest/userguide/enable-iam-roles-for-service-accounts.html
547
+ .. _azure-identity package : https://pypi.org/project/azure-identity/
548
+ .. _configured service account : https://cloud.google.com/kubernetes-engine/docs/how-to/service-accounts
0 commit comments