@@ -197,16 +197,301 @@ address of your MongoDB server:
197
197
authenticates using the PLAIN Simple Authentication and Security Layer
198
198
(SASL) defined in `RFC-4616 <https://tools.ietf.org/html/rfc4616>`__.
199
199
200
+ .. _golang-mongodb-oidc:
201
+
202
+ MONGODB-OIDC
203
+ ------------
204
+
205
+ .. important::
206
+
207
+ The MONGODB-OIDC authentication mechanism requires {+mdb-server+}
208
+ v7.0 or later running on a Linux platform.
209
+
210
+ The {+driver-short+} supports OpenID Connect (**OIDC**) authentication for **workload
211
+ identities**. A workload identity is an identity you assign to a
212
+ software workload, such as an application, service, script, or
213
+ container, to authenticate and access other services and resources.
214
+
215
+ The following sections describe how to use the MONGODB-OIDC
216
+ authentication mechanism to authenticate to various platforms.
217
+
218
+ To learn more about the MONGODB-OIDC authentication mechanism, see
219
+ :manual:`OpenID Connect Authentication </core/security-oidc/>` and
220
+ :manual:`MongoDB Server Parameters </reference/parameters/#mongodb-parameter-param.oidcIdentityProviders>`
221
+ in the {+mdb-server+} manual.
222
+
223
+ .. _golang-mongodb-oidc-azure-imds:
224
+
225
+ Azure IMDS
226
+ ~~~~~~~~~~
227
+
228
+ If your application runs on an Azure VM, or otherwise uses the
229
+ `Azure Instance Metadata Service <https://learn.microsoft.com/en-us/azure/virtual-machines/instance-metadata-service>`__
230
+ (IMDS), you can authenticate to MongoDB by using the {+driver-short+}'s
231
+ built-in Azure support.
232
+
233
+ You can configure OIDC for Azure IMDS in the following ways:
234
+
235
+ - By creating a ``Credential`` struct and passing it to the
236
+ ``SetAuth()`` method when creating a client
237
+ - By setting parameters in your connection string
238
+
239
+ .. include:: /includes/authentication/auth-properties-commas.rst
240
+
241
+ .. tabs::
242
+
243
+ .. tab:: Credential
244
+ :tabid: credential struct
245
+
246
+ First, create a map to store your authentication
247
+ mechanism properties, as shown in the following example. Replace
248
+ the ``<audience>`` placeholder with the value of the ``audience``
249
+ parameter configured on your MongoDB deployment.
250
+
251
+ .. code-block:: go
252
+
253
+ props := map[string]string{
254
+ "ENVIRONMENT": "azure",
255
+ "TOKEN_RESOURCE": "<audience>",
256
+ }
257
+
258
+ Then, set the following ``Credential`` struct fields:
259
+
260
+ - ``Username``: If you're using an Azure managed identity, set this to the client ID
261
+ of the managed identity. If you're using a service principal to represent an
262
+ enterprise application, set this to the application ID of the service principal.
263
+ - ``AuthMechanism``: Set to ``"MONGODB-OIDC"``.
264
+ - ``AuthMechanismProperties``: Set to the ``props`` map that you
265
+ previously created.
266
+
267
+ The following code example shows how to set these options when creating a
268
+ ``Client``:
269
+
270
+ .. literalinclude:: /includes/authentication/azure-imds-client.go
271
+ :dedent:
272
+ :language: go
273
+ :copyable: true
274
+ :start-after: start-azure-imds-client
275
+ :end-before: end-azure-imds-client
276
+ :emphasize-lines: 9-11
277
+
278
+ .. tab:: Connection String
279
+ :tabid: connectionstring
280
+
281
+ Include the following connection options in your connection string:
282
+
283
+ - ``username``: If you're using an Azure managed identity, set this to the client ID
284
+ of the managed identity. If you're using a service principal to represent an
285
+ enterprise application, set this to the application ID of the service principal.
286
+ - ``authMechanism``: Set to ``MONGODB-OIDC``.
287
+ - ``authMechanismProperties``: Set to
288
+ ``ENVIRONMENT:azure,TOKEN_RESOURCE:<audience>``.
289
+ Replace the ``<audience>`` placeholder with the
290
+ value of the ``audience`` parameter configured on your MongoDB deployment.
291
+
292
+ The following code example shows how to set these options in
293
+ your connection string:
294
+
295
+ .. code-block:: go
296
+
297
+ uri := "mongodb://<hostname>:<port>/?" +
298
+ "username=<Azure client ID or application ID>" +
299
+ "&authMechanism=MONGODB-OIDC" +
300
+ "&authMechanismProperties=ENVIRONMENT:azure,TOKEN_RESOURCE:<percent-encoded audience>"
301
+
302
+ client, err := mongo.Connect(options.Client().ApplyURI(uri))
303
+ if err != nil {
304
+ panic(err)
305
+ }
306
+
307
+ .. tip::
308
+
309
+ If your application is running on an Azure VM, and only one managed identity is
310
+ associated with the VM, you can omit the ``username`` connection option.
311
+
312
+ .. _golang-mongodb-oidc-gcp-imds:
313
+
314
+ GCP IMDS
315
+ ~~~~~~~~
316
+
317
+ If your application runs on a Google Compute Engine VM, or otherwise uses the
318
+ `GCP Instance Metadata Service <https://cloud.google.com/compute/docs/metadata/querying-metadata>`__,
319
+ you can authenticate to MongoDB by using the {+driver-short+}'s built-in GCP
320
+ support.
321
+
322
+ You can configure OIDC for GCP IMDS in the following ways:
323
+
324
+ - By creating a ``Credential`` struct and passing it to the
325
+ ``SetAuth()`` method when creating a client
326
+ - By setting parameters in your connection string
327
+
328
+ .. include:: /includes/authentication/auth-properties-commas.rst
329
+
330
+ .. tabs::
331
+
332
+ .. tab:: Credential
333
+ :tabid: credential struct
334
+
335
+ First, create a map to store your authentication
336
+ mechanism properties, as shown in the following example. Replace
337
+ the ``<audience>`` placeholder with the value of the ``audience``
338
+ parameter configured on your MongoDB deployment.
339
+
340
+ .. code-block:: go
341
+
342
+ props := map[string]string{
343
+ "ENVIRONMENT": "gcp",
344
+ "TOKEN_RESOURCE": "<audience>",
345
+ }
346
+
347
+ Then, set the following ``Credential`` struct fields:
348
+
349
+ - ``AuthMechanism``: Set to ``"MONGODB-OIDC"``.
350
+ - ``AuthMechanismProperties``: Set to the ``props`` map that you
351
+ previously created.
352
+
353
+ The following code example shows how to set these options when creating a
354
+ ``Client``:
355
+
356
+ .. literalinclude:: /includes/authentication/gcp-imds-client.go
357
+ :language: go
358
+ :dedent:
359
+ :copyable: true
360
+ :start-after: start-gcp-imds-client
361
+ :end-before: end-gcp-imds-client
362
+ :emphasize-lines: 9-10
363
+
364
+ .. tab:: Connection String
365
+ :tabid: connectionstring
366
+
367
+ Include the following connection options in your connection string:
368
+
369
+ - ``authMechanism``: Set to ``MONGODB-OIDC``.
370
+ - ``authMechanismProperties``: Set to
371
+ ``ENVIRONMENT:gcp,TOKEN_RESOURCE:<audience>``.
372
+ Replace the ``<audience>`` placeholder with the
373
+ value of the ``audience`` parameter configured on your MongoDB deployment.
374
+
375
+ The following code example shows how to set these options in your connection string:
376
+
377
+ .. code-block:: go
378
+
379
+ uri := "mongodb://<hostname>:<port>/?" +
380
+ "&authMechanism=MONGODB-OIDC" +
381
+ "&authMechanismProperties=ENVIRONMENT:gcp,TOKEN_RESOURCE:<percent-encoded audience>"
382
+
383
+ client, err := mongo.Connect(options.Client().ApplyURI(uri))
384
+ if err != nil {
385
+ panic(err)
386
+ }
387
+
388
+ .. _golang-mongodb-oidc-custom-callback:
389
+
390
+ Custom Callback
391
+ ~~~~~~~~~~~~~~~
392
+
393
+ The {+driver-short+} doesn't offer built-in support for all platforms,
394
+ including the AWS Elastic Kubernetes Service (EKS). To authenticate
395
+ against unsupported platforms, you must define a custom callback
396
+ function to use OIDC to authenticate. In the driver, you can define an
397
+ ``options.OIDCCallback`` function and set it as the value of the
398
+ ``OIDCMachineCallback`` struct field in your ``Credential`` struct.
399
+
400
+ The following example defines a custom callback for an EKS
401
+ cluster with a configured IAM OIDC provider. The access token is
402
+ read from a path set in the ``AWS_WEB_IDENTITY_TOKEN_FILE``
403
+ environment variable:
404
+
405
+ .. literalinclude:: /includes/authentication/eks-custom-callback.go
406
+ :language: go
407
+ :dedent:
408
+ :copyable: true
409
+ :start-after: start-custom-callback
410
+ :end-before: end-custom-callback
411
+
412
+ Then, you can create a ``Credential`` struct that uses the EKS callback
413
+ function that you defined:
414
+
415
+ .. literalinclude:: /includes/authentication/eks-custom-callback.go
416
+ :language: go
417
+ :dedent:
418
+ :copyable: true
419
+ :start-after: start-credential-callback
420
+ :end-before: end-credential-callback
421
+ :emphasize-lines: 6
422
+
423
+ .. _golang-mongodb-oidc-azure-envs:
424
+
425
+ Other Azure Environments
426
+ ~~~~~~~~~~~~~~~~~~~~~~~~
427
+
428
+ If your application runs on Azure Functions, App Service Environment (ASE), or Azure
429
+ Kubernetes Service (AKS), you can use the `azidentity
430
+ <https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/azidentity>`__
431
+ module to fetch authentication credentials.
432
+
433
+ First, install the ``azidentity`` module by running the
434
+ following command:
435
+
436
+ .. code-block:: sh
437
+
438
+ go get -u github.com/Azure/azure-sdk-for-go/sdk/azidentity
439
+
440
+ Your ``OIDCCallback`` function must return an ``OIDCCredential``
441
+ instance that uses the ``AccessToken`` generated from the ``azidentity``
442
+ package. See the preceding :ref:`golang-mongodb-oidc-custom-callback`
443
+ section for an example that implements a custom callback to retrieve an
444
+ access token and then creates a ``Credential``.
445
+
446
+ .. _golang-mongodb-oidc-gcp-gke:
447
+
448
+ GCP GKE
449
+ ~~~~~~~
450
+
451
+ If your application runs on a GCP Google Kubernetes Engine (GKE) cluster with a
452
+ `configured service account
453
+ <https://cloud.google.com/kubernetes-engine/docs/how-to/service-accounts>`__,
454
+ you can read the OIDC token from the standard service-account token-file location.
455
+
456
+ First, define the ``OIDCCallback`` function. This function reads the
457
+ OIDC token and returns an ``OIDCCredential`` instance.
458
+
459
+ The following example defines a callback function named ``gkeCallback``.
460
+ The function retrieves an OIDC token from a file in the standard
461
+ service-account token-file location:
462
+
463
+ .. literalinclude:: /includes/authentication/gke-callback.go
464
+ :language: go
465
+ :copyable: true
466
+ :dedent:
467
+ :start-after: start-callback
468
+ :end-before: end-callback
469
+
470
+ Then, you can create a ``Credential`` struct that uses the the GKE
471
+ callback function that you defined:
472
+
473
+ .. literalinclude:: /includes/authentication/gke-callback.go
474
+ :language: go
475
+ :copyable: true
476
+ :dedent:
477
+ :start-after: start-credential-callback
478
+ :end-before: end-credential-callback
479
+ :emphasize-lines: 6
480
+
200
481
Additional Information
201
482
----------------------
202
483
203
484
To learn more about the concepts in this guide, see the following documentation:
204
485
205
486
- :manual:`MongoDB Server Support for Kerberos Authentication </core/kerberos/>`
206
487
- :manual:`MongoDB Server Support for LDAP Proxy Authentication </core/security-ldap/>`
488
+ - :atlas:`Authentication and Authorization with OIDC/OAuth 2.0 </security-oidc/>`
207
489
208
490
API Documentation
209
491
~~~~~~~~~~~~~~~~~
210
492
211
493
- `Credential <{+api+}/mongo/options#Credential>`__ type
212
- - `SetAuth() <{+api+}/mongo/options#ClientOptions.SetAuth>`__ method
494
+ - `SetAuth() <{+api+}/mongo/options#ClientOptions.SetAuth>`__ method
495
+
496
+ .. TODO - `OIDCCredential <{+api+}/...>`__ type
497
+ .. TODO - `OIDCCallback <{+api+}/...>`__ function
0 commit comments