使用会话¶
介绍¶
keystoneauth1.session.Session 类被引入 keystoneclient,旨在为各种 OpenStack 客户端提供一个统一的接口,这些客户端在各种服务之间共享通用的身份验证和请求参数。
使用会话和身份验证插件的模式以及使用的通用术语都深受 requests 库的启发。但是,会话类和任何身份验证插件都不直接依赖于 requests 库中的这些概念,因此您不应期望直接翻译。
特性¶
常见的客户端身份验证
身份验证由多种身份验证插件之一处理,然后此身份验证信息在所有使用相同会话对象的服务之间共享。
安全维护
安全代码在一个地方维护并在所有客户端之间重用,这样在出现问题时,可以在一个位置修复它。
标准发现机制
客户端不需要了解身份令牌或任何其他形式的身份凭据。会话和插件处理服务和端点发现。
用户会话¶
会话对象是与您的 OpenStack 云服务的联系点。它存储与 OpenStack 通信所需的身份验证凭据和连接信息,以便可以重用它与许多服务通信。在创建服务时,会话对象会传递给客户端,以便客户端可以使用此信息。
会话将按需进行身份验证。当需要身份验证的请求通过会话时,身份验证插件将被要求提供有效的令牌。如果可用有效的令牌,将使用它,否则身份验证插件可能会尝试联系身份验证服务并获取新的令牌。
来自 keystoneclient 的示例
>>> from keystoneauth1.identity import v3
>>> from keystoneauth1 import session
>>> from keystoneclient.v3 import client
>>> auth = v3.Password(auth_url='https://my.keystone.com:5000/v3',
... username='myuser',
... password='mypassword',
... project_id='proj',
... user_domain_id='domain')
>>> sess = session.Session(auth=auth,
... verify='/path/to/ca.cert')
>>> ks = client.Client(session=sess)
>>> users = ks.users.list()
随着客户端采用这种操作方式,它们将以类似的方式创建,通过将会话对象传递给客户端的构造函数。
将 keystoneclient 迁移到使用会话¶
通过使用带有 keystoneclient 客户端的会话,我们假设您已选择加入会话定义的新的行为。例如,身份验证现在是按需进行的,而不是在创建时进行的。为了允许这种行为的改变,一些函数已经改变了行为或不再可用。
例如,keystoneclient.httpclient.HTTPClient.authenticate() 方法曾经能够始终重新验证当前客户端并获取新的令牌。由于现在由会话而不是客户端控制,因此它已经改变,但是该函数仍然存在以提供与旧客户端的兼容性。
同样,某些参数,例如 user_id 和 auth_token,这些参数曾经在身份验证后可在客户端对象上使用,将保持未初始化状态。
将应用程序转换为使用 keystoneclient 的会话对象时,您应该意识到身份验证和身份验证参数可能发生变化,并确保彻底测试您的代码。它不应影响客户端的典型 CRUD 交互。
客户端开发者会话¶
会话旨在消除处理身份验证数据和令牌格式的许多麻烦。客户端应该能够指定用于选择端点的筛选参数,并让目录的解析由会话管理。
身份验证¶
使用会话对象发出请求时,您可以简单地传递关键字参数 authenticated 来指示参数是否应包含令牌,默认情况下,如果可用身份验证插件,则包含令牌
>>> # In keystone this route is unprotected by default
>>> resp = sess.get('https://my.keystone.com:5000/v3',
authenticated=False)
服务发现¶
在 OpenStack 中,可用的服务的 URL 作为收到的令牌的一部分分发给用户,称为服务目录。客户端应该使用来自服务目录的 URL,而不是提供它们。
通常,客户端不需要知道他们正在与之通信的服务器的完整 URL,只需知道应该将请求发送到属于正确服务的路径即可。
这由请求的 endpoint_filter 参数控制,该参数包含身份验证插件确定要发送请求的正确 URL 所需的所有信息。使用这种模式时,只需要指定请求的路径
>>> resp = session.get('/v3/users',
endpoint_filter={'service_type': 'identity',
'interface': 'public',
'region_name': 'myregion'})
endpoint_filter 接受许多参数,可以使用这些参数来确定端点 URL
service_type:服务的类型。例如identity、compute、volume或许多其他预定义的标识符。interface:接口的网络暴露。这将是以下之一:public:可供更广泛的互联网或网络使用的端点。internal:仅可从专用网络访问的端点。admin:用于管理任务的端点。
region_name:端点所在的区域的名称。
端点过滤器是一个简单的键值过滤器,可以提供任何数量的参数。然后由身份验证插件正确使用它理解的参数。
会话对象确定与过滤器匹配的 URL,并将其附加到提供的路径,从而创建一个有效的请求。如果找到多个 URL 匹配项,则可以选择任何一个。
虽然身份验证插件将努力维护 endpoint_filter 的一致参数集,但身份验证插件的概念是故意通用的,并且特定的机制可能不知道如何解释某些参数并忽略它们。例如,keystoneauth1.identity.generic.token.Token 插件(当您想要始终使用特定的端点和令牌组合时使用)将始终返回相同的端点,无论 endpoint_filter 的参数如何,或者自定义 OpenStack 身份验证机制可能没有多个 interface 选项并选择忽略该参数。
用户有一些期望,即他们了解他们正在使用的身份验证系统的局限性。