身份验证示例#

MongoDB支持几种不同的身份验证机制。这些示例涵盖了PyMongo当前支持的所有身份验证方法,记录了Python模块和MongoDB版本依赖关系。

转义用户名和密码百分比#

用户名和密码必须使用百分号转义 urllib.parse.quote_plus() ,将在MongoDB URI中使用。例如::

>>> from pymongo import MongoClient
>>> import urllib.parse
>>> username = urllib.parse.quote_plus('user')
>>> username
'user'
>>> password = urllib.parse.quote_plus('pass/word')
>>> password
'pass%2Fword'
>>> MongoClient('mongodb://%s:%s@127.0.0.1' % (username, password))
...

紧急停堆-SHA-256(RFC 7677)#

在 3.7 版本加入.

SCRAM-SHA-256是配置为使用MongoDB 4.0或更高版本进行身份验证的群集支持的默认身份验证机制。身份验证需要用户名、密码和数据库名称。默认的数据库名称是“admin”,可以用 authSource 选项。凭据可以指定为的参数 MongoClient ::

>>> from pymongo import MongoClient
>>> client = MongoClient('example.com',
...                      username='user',
...                      password='password',
...                      authSource='the_database',
...                      authMechanism='SCRAM-SHA-256')

或者通过MongoDB URI::

>>> uri = "mongodb://user:password@example.com/?authSource=the_database&authMechanism=SCRAM-SHA-256"
>>> client = MongoClient(uri)

紧急停堆-SHA-1(RFC 5802)#

在 2.8 版本加入.

SCRAM-SHA-1是配置为使用MongoDB 3.0或更高版本进行身份验证的群集支持的默认身份验证机制。身份验证需要用户名、密码和数据库名称。默认的数据库名称是“admin”,可以用 authSource 选项。凭据可以指定为的参数 MongoClient ::

>>> from pymongo import MongoClient
>>> client = MongoClient('example.com',
...                      username='user',
...                      password='password',
...                      authSource='the_database',
...                      authMechanism='SCRAM-SHA-1')

或者通过MongoDB URI::

>>> uri = "mongodb://user:password@example.com/?authSource=the_database&authMechanism=SCRAM-SHA-1"
>>> client = MongoClient(uri)

为了在2.7.8之前的Python版本上获得最佳性能,请安装 backports.pbkdf2 .

MONGODB-CR#

警告

MONGODB-CR在MONGODB 3.6版本中已被弃用,MONGODB 4.0不再支持它。

在MongoDB 3.0之前,默认的身份验证机制是MongoDB-CR,“MongoDB质询-响应”协议:

>>> from pymongo import MongoClient
>>> client = MongoClient('example.com',
...                      username='user',
...                      password='password',
...                      authMechanism='MONGODB-CR')
>>>
>>> uri = "mongodb://user:password@example.com/?authSource=the_database&authMechanism=MONGODB-CR"
>>> client = MongoClient(uri)

默认身份验证机制#

如果未指定任何机制,则在连接到MongoDB 3.6时,PyMongo会自动使用SCRAM-SHA-1,并在连接到MongoDB 4.0+时协商要使用的机制(SCRAM-SHA-1或SCRAM-SHA-256)。

默认数据库和“authSource”#

可以在URI中指定默认数据库和身份验证数据库:

>>> uri = "mongodb://user:password@example.com/default_db?authSource=admin"
>>> client = MongoClient(uri)

PyMongo将在“admin”数据库上进行身份验证,但默认数据库将是“default_db”::

>>> # get_database with no "name" argument chooses the DB from the URI
>>> db = MongoClient(uri).get_database()
>>> print(db.name)
'default_db'

MONGODB-X509#

在 2.6 版本加入.

MongoDB-X509机制通过驱动程序在TLS/SSL协商期间提供的X.509证书进行身份验证。此身份验证方法需要使用具有证书验证的TLS/SSL连接:

>>> from pymongo import MongoClient
>>> client = MongoClient('example.com',
...                      authMechanism="MONGODB-X509",
...                      tls=True,
...                      tlsCertificateKeyFile='/path/to/client.pem',
...                      tlsCAFile='/path/to/ca.pem')

MONGODB-X509根据$external虚拟数据库进行身份验证,因此不必在URI中指定数据库:

>>> uri = "mongodb://example.com/?authMechanism=MONGODB-X509"
>>> client = MongoClient(uri,
...                      tls=True,
...                      tlsCertificateKeyFile='/path/to/client.pem',
...                      tlsCAFile='/path/to/ca.pem')
>>>

GSSAPI(Kerberos)#

在 2.5 版本加入.

GSSAPI(Kerberos)身份验证在MongoDB的企业版中可用。

UNIX#

要使用GSSAPI进行身份验证,必须首先安装python kerberospykerberos 使用easy_install或pip的模块。请确保在使用以下身份验证方法之前运行kinit::

$ kinit mongodbuser@EXAMPLE.COM
mongodbuser@EXAMPLE.COM's Password:
$ klist
Credentials cache: FILE:/tmp/krb5cc_1000
        Principal: mongodbuser@EXAMPLE.COM

  Issued                Expires               Principal
Feb  9 13:48:51 2013  Feb  9 23:48:51 2013  krbtgt/EXAMPLE.COM@EXAMPLE.COM

现在使用MongoDB进行身份验证。GSSAPI根据$external虚拟数据库进行身份验证,因此您不必在URI中指定数据库:

>>> # Note: the kerberos principal must be url encoded.
>>> from pymongo import MongoClient
>>> uri = "mongodb://mongodbuser%40EXAMPLE.COM@mongo-server.example.com/?authMechanism=GSSAPI"
>>> client = MongoClient(uri)
>>>

MongoDB和PyMongo使用的默认服务名称是 mongodb . 您可以使用 authMechanismProperties 选项:

>>> from pymongo import MongoClient
>>> uri = "mongodb://mongodbuser%40EXAMPLE.COM@mongo-server.example.com/?authMechanism=GSSAPI&authMechanismProperties=SERVICE_NAME:myservicename"
>>> client = MongoClient(uri)

Windows(SSPI)#

在 3.3 版本加入.

首先安装 winkerberos 模块。与Unix上的身份验证不同,kinit不使用。如果要验证的用户与拥有应用程序进程的用户不同,请提供用于验证的密码:

>>> uri = "mongodb://mongodbuser%40EXAMPLE.COM:mongodbuserpassword@example.com/?authMechanism=GSSAPI"

两个额外的 authMechanismProperties Windows平台支持:

  • CANONICALIZE_HOST_NAME-将MongoDB主机的完全限定域名(FQDN)用于服务器主体(Unix上的GSSAPI库默认情况下执行此操作)::

    >>> uri = "mongodb://mongodbuser%40EXAMPLE.COM@example.com/?authMechanism=GSSAPI&authMechanismProperties=CANONICALIZE_HOST_NAME:true"
    
  • 服务领域-当用户的领域与服务的领域不同时使用:

    >>> uri = "mongodb://mongodbuser%40EXAMPLE.COM@example.com/?authMechanism=GSSAPI&authMechanismProperties=SERVICE_REALM:otherrealm"
    

SASL平原(RFC 4616)#

在 2.6 版本加入.

MongoDB enterpriseedition2.6及更高版本支持SASL纯身份验证机制,最初用于将身份验证委托给LDAP服务器。使用纯机制与MONGODB-CR非常相似。这些示例使用$external virtual database来支持LDAP::

>>> from pymongo import MongoClient
>>> uri = "mongodb://user:password@example.com/?authMechanism=PLAIN"
>>> client = MongoClient(uri)
>>>

SASL纯文本是一种明文身份验证机制。我们 strongly 建议您在使用SASL普通机制时使用带证书验证的TLS/SSL连接到MongoDB::

>>> from pymongo import MongoClient
>>> uri = "mongodb://user:password@example.com/?authMechanism=PLAIN"
>>> client = MongoClient(uri,
...                      tls=True,
...                      tlsCertificateKeyFile='/path/to/client.pem',
...                      tlsCAFile='/path/to/ca.pem')
>>>

MONGODB-AWS系统#

在 3.11 版本加入.

MONGODB-AWS身份验证机制在mongodb4.4+中可用,并且需要额外的pymongo依赖关系。要使用它,请使用 aws 额外::

$ python -m pip install 'pymongo[aws]'

MONGODB-AWS机制使用AWS IAM凭据(访问密钥ID和密钥访问密钥)进行身份验证, temporary AWS IAM credentialsAWS Security Token Service (STS) Assume Role 请求,AWS Lambda environment variables ,或分配给 EC2 instance 或者ECS任务。除了访问密钥ID和秘密访问密钥外,使用临时凭据还需要安全(或会话)令牌。

凭据可以通过MongoDB URI、环境变量或本地EC2或ECS端点进行配置。客户端搜索的顺序 credentials 与AWS使用的相同 boto3 库在使用时 pymongo_auth_aws>=1.1.0

因为我们现在使用的是 boto3 为了处理凭据,凭据的顺序和位置与以前略有不同。特别是,如果您拥有共享的AWS凭据或配置文件,则在未设置AWS AUTH环境变量的情况下,将默认使用这些凭据。若要覆盖此行为,请设置 AWS_SHARED_CREDENTIALS_FILE="" 在您的Shell中或添加 os.environ["AWS_SHARED_CREDENTIALS_FILE"] = "" 添加到您的脚本或应用程序。或者,您也可以专门为您的MongoDB凭据创建一个AWS配置文件并设置 AWS_PROFILE 添加到该配置文件名称。

MONGODB-AWS根据“$external”虚拟数据库进行身份验证,因此本节中的uri都不需要包含 authSource URI选项。

AWS IAM认证#

应用程序可以使用AWS IAM凭据进行身份验证,方法是在MongoDB URI中分别提供有效的访问密钥id和秘密访问密钥对作为用户名和密码。一个示例URI将是:

>>> from pymongo import MongoClient
>>> uri = "mongodb+srv://<access_key_id>:<secret_access_key>@example.mongodb.net/?authMechanism=MONGODB-AWS"
>>> client = MongoClient(uri)

备注

传递到URI的access_key_id和secret_access_key必须是 percent escaped .

AssumeRole#

应用程序可以使用从假定角色请求返回的临时凭据进行身份验证。这些临时凭据由一个访问密钥ID、一个秘密访问密钥和一个传入URI的安全令牌组成。一个示例URI将是:

>>> from pymongo import MongoClient
>>> uri = "mongodb+srv://<access_key_id>:<secret_access_key>@example.mongodb.net/?authMechanism=MONGODB-AWS&authMechanismProperties=AWS_SESSION_TOKEN:<session_token>"
>>> client = MongoClient(uri)

备注

传递到URI的access_key_id、secret_access_key和session_令牌必须是 percent escaped .

AWS Lambda(环境变量)#

当没有提供用户名和密码并且设置了MONGODB-AWS机制时,客户端将回退到使用 environment variables AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEYAWS_SESSION_TOKEN 对于访问密钥ID、密钥访问密钥和会话令牌,分别为:

$ export AWS_ACCESS_KEY_ID=<access_key_id>
$ export AWS_SECRET_ACCESS_KEY=<secret_access_key>
$ export AWS_SESSION_TOKEN=<session_token>
$ python
>>> from pymongo import MongoClient
>>> uri = "mongodb+srv://example.mongodb.net/?authMechanism=MONGODB-AWS"
>>> client = MongoClient(uri)

备注

不会将用户名、密码或会话令牌传递到URI中。PyMongo将使用通过环境变量设置的凭据。这些环境变量不能 percent escaped .

EKS星团#

使用 Authenticating users for your cluster from an OpenID Connect identity provider EKS上的功能现在可以使用提供的凭据,方法是将关联的IAM用户 sts:AssumeRoleWithWebIdentity 许可。

当没有提供用户名和密码时,设置MongoDB-AWS机制,并且 AWS_WEB_IDENTITY_TOKEN_FILEAWS_ROLE_ARN 和可选 AWS_ROLE_SESSION_NAME 可用,则驱动程序将使用 AssumeRoleWithWebIdentity 调用以检索临时凭据。应用程序必须使用 pymongo_auth_aws >=1.1.0表示支持EKS。

ECS容器#

应用程序可以通过分配给计算机的临时凭据从ECS容器进行身份验证。ECS容器上的一个示例URI是:

>>> from pymongo import MongoClient
>>> uri = "mongodb+srv://example.mongodb.com/?authMechanism=MONGODB-AWS"
>>> client = MongoClient(uri)

备注

不会将用户名、密码或会话令牌传递到URI中。PyMongo将查询ECS容器端点以获取这些凭证。

EC2实例#

应用程序可以通过分配给计算机的临时凭证从EC2实例进行身份验证。EC2机器上的一个示例URI是:

>>> from pymongo import MongoClient
>>> uri = "mongodb+srv://example.mongodb.com/?authMechanism=MONGODB-AWS"
>>> client = MongoClient(uri)

备注

不会将用户名、密码或会话令牌传递到URI中。PyMongo将查询EC2实例端点以获取这些凭证。