Overview
重要
MONGODB-OIDC 身份验证机制要求在 Linux 平台上运行 MongoDB Server v 7.0或更高版本。
Go驾驶员支持对工作负载身份进行 OpenID Connect ( OIDC )身份验证。 工作负载身份是分配给软件工作负载(例如应用程序、服务、脚本或容器)的身份,用于验证和访问权限其他服务和资源。
以下部分介绍如何使用 MONGODB-OIDC 身份验证机制对各种平台进行身份验证。
要学习;了解有关 MONGODB-OIDC身份验证机制的更多信息,请参阅MongoDB Server手册中的 OpenID Connect 身份验证 和 MongoDB Server参数。
Azure IMDS
如果应用程序在 Azure VM 上运行,或以其他方式使用 Azure 实例元数据服务 (IMDS),则可以使用 Go 驱动程序的内置 Azure 支持对 MongoDB 进行身份验证。
您可以通过以下方式为Azure IMDS 配置 OIDC:
创建一个
Credential结构,并在创建客户端时将其传递给SetAuth()方法在连接字符串中设置参数
注意
如果AuthMechanismProperties结构体字段值包含逗号,则必须创建Credential实例来设立身份验证选项。
首先,创建一个映射来存储身份验证机制属性,如以下示例所示。 将<audience>占位符替换为MongoDB 部署上配置的audience参数的值。
props := map[string]string{ "ENVIRONMENT": "azure", "TOKEN_RESOURCE": "<audience>", }
然后,设立以下Credential结构字段:
Username:如果使用的是Azure托管标识,设立为托管标识的客户端ID 。AuthMechanism:设置为"MONGODB-OIDC"。AuthMechanismProperties:设置为之前创建的props地图。
以下代码示例展示了如何在创建Client时设立这些选项:
uri := "mongodb://<hostname>:<port>" props := map[string]string{ "ENVIRONMENT": "azure", "TOKEN_RESOURCE": "<audience>", } opts := options.Client().ApplyURI(uri) opts.SetAuth( options.Credential{ Username: "<Azure client ID or application ID>", AuthMechanism: "MONGODB-OIDC", AuthMechanismProperties: props, }, ) client, err := mongo.Connect(opts) if err != nil { panic(err) }
在连接string中包含以下连接选项:
username:如果使用的是Azure托管标识,设立为托管标识的客户端ID 。authMechanism:设置为MONGODB-OIDC。authMechanismProperties:设置为ENVIRONMENT:azure,TOKEN_RESOURCE:<audience>。 将<audience>占位符替换为MongoDB 部署上配置的audience参数的值。
以下代码示例展示了如何在连接string中设立这些选项:
uri := "mongodb://<hostname>:<port>/?" + "username=<Azure client ID or application ID>" + "&authMechanism=MONGODB-OIDC" + "&authMechanismProperties=ENVIRONMENT:azure,TOKEN_RESOURCE:<percent-encoded audience>" client, err := mongo.Connect(options.Client().ApplyURI(uri)) if err != nil { panic(err) }
提示
如果应用程序在 Azure VM 上运行,并且只有一个托管标识与该 VM 关联,则可以省略username连接选项。
GCP IMDS
如果您的应用程序在 Google Compute Engine 虚拟机上运行,或以其他方式使用GCP实例元数据服务,则可以使用Go驱动程序的内置GCP支持向MongoDB进行身份验证。
您可以通过以下方式为GCP IMDS 配置 OIDC:
创建一个
Credential结构体,并在创建客户端时将其传递给SetAuth()方法在连接字符串中设置参数
注意
如果AuthMechanismProperties结构体字段值包含逗号,则必须创建Credential实例来设立身份验证选项。
首先,创建一个映射来存储身份验证机制属性,如以下示例所示。 将<audience>占位符替换为MongoDB 部署上配置的audience参数的值。
props := map[string]string{ "ENVIRONMENT": "gcp", "TOKEN_RESOURCE": "<audience>", }
然后,设立以下Credential结构字段:
AuthMechanism:设置为"MONGODB-OIDC"。AuthMechanismProperties:设置为之前创建的props地图。
以下代码示例展示了如何在创建Client时设立这些选项:
uri := "mongodb://<hostname>:<port>" props := map[string]string{ "ENVIRONMENT": "gcp", "TOKEN_RESOURCE": "<audience>", } opts := options.Client().ApplyURI(uri) opts.SetAuth( options.Credential{ AuthMechanism: "MONGODB-OIDC", AuthMechanismProperties: props, }, ) client, err := mongo.Connect(opts) if err != nil { panic(err) }
在连接string中包含以下连接选项:
authMechanism:设置为MONGODB-OIDC。authMechanismProperties:设置为ENVIRONMENT:gcp,TOKEN_RESOURCE:<audience>。 将<audience>占位符替换为MongoDB 部署上配置的audience参数的值。
以下代码示例展示了如何在连接string中设立这些选项:
uri := "mongodb://<hostname>:<port>/?" + "&authMechanism=MONGODB-OIDC" + "&authMechanismProperties=ENVIRONMENT:gcp,TOKEN_RESOURCE:<percent-encoded audience>" client, err := mongo.Connect(options.Client().ApplyURI(uri)) if err != nil { panic(err) }
自定义回调
Go驾驶员并不为所有平台提供内置支持,包括Amazon Web Services Elastic Kubernetes Service (EKS)。 要对不受支持的平台进行身份验证,您必须定义自定义回调函数以使用 OIDC 进行身份验证。 在驾驶员中,您可以定义一个options.OIDCCallback函数,并将其设立为Credential结构中OIDCMachineCallback结构字段的值。
以下示例为具有已配置 IAM OIDC提供商的 EKS集群定义了自定义回调。 访问权限令牌是从AWS_WEB_IDENTITY_TOKEN_FILE环境变量中设立的路径读取的:
eksCallback := func(_ context.Context, _ *options.OIDCArgs) (*options.OIDCCredential, error) { accessToken, err := os.ReadFile( os.Getenv("AWS_WEB_IDENTITY_TOKEN_FILE")) if err != nil { return nil, err } return &options.OIDCCredential{ AccessToken: string(accessToken), }, nil }
然后,您可以创建一个Credential结构体来使用您定义的 EKS回调函数:
uri := "mongodb://<hostname>:<port>" opts := options.Client().ApplyURI(uri) opts.SetAuth( options.Credential{ AuthMechanism: "MONGODB-OIDC", OIDCMachineCallback: eksCallback, }, ) client, err := mongo.Connect(opts) if err != nil { panic(err) }
其他 Azure 环境
如果应用程序在Azure Functions、App Service 环境 (ASE) 或Azure Kubernetes服务 (AKS) 上运行,则可以使用 azidentity 模块获取身份验证凭证。
首先,通过运行以下命令来安装azidentity模块:
go get -u github.com/Azure/azure-sdk-for-go/sdk/azidentity
您的OIDCCallback 函数必须返回一个OIDCCredential AccessToken实例,该实例使用从azidentity 包生成的 。有关实现自定义回调以检索访问权限令牌,然后创建Credential的示例,请参阅前面的“自定义回调”部分。
GCP GKE
如果您的应用程序在配置了服务帐户的GCP Google Kubernetes Engine (GKE)集群上运行,则可以从标准服务帐户令牌文件位置读取 OIDC 令牌。
首先,定义OIDCCallback函数。 此函数读取 OIDC 令牌并返回OIDCCredential实例。
以下示例定义了一个名为gkeCallback的回调函数。 该函数从标准 服务帐户令牌文件位置中的文件中检索 OIDC 令牌:
gkeCallback := func(_ context.Context, _ *options.OIDCArgs) (*options.OIDCCredential, error) { accessToken, err := os.ReadFile( "/var/run/secrets/kubernetes.io/serviceaccount/token") if err != nil { return nil, err } return &options.OIDCCredential{ AccessToken: string(accessToken), }, nil }
然后,您可以创建一个Credential结构体,使用您定义的 GKE回调函数:
uri := "mongodb://<hostname>:<port>" opts := options.Client().ApplyURI(uri) opts.SetAuth( options.Credential{ AuthMechanism: "MONGODB-OIDC", OIDCMachineCallback: gkeCallback, }, ) client, err := mongo.Connect(opts) if err != nil { panic(err) }
Kubernetes
如果您的应用程序在具有已配置服务帐户的Kubernetes集群上运行,则可以使用Go驱动程序的内置Kubernetes支持对MongoDB进行身份验证。要学习;了解有关如何配置服务帐户的更多信息,请参阅Kubernetes文档中的管理服务帐户指南。
您可以通过以下方式为Kubernetes配置 OIDC:
创建一个
Credential结构体,并在创建客户端时将其传递给SetAuth()方法在连接字符串中设置参数
注意
如果AuthMechanismProperties结构体字段值包含逗号,则必须创建Credential实例来设立身份验证选项。
首先,创建一个映射来存储身份身份验证机制属性,如以下示例所示:
props := map[string]string{ "ENVIRONMENT": "k8s", }
然后,设立以下Credential结构字段:
AuthMechanism:设置为"MONGODB-OIDC"。AuthMechanismProperties:设置为之前创建的props地图。
以下代码示例展示了如何在创建Client时设立这些选项:
uri := "mongodb://<hostname>:<port>" props := map[string]string{ "ENVIRONMENT": "k8s", } opts := options.Client().ApplyURI(uri) opts.SetAuth( options.Credential{ AuthMechanism: "MONGODB-OIDC", AuthMechanismProperties: props, }, ) client, err := mongo.Connect(opts) if err != nil { panic(err) }
在连接string中包含以下连接选项:
authMechanism:设置为MONGODB-OIDC。authMechanismProperties:设置为ENVIRONMENT:k8s。
以下代码示例展示了如何在连接string中设立这些选项:
uri := "mongodb://<hostname>:<port>/?" + "&authMechanism=MONGODB-OIDC" + "&authMechanismProperties=ENVIRONMENT:k8s" client, err := mongo.Connect(options.Client().ApplyURI(uri)) if err != nil { panic(err) }
更多信息
要了解有关本指南中概念的更多信息,请参阅以下文档:
API 文档
凭证类型
SetAuth() 方法
OIDCCallback 函数