Overview
OpenID Connect (OIDC)身份验证机制允许您使用第三方身份提供商(例如Azure或Google Cloud Platform (GCP ))向MongoDB进行身份验证。
只有在对MongoDB Atlas或MongoDB Enterprise Advanced进行身份验证时,并且只能在对MongoDB v7.0 或更高版本进行身份验证时,才能使用此机制。
提示
OIDC 身份验证
要学习;了解有关为 OIDC身份验证配置MongoDB Atlas 的更多信息,请参阅Atlas文档中的 使用 OIDC 设置 Workforce Identity Federation。
有关在MongoDB中使用 OIDC身份验证的更多信息,请参阅MongoDB服务器手册中的 OpenID Connect 身份验证 和 MongoDB Server 参数。
以下部分介绍如何使用 MONGODB-OIDC 身份验证机制对各种平台进行身份验证。
Azure IMDS
如果应用程序在Azure VM 上运行,或以其他方式使用Azure实例元数据服务 (IMDS),则可以使用Kotlin驱动程序的内置Azure支持对MongoDB进行身份验证。
您可以通过在连接字符串中指定您的凭证或使用 MongoCredential实例来指定Azure IMDS OIDC身份验证。选择 Connection String 或 MongoCredential标签页,学习;了解如何指定Azure IMDS OIDC身份验证。
将以下代码中的<percent-encoded audience>占位符替换为MongoDB 部署上配置的受众服务器参数的百分比编码值。
逗号 (,) 字符及其编码 (%2C) 被保留,在值中使用这些字符会导致驱动程序将逗号解释为键值对的分隔符。您必须在 MongoCredential实例中指定包含逗号的值。
val connectionString = ConnectionString( "mongodb://<OIDC principal>@<hostname>:<port>/?" + "?authMechanism=MONGODB-OIDC" + "&authMechanismProperties=ENVIRONMENT:azure,TOKEN_RESOURCE:<percent-encoded audience>") val mongoClient = MongoClient.create(connectionString)
将<OIDC principal>占位符替换为Azure托管身份或企业应用程序的客户端ID或应用程序 ID 。 将<audience>占位符替换为MongoDB 部署上配置的audience服务器参数的值。
val credential = MongoCredential.createOidcCredential("<OIDC principal>") .withMechanismProperty("ENVIRONMENT", "azure") .withMechanismProperty("TOKEN_RESOURCE", "<audience>") val mongoClient = MongoClient.create( MongoClientSettings.builder() .applyToClusterSettings { builder -> builder.hosts(listOf(ServerAddress("<hostname>", <port>))) } .credential(credential) .build())
GCP IMDS
如果应用程序在 Google Compute Engine 虚拟机上运行,或以其他方式使用GCP实例元数据服务,则可以使用Kotlin驱动程序的内置GCP支持对MongoDB进行身份验证。
您可以通过在连接字符串中指定您的凭证或使用 MongoCredential实例来指定GCP IMDS OIDC身份验证。
将以下代码中的<percent-encoded audience>占位符替换为MongoDB 部署上配置的受众服务器参数的百分比编码值。
逗号 (,) 字符及其编码 (%2C) 被保留,在值中使用这些字符会导致驱动程序将逗号解释为键值对的分隔符。您必须在 MongoCredential实例中指定包含逗号的值。
val connectionString = ConnectionString( "mongodb://<OIDC principal>@<hostname>:<port>/?" + "authMechanism=MONGODB-OIDC" + "&authMechanismProperties=ENVIRONMENT:gcp,TOKEN_RESOURCE:<percent-encoded audience>") val mongoClient = MongoClient.create(connectionString)
将<audience>占位符替换为MongoDB 部署上配置的audience服务器参数的值。
val credential = MongoCredential.createOidcCredential("<OIDC principal>") .withMechanismProperty("ENVIRONMENT", "gcp") .withMechanismProperty("TOKEN_RESOURCE", "<audience>") val mongoClient = MongoClient.create( MongoClientSettings.builder() .applyToClusterSettings { builder -> builder.hosts(listOf(ServerAddress("<hostname>", <port>))) } .credential(credential) .build())
Kubernetes
如果应用程序在Kubernetes集群上运行,则可以使用Kotlin驱动程序的内置Kubernetes支持向MongoDB进行身份验证。您可以通过在连接字符串中指定凭证或使用 MongoCredential实例来指定Kubernetes OIDC身份验证验证。
要将Kubernetes OIDC 指定为身份验证机制,请在连接字符串中设立以下选项:
authMechanism:设置为MONGODB-OIDC。authMechanismProperties:设置为ENVIRONMENT:k8s。
将以下代码中的<percent-encoded audience>占位符替换为MongoDB 部署上配置的受众服务器参数的百分比编码值。
val connectionString = ConnectionString( "mongodb://<OIDC principal>@<hostname>:<port>/?" + "authMechanism=MONGODB-OIDC" + "&authMechanismProperties=ENVIRONMENT:k8s,TOKEN_RESOURCE:<percent-encoded audience>") val mongoClient = MongoClient.create(connectionString)
将 hostname 和 port 替换为MongoDB 部署的网络解决和端口号。此外,将 <audience> 占位符替换为MongoDB 部署上配置的 audience服务器参数的值。
val credential = MongoCredential.createOidcCredential("<OIDC principal>") .withMechanismProperty("ENVIRONMENT", "k8s") .withMechanismProperty("TOKEN_RESOURCE", "<audience>") val mongoClient = MongoClient.create( MongoClientSettings.builder() .applyToClusterSettings { builder -> builder.hosts(listOf(ServerAddress("<hostname>", <port>))) } .credential(credential) .build())
自定义回调
Kotlin驱动程序并不为所有平台提供内置支持,包括Azure Functions 和Azure Kubernetes Service (AKS)。相反,您必须定义自定义回调,才能使用 OIDC 从这些平台进行身份验证。为此,请使用 "OIDC_CALLBACK" 身份身份验证属性,如以下代码示例所示:
val credential = MongoCredential.createOidcCredential(null) .withMechanismProperty("OIDC_CALLBACK") { context: Context -> val accessToken = "..." OidcCallbackResult(accessToken) }
"OIDC_CALLBACK" 属性的值必须是Lambda或接受 OidcCallbackContext 作为参数并返回 OidcCallbackResult 的 OidcCallback 函数式接口的其他实现。
以下示例使用示例回调从本地文件系统中名为"access-token.dat"的文件中检索 OIDC 令牌:
val credential = MongoCredential.createOidcCredential(null) .withMechanismProperty("OIDC_CALLBACK") { context: Context -> val accessToken = String(Files.readAllBytes(Paths.get("access-token.dat"))) OidcCallbackResult(accessToken) } val mongoClient = MongoClient.create( MongoClientSettings.builder() .applyToClusterSettings { builder -> builder.hosts(listOf(ServerAddress("<hostname>", <port>))) } .credential(credential) .build() )