身份验证

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_URLos-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-nameOS_USER_DOMAIN_NAME

  • --os-user-domain-idOS_USER_DOMAIN_ID

如果将项目名称作为授权范围使用,请指定其所属的域名或 ID。

  • --os-project-domain-nameOS_PROJECT_DOMAIN_NAME

  • --os-project-domain-idOS_PROJECT_DOMAIN_ID

如果将域作为授权范围使用,请设置其名称或 ID。

  • --os-domain-nameOS_DOMAIN_NAME

  • --os-domain-idOS_DOMAIN_ID

请注意,如果用户和项目共享同一个域,则只需将 --os-default-domainOS_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 文档(如果您正在为自己的云配置此功能)。

注意

如果未提供密码,系统将提示您输入密码。