身份验证¶
OpenStackClient 利用 python-keystoneclient 身份验证插件来支持多种不同的身份验证方法。
身份验证过程¶
用户提供一些身份验证凭据选项。如果未提供身份验证类型(--os-auth-type),则会检查身份验证选项,以确定是否可以使用默认类型之一。如果未找到匹配项,将报告错误并退出 OSC。
请注意,对身份服务进行的身份验证调用尚未发生。它被推迟到尽可能晚的时刻,以便减少对服务器的不必要的查询次数,例如在进一步处理检测到无效命令时。
身份验证插件¶
Keystone 客户端库实现了基本插件集。其他插件可能来自 Keystone 项目或其他来源。
至少有三种身份验证类型始终可用
密码:使用项目、用户名和密码来标识用户。还可以包含可选的域。这是最常见的类型,并且只要提供用户名,就是默认类型。还需要身份服务的身份验证 URL。[必需:
--os-auth-url、--os-project-name、--os-username;可选:--os-password]令牌:这与通常的令牌身份验证略有不同,因为提供了令牌和身份验证 URL,并且插件检索新的令牌。[必需:
--os-auth-url、--os-token]其他:其他身份验证插件,如 SAML、Kerberos 和 OAuth1.0 正在开发中,并得到支持。要使用它们,必须通过提供
--os-auth-type选项来选择它们。
详细过程¶
OpenStackClient 中的身份验证过程完全包含在 ClientManager 对象中并由其处理。
在导入
api.auth时从
keystoneclient.auth.plugin入口点获取已安装的 Keystone 身份验证插件列表。从插件构建身份验证选项列表。
处理命令行参数,如果提供了
--os-cloud,则从clouds.yaml加载配置。创建一个新的
ClientManager并提供来自命令行、环境和/或clouds.yaml的选项集- 如果提供了
--os-auth-type并且是有效的可用插件 则使用它。
- 如果提供了
如果未提供
--os-auth-type,则基于现有选项选择身份验证插件。这是一个短路评估,第一个匹配项获胜。如果提供了
--os-username,则选择password如果提供了
--os-token,则选择token如果此时未进行选择,则退出并显示错误
加载选定的插件类。
当尝试需要身份验证的操作时,
ClientManager会向身份服务发出实际的初始请求。如果对于 Token/Endpoint 以外的任何类型,未提供
--os-auth-url,则退出并显示错误。
使用 Identity Server API v3 进行身份验证¶
要对 Identity Server API v3 进行身份验证,必须将 OS_IDENTITY_API_VERSION 环境变量或 --os-identity-api-version 选项更改为 3,而不是默认的 2.0。 同样,OS_AUTH_URL 或 os-auth-url 也应更新。
$ export OS_IDENTITY_API_VERSION=3 (Defaults to 2.0)
$ export OS_AUTH_URL=https://:5000/v3
由于 Identity API v3 身份验证更加复杂,因此可能有其他选项可以设置为命令行选项或环境变量。最常见的情况是用户提供用户名和密码以及项目名称; 以前在 v2.0 中就足够了,但由于 Identity API v3 具有 Domain 组件,因此我们需要告诉客户端用户和项目存在于哪个域中。
如果使用用户名和密码进行身份验证,请指定其所属的域名或 ID。
--os-user-domain-name或OS_USER_DOMAIN_NAME--os-user-domain-id或OS_USER_DOMAIN_ID
如果将项目名称作为授权范围使用,请指定其所属的域名或 ID。
--os-project-domain-name或OS_PROJECT_DOMAIN_NAME--os-project-domain-id或OS_PROJECT_DOMAIN_ID
如果将域作为授权范围使用,请设置其名称或 ID。
--os-domain-name或OS_DOMAIN_NAME--os-domain-id或OS_DOMAIN_ID
请注意,如果用户和项目共享同一个域,则只需将 --os-default-domain 或 OS_DEFAULT_DOMAIN 设置为域 ID 即可。
因此,最少的一组环境变量将是
$ export OS_IDENTITY_API_VERSION=3
$ export OS_AUTH_URL=https://:5000/v3
$ export OS_DEFAULT_DOMAIN=default
$ export OS_USERNAME=admin
$ export OS_PASSWORD=secret
$ export OS_PROJECT_NAME=admin
联合用户支持¶
OpenStackClient 还允许使用联合用户登录。它使您可以利用身份提供商的凭据,例如 Google 或 Facebook,来登录 OpenStackClient,而不是使用 Keystone 凭据。
这在联合环境中很有用,在这种环境中,一个凭据可以访问联合支持的许多应用程序/服务。要检查如何配置 OpenStackClient 以允许联合用户登录,请查看 使用联合进行身份验证。
示例¶
v3password¶
使用 clouds.yaml
clouds:
demo:
auth:
auth_url: http://openstack.dev/identity
project_name: demo
project_domain_name: default
user_domain_name: default
username: demo
password: password
auth_type: v3password
或者,使用命令行选项
$ openstack \
--os-auth-url "http://openstack.dev/identity" \
--os-project-name demo \
--os-project-domain-name default \
--os-user-domain-name default \
--os-auth-type=v3password \
--os-username demo \
--os-password password \
server list
或者,使用环境变量
$ export OS_AUTH_URL="http://openstack.dev/identity"
$ export OS_PROJECT_NAME=demo
$ export OS_PROJECT_DOMAIN_NAME=default
$ export OS_AUTH_TYPE=v3password
$ export OS_USERNAME=demo
$ export OS_PASSWORD=password
$ openstack server list
注意
如果未提供密码,系统将提示您输入密码。
v3applicationcredential¶
使用 clouds.yaml
clouds:
demo:
auth:
auth_url: http://openstack.dev/identity
application_credential_id: ${APP_CRED_ID}
application_credential_secret: ${APP_CRED_SECRET}
auth_type: v3applicationcredential
或者,使用命令行选项
$ openstack \
--os-auth-url "http://openstack.dev/identity" \
--os-auth-type=v3applicationcredential \
--os-application-credential-id=${APP_CRED_ID} \
--os-application-credential-secret=${APP_CRED_SECRET}
server list
或者,使用环境变量
$ export OS_AUTH_URL="http://openstack.dev/identity"
$ export OS_AUTH_TYPE=v3applicationcredential
$ export OS_APPLICATION_CREDENTIAL_ID=${APP_CRED_ID}
$ export OS_APPLICATION_CREDENTIAL_SECRET=${APP_CRED_SECRET}
$ openstack server list
注意
您可以使用 openstack application credential create 命令生成应用程序凭据
$ readarray -t lines <<< $(openstack application credential create test -f value -c id -c secret)
$ APP_CRED_ID=${lines[0]}
$ APP_CRED_SECRET=${lines[1]}
v3token¶
使用 clouds.yaml
clouds:
demo:
auth:
auth_url: http://openstack.dev/identity
project_name: demo
project_domain_name: default
token: ${TOKEN}
auth_type: v3token
或者,使用命令行选项
$ openstack \
--os-auth-url "http://openstack.dev/identity" \
--os-project-name demo \
--os-project-domain-name default \
--os-auth-type=v3token \
--os-token ${TOKEN} \
server list
或者,使用环境变量
$ export OS_AUTH_URL="http://openstack.dev/identity"
$ export OS_PROJECT_NAME=demo
$ export OS_PROJECT_DOMAIN_NAME=default
$ export OS_AUTH_TYPE=v3token
$ export OS_TOKEN=${TOKEN}
$ openstack server list
注意
您可以使用 openstack token issue 命令生成令牌
$ TOKEN=$(openstack token issue -f value -c id)
注意
以上示例假定您需要项目范围的令牌。如果您的用户设置了默认项目 ID,您可以省略与项目相关的配置。相反,如果请求域范围或系统范围,则应相应地更新这些示例。如果用户未配置默认项目并且未提供任何范围信息,则生成的令牌将是未范围的。
v3totp¶
注意
TOTP 机制不太适合由命令行驱动的 API 交互。在为云配置 TOTP 机制时,预计它将用于初始身份验证并创建令牌或应用程序凭据,然后可以将其用于后续交互。
注意
TOTP 机制通常与其他机制结合使用,以启用多因素身份验证或 MFA。在这种情况下,使用身份验证类型 v3multifactor,而 v3totp 身份验证类型与 auth_methods 中的其他机制一起指定。
使用 clouds.yaml
clouds:
demo:
auth:
auth_url: http://openstack.dev/identity
project_name: demo
project_domain_name: default
user_domain_name: default
username: demo
passcode: ${PASSCODE}
auth_type: v3totp
或者,使用命令行选项
$ openstack \
--os-auth-url "http://openstack.dev/identity" \
--os-project-name demo \
--os-project-domain-name default \
--os-user-domain-name default \
--os-auth-type=v3totp \
--os-username demo \
--os-passcode ${PASSCODE} \
server list
或者,使用环境变量
$ export OS_AUTH_URL="http://openstack.dev/identity"
$ export OS_PROJECT_NAME=demo
$ export OS_PROJECT_DOMAIN_NAME=default
$ export OS_AUTH_TYPE=v3totp
$ export OS_USERNAME=demo
$ export OS_PASSCODE=${PASSCODE}
$ openstack server list
注意
密码生成器将由身份验证器应用程序生成,例如 FreeOTP 或 Google Authenticator。有关如何配置身份验证器应用程序的信息,请参阅您的云提供商的文档,或 Keystone 文档(如果您正在为自己的云配置此功能)。
注意
如果未提供密码,系统将提示您输入密码。