身份验证示例#
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 kerberos 或 pykerberos 使用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 credentials 从 AWS 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_ID
, AWS_SECRET_ACCESS_KEY
和 AWS_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_FILE
, AWS_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实例端点以获取这些凭证。