keystonemiddleware.auth_token 包

模块内容

基于令牌的身份验证中间件。

这个 WSGI 组件

  • 通过使用身份验证服务验证令牌来验证传入客户端请求是否具有有效的令牌。

  • 除非 auth_token 中间件处于 delay_auth_decision 模式,否则会拒绝未经身份验证的请求,这意味着最终决策委托给下游 WSGI 组件(通常是 OpenStack 服务)。

  • 收集并转发基于有效令牌的身份信息,例如用户名、域、项目等。

参考:https://docs.openstack.org/keystonemiddleware/2025.2/middlewarearchitecture.html

头部

auth_token 中间件使用客户端在请求中发送的头部,并为下游 WSGI 组件设置头部和环境变量。

从客户端或客户机的初始调用传入

HTTP_X_AUTH_TOKEN

客户端传递的令牌。

HTTP_X_SERVICE_TOKEN

传递的服务令牌。

用于组件之间的通信

WWW-Authenticate

HTTP 头部,返回给用户,指示用于检索新令牌的端点。

auth_token 添加到请求中的内容,供 OpenStack 服务使用

当使用组合身份验证(存在用户和令牌)时,将添加与服务用户相关的其他服务头部。它们采用与标准头部相同的形式,但添加 _SERVICE_。如果不存在服务令牌,这些头部将不会存在于环境中。

HTTP_X_IDENTITY_STATUS, HTTP_X_SERVICE_IDENTITY_STATUS

将被设置为 ConfirmedInvalid

如果中间件配置为以 delay_auth_decision 模式运行,则底层服务只会看到“Invalid”值。与所有此类头部一样,HTTP_X_SERVICE_IDENTITY_STATUS 仅在呈现服务令牌时才存在于环境中。这与 HTTP_X_IDENTITY_STATUS 不同,即使未呈现用户令牌,它始终设置。这允许底层服务确定拒绝是否应使用 401 Unauthenticated403 Forbidden

HTTP_OPENSTACK_SYSTEM_SCOPE

一个字符串,传递有关令牌范围的系统信息。如果令牌是系统范围的,则仅存在此属性。字符串 all 表示令牌的范围是整个部署系统。

HTTP_X_DOMAIN_ID, HTTP_X_SERVICE_DOMAIN_ID

身份服务管理的唯一标识符,字符串。仅当这是一个域范围的令牌时才存在。

HTTP_X_DOMAIN_NAME, HTTP_X_SERVICE_DOMAIN_NAME

唯一的域名,字符串。仅当这是一个域范围的令牌时才存在。

HTTP_X_PROJECT_ID, HTTP_X_SERVICE_PROJECT_ID

身份服务管理的唯一标识符,字符串。仅当这是一个项目范围的令牌时才存在。

HTTP_X_PROJECT_NAME, HTTP_X_SERVICE_PROJECT_NAME

项目名称,在其拥有域内唯一,字符串。仅当这是一个项目范围的令牌时才存在。

HTTP_X_PROJECT_DOMAIN_ID, HTTP_X_SERVICE_PROJECT_DOMAIN_ID

项目拥有域的身份服务管理的唯一标识符,字符串。仅当这是一个 v3 项目范围的令牌时才存在。如果设置了此变量,则表示 PROJECT_NAME 只能被假定为在该域内唯一。

HTTP_X_PROJECT_DOMAIN_NAME, HTTP_X_SERVICE_PROJECT_DOMAIN_NAME

项目拥有域的名称,字符串。仅当这是一个 v3 项目范围的令牌时才存在。如果设置了此变量,则表示 PROJECT_NAME 只能被假定为在该域内唯一。

HTTP_X_USER_ID, HTTP_X_SERVICE_USER_ID

身份服务管理的唯一标识符,字符串。

HTTP_X_USER_NAME, HTTP_X_SERVICE_USER_NAME

用户标识符,在其拥有域内唯一,字符串。

HTTP_X_USER_DOMAIN_ID, HTTP_X_SERVICE_USER_DOMAIN_ID

用户拥有域的身份服务管理的唯一标识符,字符串。如果设置了此变量,则表示 USER_NAME 只能被假定为在该域内唯一。

HTTP_X_USER_DOMAIN_NAME, HTTP_X_SERVICE_USER_DOMAIN_NAME

用户拥有域的名称,字符串。如果设置了此变量,则表示 USER_NAME 只能被假定为在该域内唯一。

HTTP_X_ROLES, HTTP_X_SERVICE_ROLES

逗号分隔的区分大小写的角色名称列表。

HTTP_X_IS_ADMIN_PROJECT

字符串值“True”或“False”,表示用户的令牌是否限定为管理项目。由于历史上没有管理项目,因此对于没有此信息的令牌,默认值为 True,以便与现有的策略文件向后兼容。

HTTP_X_SERVICE_CATALOG

服务目录(可选,JSON 字符串)。

出于兼容性原因,即使它是 v3 令牌,此目录始终采用 V2 目录格式。

注意

这是一个例外,因为它包含“SERVICE”,但与用户令牌相关,而不是服务令牌。现有用户的目录可能非常大;决定不呈现与服务令牌相关的目录,以避免使用更多的 HTTP 头部空间。

HTTP_X_TENANT_ID

已弃用,支持 HTTP_X_PROJECT_ID。

身份服务管理的唯一标识符,字符串。对于 v3 令牌,此值将设置为与 HTTP_X_PROJECT_ID 相同的值。

HTTP_X_TENANT_NAME

已弃用,支持 HTTP_X_PROJECT_NAME。

项目标识符,在其拥有域内唯一,字符串。对于 v3 令牌,此值将设置为与 HTTP_X_PROJECT_NAME 相同的值。

HTTP_X_TENANT

已弃用,支持 HTTP_X_TENANT_ID 和 HTTP_X_TENANT_NAME。

身份服务器分配的唯一标识符,字符串。对于 v3 令牌,此值将设置为与 HTTP_X_PROJECT_ID 相同的值。

HTTP_X_USER

已弃用,支持 HTTP_X_USER_ID 和 HTTP_X_USER_NAME。

用户名,在其拥有域内唯一,字符串。

HTTP_X_ROLE

已弃用,支持 HTTP_X_ROLES。

将包含与 HTTP_X_ROLES 相同的值。

环境变量

这些变量设置在请求环境中,供下游 WSGI 组件使用。

keystone.token_info

有关在验证过程中发现的令牌的信息。这可能包括由令牌验证调用返回的扩展信息,以及有关项目和用户的基本信息。

keystone.token_auth

一个 keystoneauth1 身份验证插件,可与 keystoneauth1.session.Session 一起使用。此插件将加载提供给 auth_token 中间件的身份验证数据。

配置

auth_token 中间件配置可以在主应用程序的配置文件中,例如在 nova.conf

[keystone_authtoken]
auth_plugin = password
auth_url = http://keystone:5000/
username = nova
user_domain_id = default
password = whyarewestillusingpasswords
project_name = service
project_domain_id = default

配置也可以在 api-paste.ini 文件中,使用相同的选项,但不建议这样做。

Swift

当使用 Swift 部署 auth_token 中间件时,用户可以选择使用 Swift memcache 代替本地 auth_token memcache。Swift memcache 从请求环境中传入,其标识符为 swift.cache 键。但是,根据部署,它可能不同。要使用 Swift memcache,必须将 cache 选项设置为存储 Swift 缓存对象的环境键。

class keystonemiddleware.auth_token.AuthProtocol(app, conf)

基类:BaseAuthProtocol

处理客户端调用身份验证的中间件。

fetch_token(token, allow_expired=False)

从 PKI 捆绑包或身份服务器检索令牌。

参数:

token (str) – 令牌 ID

引发:

exc.InvalidToken – 如果令牌被拒绝

process_request(request)

处理请求。

评估请求中的头部并尝试对请求进行身份验证。如果已通过身份验证,则会将额外的头部添加到请求中,供应用程序使用。如果未通过身份验证,则请求将被拒绝或标记为未通过身份验证,具体取决于配置。

process_response(response)

处理响应。

WWW-Authenticate 头部添加到以 401 Unauthenticated 失败的请求中,以便用户知道在哪里为将来的请求进行身份验证。

class keystonemiddleware.auth_token.BaseAuthProtocol(app, log=<KeywordArgumentAdapter keystonemiddleware.auth_token (WARNING)>, enforce_token_bind='permissive', service_token_roles=None, service_token_roles_required=False, service_type=None)

基类: object

AuthProtocol 令牌检查实现的基类。

参数:
  • app (Callable) – 调用中间件后的下一个应用程序。

  • log (logging.Logger) – 用于输出的日志对象。默认情况下,它将使用 keystonemiddleware.auth_token 命名空间中的记录器。

  • enforce_token_bind (str) – 要执行的令牌绑定强制样式。

fetch_token(token, **kwargs)

根据头部中的值获取令牌数据。

检索存在于头部中的令牌值的相关数据。这可以是来自 PKI、联系身份服务器或任何所需的内容。

参数:
  • token (str) – 请求头部中的令牌。

  • kwargs (dict) – 可能会通过此处传递其他关键字参数以支持新功能。如果实现不知道如何使用这些参数,则应忽略它们。

引发:

exc.InvalidToken – 如果令牌无效。

返回值:

令牌数据

返回类型:

dict

process_request(request)

处理请求。

如果此方法返回一个值,则该值将用作响应。堆栈中的下一个应用程序将不会被执行,并且不会调用 process_response。

否则,堆栈中的下一个应用程序将被执行,并且会使用生成的响应调用 process_response。

默认情况下,此方法不返回值。

参数:

request (_request.AuthTokenRequest) – 入站请求

process_response(response)

对响应做任何您想做的事情。

默认情况下,响应将返回未修改的状态。

参数:

response (._request._AuthTokenResponse) – 响应对象

validate_allowed_request(request, token)
keystonemiddleware.auth_token.app_factory(global_conf, **local_conf)
keystonemiddleware.auth_token.filter_factory(global_conf, **local_conf)

返回用于 paste.deploy 的 WSGI 过滤器应用。

keystonemiddleware.auth_token.list_opts()

返回 auth_token 中间件中可用的 oslo_config 选项列表。

返回的列表包含项目在运行时可能注册的所有 oslo_config 选项。

列表中的每个元素都是一个元组。第一个元素是将在其中注册第二个元素中列表的组的名称。组名称为 None 对应于配置文件中的 [DEFAULT] 组。

注意:此函数不再用于 oslo_config 示例生成。某些服务依赖此函数来列出所有(包括已弃用)选项并将它们注册到自己的配置对象中,而我们不希望在示例配置文件中使用。

请参阅:keystonemiddleware.auth_token._opts.list_opts() 以获取示例配置文件。

返回值:

一个 (group_name, opts) 元组列表