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 函数