Overview
OpenID Connect (OIDC)身份验证机制允许您使用第三方身份提供商(例如Azure或Google Cloud Platform (GCP ))向MongoDB进行身份验证。
重要
MONGODB-OIDC 身份验证机制要求在 Linux 平台上运行 MongoDB Server v 7.0或更高版本。
要学习;了解有关为 OIDC身份验证配置MongoDB Atlas 的更多信息,请参阅Atlas文档中的使用 OIDC 设置劳动力身份联合。
有关在MongoDB中使用 OIDC身份验证的更多信息,请参阅MongoDB Server手册中的使用 OIDC/OAuth2.0 和 oidcIdentityProviders 进行身份验证和授权。
代码占位符
本页上的代码示例使用以下占位符:
<username>: Azure托管标识或企业应用程序的客户端ID或应用程序 ID 。用于Azure IMDS身份验证。<hostname>: MongoDB 部署的网络解决。<port>: MongoDB 部署的端口号。如果省略此参数,驱动程序将使用默认端口号 (27017)。连接MongoDB Atlas 集群时无需端口号。<audience>或<percent-encoded audience>:在MongoDB 部署上配置的audience服务器参数的值。在连接字符串中指定该值时,请对该值进行百分比编码。
要使用代码示例,请将这些占位符替换为您自己的值。
指定 OIDC 身份验证
以下部分介绍如何使用 OIDC 从各种平台进行身份验证。
Azure IMDS
如果应用程序在 Azure VM 上运行,或以其他方式使用 Azure 实例元数据服务 (IMDS),则可以使用 Java Reactive Streams 驱动程序的内置 Azure 支持对 MongoDB 进行身份验证。
您可以使用Azure MongoCredential或作为连接 的一部分来指定 IMDS OIDC身份验证。string
从 Connection String 或 MongoCredential 标签页中进行选择,查看相应的语法:
要将Azure IMDS OIDC 指定为身份验证机制,请在连接string中设立以下选项:
authMechanism:设置为MONGODB-OIDC。authMechanismProperties:设置为ENVIRONMENT:azure,TOKEN_RESOURCE:<url-encoded-resource>。
将 <username> 占位符替换为Azure托管身份或企业应用程序的客户端ID或应用程序 ID 。将 <percent-encoded audience> 占位符替换为MongoDB 部署上配置的受众服务器参数的百分比编码值。
当 ENVIRONMENT设立为 azure 时,您必须提供URL编码的 TOKEN_RESOURCE 值。逗号 (,) 字符及其编码 (%2C) 被保留,在值中使用这些字符会导致驾驶员将逗号解释为键值对的分隔符。您必须在 MongoCredential实例中指定包含逗号的值,如 MongoCredential标签页中所示。
MongoClient mongoClient = MongoClients.create( "mongodb://<username>@<hostname>:<port>/?" + "?authMechanism=MONGODB-OIDC" + "&authMechanismProperties=ENVIRONMENT:azure,TOKEN_RESOURCE:<percent-encoded audience>");
将<username>占位符替换为Azure托管身份或企业应用程序的客户端ID或应用程序 ID 。 将<audience>占位符替换为MongoDB 部署上配置的audience服务器参数的值。
MongoCredential credential = MongoCredential.createOidcCredential("<username>") .withMechanismProperty("ENVIRONMENT", "azure") .withMechanismProperty("TOKEN_RESOURCE", "<audience>"); MongoClient mongoClient = MongoClients.create( MongoClientSettings.builder() .applyToClusterSettings(builder -> builder.hosts(Arrays.asList(new ServerAddress("<hostname>", <port>)))) .credential(credential) .build());
GCP IMDS
如果您的应用程序在 Google Compute Engine VM 上运行,或以其他方式使用GCP实例元数据服务,则可以使用Java Reactive Streams 驱动程序的内置GCP支持向MongoDB进行身份验证。
您可以使用GCP MongoCredential或作为连接 的一部分来指定 IMDS OIDC身份验证。string
从 Connection String 或 MongoCredential 标签页中进行选择,查看相应的语法:
要将GCP IMDS OIDC 指定为身份验证机制,请在连接string中设立以下选项:
authMechanism:设置为MONGODB-OIDC。authMechanismProperties:设置为ENVIRONMENT:gcp,TOKEN_RESOURCE:<url-encoded-resource>。
将 <percent-encoded audience> 占位符替换为MongoDB 部署上配置的 audience服务器参数的百分比编码值。
当 ENVIRONMENT设立为 gcp 时,您必须提供URL编码的 TOKEN_RESOURCE 值。逗号 (,) 字符及其编码 (%2C) 被保留,在值中使用这些字符会导致驾驶员将逗号解释为键值对的分隔符。您必须在 MongoCredential实例中指定包含逗号的值,如 MongoCredential标签页中所示。
MongoClient mongoClient = MongoClients.create( "mongodb://<hostname>:<port>/?" + "authMechanism=MONGODB-OIDC" + "&authMechanismProperties=ENVIRONMENT:gcp,TOKEN_RESOURCE:<percent-encoded audience>");
将<audience>占位符替换为MongoDB 部署上配置的audience服务器参数的值。
MongoCredential credential = MongoCredential.createOidcCredential() .withMechanismProperty("ENVIRONMENT", "gcp") .withMechanismProperty("TOKEN_RESOURCE", "<audience>"); MongoClient mongoClient = MongoClients.create( MongoClientSettings.builder() .applyToClusterSettings(builder -> builder.hosts(Arrays.asList(new ServerAddress("<hostname>", <port>)))) .credential(credential) .build());
Kubernetes
如果应用程序在Kubernetes集群上运行,则可以使用Java Reactive Streams 驱动程序的内置Kubernetes支持向MongoDB进行身份验证。
从Connection String或MongoCredential标签页中进行选择,以查看相应的语法。
要将Kubernetes OIDC 指定为身份验证机制,请在连接字符串中设立以下选项:
authMechanism:设置为MONGODB-OIDC。authMechanismProperties:设置为ENVIRONMENT:k8s。
将 <hostname> 和 <port> 占位符替换为MongoDB 部署的网络解决和端口号。
MongoClient mongoClient = MongoClients.create( "mongodb://<hostname>:<port>/" + "?authMechanism=MONGODB-OIDC" + "&authMechanismProperties=ENVIRONMENT:k8s");
将 <hostname> 和 <port> 占位符替换为MongoDB 部署的网络解决和端口号。
MongoCredential credential = MongoCredential.createOidcCredential(null) .withMechanismProperty("ENVIRONMENT", "k8s"); MongoClient mongoClient = MongoClients.create( MongoClientSettings.builder() .applyToClusterSettings(builder -> builder.hosts(Arrays.asList(new ServerAddress("<hostname>", <port>)))) .credential(credential) .build());
如果您指定Kubernetes OIDC 作为身份验证机制,驱动程序将从以下位置之一读取 OIDC 令牌的内容:
AZURE_FEDERATED_TOKEN_FILE在Azure Kubernetes Service (AKS) 上运行的应用程序的环境变量AWS_WEB_IDENTITY_TOKEN_FILE在Elastic Kubernetes Service (EKS)上运行的应用程序的环境变量/var/run/secrets/kubernetes.io/serviceaccount/token文件,所有其他应用程序的默认位置,包括在 Google Kubernetes Engine (GKE) 上运行的应用程序
您必须将 OIDC 令牌存储在与用于运行应用程序的服务相对应的位置。
自定义回调
Java Reactive Streams驱动程序并不为所有平台提供内置支持,包括Azure Functions 和Azure Kubernetes Service (AKS)。相反,您必须定义自定义回调,才能使用 OIDC 从这些平台进行身份验证。为此,请使用 "OIDC_CALLBACK" 身份身份验证属性,如以下代码示例所示:
MongoCredential credential = MongoCredential.createOidcCredential(null) .withMechanismProperty("OIDC_CALLBACK", (context) -> { String accessToken = ... return new OidcCallbackResult(accessToken); });
"OIDC_CALLBACK" 属性的值必须是Lambda或接受 OidcCallbackContext 作为参数并返回 OidcCallbackResult 的 OidcCallback 函数式接口的其他实现。
以下示例从本地文件系统中名为 "access-token.dat" 的文件中检索 OIDC 令牌:
MongoCredential credential = MongoCredential.createOidcCredential(null) .withMechanismProperty("OIDC_CALLBACK", (context) -> { string accessToken = new String(Files.readAllBytes(Paths.get("access-token.dat")); return new OidcCallbackResult(accessToken); }); MongoClient mongoClient = MongoClients.create( MongoClientSettings.builder() .applyToClusterSettings(builder -> builder.hosts(Arrays.asList(new ServerAddress("<hostname>", <port>)))) .credential(credential) .build());
API 文档
要学习;了解有关本页讨论的任何方法或类型的更多信息,请参阅以下API文档: