Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs 菜单
Docs 主页
/ /

OIDC(工作负载联合身份)

重要

MONGODB-OIDC 身份验证机制要求在 Linux 平台上运行 MongoDB Server v 7.0或更高版本。

Rust驱动程序支持对工作负载身份进行 OpenID Connect (OIDC) 身份验证。工作负载身份是分配给软件工作负载(例如应用程序、服务、脚本或容器)的身份,用于验证和访问权限其他服务和资源。

只有在向MongoDB Atlas或MongoDB Enterprise Advanced进行身份验证时,才能使用此机制。

要学习;了解有关 MONGODB-OIDC身份验证机制的更多信息,请参阅MongoDB Server手册中的 OpenID Connect 身份验证MongoDB Server参数

以下部分介绍如何使用 MONGODB-OIDC 身份验证机制对各种平台进行身份验证。

如果应用程序在Azure VM 上运行,或以其他方式使用Azure实例元数据服务 (IMDS),则可以使用Rust驱动程序的内置Azure支持对MongoDB进行身份验证。

您可以通过将 Credential 结构的 mechanism字段设置为 AuthMechanism::MongoDbOidc 来为Azure IMDS 配置 OIDC。您还必须为 Credential 结构指定以下值:

  • username:如果使用的是 Azure 托管标识,请将其设置为托管标识的客户端 ID。 如果使用服务主体代表企业应用程序,请将其设置为服务主体的应用程序 ID。

  • mechanism_properties:将 ENVIRONMENT属性设置为 azure,并将 TOKEN_RESOURCE 设置为MongoDB 部署上配置的受众参数的值。

以下代码示例展示了如何在创建Client时设立这些选项:

let credential = Credential::builder()
.username("<username>".to_owned())
.mechanism(AuthMechanism::MongoDbOidc)
.mechanism_properties(
doc! { "ENVIRONMENT": "azure", "TOKEN_RESOURCE": "<audience>" }
)
.build();
client_options.credential = Some(credential);
let client = Client::with_options(client_options)?;
let res = client
.database("test")
.collection::<Document>("test")
.find_one(doc! {})
.await?;

如果您的应用程序在 Google Compute Engine 虚拟机上运行,或以其他方式使用GCP实例元数据服务,则可以使用Rust驱动程序的内置GCP支持对MongoDB进行身份验证。

您可以通过将 Credential 结构的 mechanism字段设置为 AuthMechanism::MongoDbOidc 来为GCP IMDS 配置 OIDC。 然后,通过在 mechanism_properties字段中设置以下值来指定身份验证机制:

  • ENVIRONMENT:将此属性设置为 gcp

  • TOKEN_RESOURCE:将此属性设置为MongoDB 部署上配置的受众参数值。

以下代码示例展示了如何在创建Client时设立这些选项:

let credential = Credential::builder()
.mechanism(AuthMechanism::MongoDbOidc)
.mechanism_properties(
doc! { "ENVIRONMENT": "gcp", "TOKEN_RESOURCE": "<audience>" }
)
.build();
client_options.credential = Some(credential);
let client = Client::with_options(client_options)?;
let res = client
.database("test")
.collection::<Document>("test")
.find_one(doc! {})
.await?;

如果应用程序在Kubernetes集群上运行,则可以使用Rust驱动程序的内置Kubernetes支持对MongoDB进行身份验证。

您可以通过将 Credential 结构体的 mechanism字段设置为 AuthMechanism::MongoDbOidc,为Kubernetes配置 OIDC。然后,通过在 mechanism_properties字段中将 ENVIRONMENT属性设置为 k8s 来指定身份验证机制。

以下代码示例展示了如何在创建Client时设立这些选项:

let credential = Credential::builder()
.mechanism(AuthMechanism::MongoDbOidc)
.mechanism_properties(
doc! { "ENVIRONMENT": "k8s" }
)
.build();
client_options.credential = Some(credential);
let client = Client::with_options(client_options)?;
let res = client
.database("test")
.collection::<Document>("test")
.find_one(doc! {})
.await?;

Rust驱动程序不为所有平台提供内置支持,包括 AWS Elastic Kubernetes Service (EKS)。要使用 OIDC 对不受支持的平台进行身份验证,您必须定义自定义回调函数。

以下代码是针对 EKS集群的自定义回调的示例实施。 首先,将 Credential 结构的 oidc_callback字段设立为 oidc::Callback::machine。 然后,从 AWS_WEB_IDENTITY_TOKEN_FILE 环境变量中设立的路径读取访问权限令牌。 最后,设立IdpServerResponse 结构的 access_token字段的值。 (可选)设立expiresrefresh_token 字段的值。

let credential = Credential::builder()
.mechanism(AuthMechanism::MongoDbOidc)
.oidc_callback(oidc::Callback::machine(move |_| {
async move {
let token_file_path = std::env::var("AWS_WEB_IDENTITY_TOKEN_FILE").map_err(mongodb::error::Error::custom)?;
let access_token = tokio::fs::read_to_string(token_file_path).await?;
Ok(IdpServerResponse::builder().access_token(access_token).build())
}
.boxed()
}))
.build()
.into();
client_options.credential = Some(credential);
let client = Client::with_options(client_options)?;
let res = client
.database("test")
.collection::<Document>("test")
.find_one(doc! {})
.await?;

当员工身份身份验证进程涉及人机交互时,您必须通过将 Credential 结构的 oidc_callback字段设置为 oidc::Callback::human 而不是 oidc::Callback::machine 来配置客户端。Rust驱动程序在以下进程中使用回调:

  1. 驱动程序检索所提供的用户名的身份提供程序信息 (IDPInfo)。

  2. 该回调与 IDP 协商以获取 access_token 以及任何潜在的 refresh_token 和超时值(如果已配置)。 回调会返回一个 Result<IdpServerInfo>

以下示例定义了一个自定义回调来处理员工身份。要根据您的使用案例自定义此示例,请将 <human flow> 替换为您自己的自定义流程。有关详细信息,请参阅OIDC 授权代码流程

let callback = Callback::human(move |context| {
async move {
"<human flow>";
todo!("human flow")
}
.boxed()
});
let credential = Credential::builder()
.mechanism(AuthMechanism::MongoDbOidc)
.oidc_callback(callback)
.build();
client_options.credential = Some(credential);
let client = Client::with_options(client_options)?;
let res = client
.database("test")
.collection::<Document>("test")
.find_one(doc! {})
.await?;

要了解有关本指南中概念的更多信息,请参阅以下文档:

  • “指定连接选项”指南

  • 手册中的 连接字符串MongoDB Server

要进一步了解本指南所提及的方法和类型,请参阅以下 API 文档:

后退

AWS IAM

在此页面上