10. 使用 API 进行身份验证的方法
本章介绍不同的身份验证方法、每种方法的最佳用例以及示例
AWX 旨在帮助组织通过直观的仪表板集中控制其自动化并提供开箱即用的控制,同时提供 REST API 以更深入地集成您的其他工具。AWX 支持多种身份验证方法,使您可以轻松地将 AWX 嵌入现有工具和流程中,帮助确保合适的人员可以访问 AWX 资源。
10.1. 会话身份验证
会话身份验证用于直接登录 AWX 的 API 或 UI,以手动创建资源(清单、项目、作业模板)并在浏览器中启动作业。使用此方法,您可以在较长一段时间内保持登录状态,不仅仅是为了该 HTTP 请求,例如,在浏览器(如 Chrome 或 Firefox)中浏览 UI 或 API 时。用户登录后,会创建一个会话 Cookie,该 Cookie 使用户能够在导航到 AWX 中的不同页面时保持登录状态。以下是会话中客户端和服务器之间发生的通信。
使用 curl 工具,您可以看到登录 AWX 时发生的活动。
向
/api/login/
端点发出 GET 请求以获取csrftoken
Cookie。
curl -k -c - https://<awx-host>/api/login/
localhost FALSE / FALSE 0 csrftoken
AswSFn5p1qQvaX4KoRZN6A5yer0Pq0VG2cXMTzZnzuhaY0L4tiidYqwf5PXZckuj
向
/api/login/
端点发出 POST 请求,其中包含用户名、密码和 X-CSRFToken=<token-value>。
curl -X POST -H 'Content-Type: application/x-www-form-urlencoded' \
--referer https://<awx-host>/api/login/ \
-H 'X-CSRFToken: K580zVVm0rWX8pmNylz5ygTPamgUJxifrdJY0UDtMMoOis5Q1UOxRmV9918BUBIN' \
--data 'username=root&password=reverse' \
--cookie 'csrftoken=K580zVVm0rWX8pmNylz5ygTPamgUJxifrdJY0UDtMMoOis5Q1UOxRmV9918BUBIN' \
https://<awx-host>/api/login/ -k -D - -o /dev/null
所有这些操作都在您在浏览器中登录 UI 或 API 时由 AWX 完成,并且仅应在浏览器中进行身份验证时使用。对于与 AWX 的编程集成,请参阅 OAuth 2 令牌身份验证。
典型的响应可能如下所示
Server: nginx
Date: <current date>
Content-Type: text/html; charset=utf-8
Content-Length: 0
Connection: keep-alive
Location: /accounts/profile/
X-API-Session-Cookie-Name: awx_sessionid
Expires: <date>
Cache-Control: max-age=0, no-cache, no-store, must-revalidate, private
Vary: Cookie, Accept-Language, Origin
Session-Timeout: 1800
Content-Language: en
X-API-Total-Time: 0.377s
X-API-Request-Id: 700826696425433fb0c8807cd40c00a0
Access-Control-Expose-Headers: X-API-Request-Id
Set-Cookie: userLoggedIn=true; Path=/
Set-Cookie: current_user=<user cookie data>; Path=/
Set-Cookie: csrftoken=<csrftoken>; Path=/; SameSite=Lax
Set-Cookie: awx_sessionid=<your session id>; expires=<date>; HttpOnly; Max-Age=1800; Path=/; SameSite=Lax
Strict-Transport-Security: max-age=15768000
当用户使用此方法成功进行身份验证时,服务器将以一个名为 X-API-Session-Cookie-Name
的标头进行响应,指示会话 Cookie 的配置名称。默认值为 awx_session_id
,您可以在后面的 Set-Cookie
标头中看到它。
注意
可以通过在 SESSION_COOKIE_AGE
参数中指定它来更改会话过期时间。有关更多详细信息,请参阅 使用会话限制。
10.2. 基本身份验证
基本身份验证(Basic Auth)是无状态的,因此必须通过 Authorization 标头将 base64 编码的 username
和 password
与每个请求一起发送。这可以用于来自 curl 请求、python 脚本或对 API 的单个请求的 API 调用。OAuth 2 令牌身份验证 建议用于尽可能地访问 API。
curl 示例
# the --user flag adds this Authorization header for us
curl -X GET --user 'user:password' https://<awx-host>/api/v2/credentials -k -L
有关基本 HTTP 身份验证方案的更多信息,请参阅 RFC 7617。
注意
出于安全目的,您可以从 AWX UI 设置菜单的杂项身份验证设置中禁用基本身份验证
10.3. OAuth 2 令牌身份验证
OAuth(开放授权)是用于基于令牌的身份验证和授权的开放标准。OAuth 2 身份验证通常用于以编程方式与 AWX API 交互。与基本身份验证类似,OAuth 2 令牌通过 Authorization 标头与每个 API 请求一起提供。与基本身份验证不同,OAuth 2 令牌具有可配置的超时时间并且是可作用域的。令牌具有可配置的过期时间,并且可以在需要时由管理员轻松地撤销单个用户或整个 AWX 系统的令牌。这可以通过 revoke_oauth2_tokens 管理命令来完成,该命令在《AWX 管理指南》中进行了详细介绍,或者可以通过 API 进行完成,如 撤销访问令牌 中所述。
注意
默认情况下,出于安全目的,不允许由 SSO 创建的外部用户(例如,那些用户)生成 OAuth 令牌。这可以通过 AWX UI 设置菜单的杂项身份验证设置进行更改
在 AWX 中获取 OAuth 2 访问令牌的不同方法是
个人访问令牌 (PAT)
应用程序令牌:密码授予类型
应用程序令牌:隐式授予类型
应用程序令牌:授权码授予类型
有关上述方法的更多信息,请参阅《AWX 管理指南》中的 基于令牌的身份验证。
首先,用户需要在 API 中或 UI 中其用户的“令牌”选项卡中创建 OAuth 2 访问令牌。有关通过 UI 创建它们的更多详细信息,请参阅 用户 - 令牌。为了演示目的,请使用 PAT 方法在 API 中创建令牌。创建令牌后,用户可以设置作用域。
注意
令牌的过期时间可以在系统范围内进行配置。有关更多详细信息,请参阅 将 OAuth 2 令牌系统用于个人访问令牌 (PAT)。
令牌身份验证最适合任何对 AWX API 的编程使用,例如 Python 脚本或 curl 等工具,如下面的创建 PAT(没有关联的应用程序)的示例所示。
Curl 示例
curl -u user:password -k -X POST https://<awx-host>/api/v2/tokens/
此调用将返回类似于以下内容的 JSON 数据
token
属性的值现在可用于执行 AWX 资源(例如,主机)的 GET 请求。
curl -k -X POST \
-H “Content-Type: application/json”
-H “Authorization: Bearer <oauth2-token-value>” \
https://<awx-host>/api/v2/hosts/
同样,您可以通过对要启动的作业模板发出 POST 请求来启动作业。
curl -k -X POST \
-H "Authorization: Bearer <oauth2-token-value>" \
-H "Content-Type: application/json" \
--data '{"limit" : "ansible"}' \
https://<awx-host>/api/v2/job_templates/14/launch/
Python 示例
awxkit 是一款开源工具,可轻松使用 HTTP 请求访问 AWX API。您可以让 awxkit 代表您获取 PAT,方法是使用 awxkit login
命令。有关更多详细信息,请参阅 AWX API 参考。
有关如何在集成外部应用程序的上下文中在 AWX 中使用 OAuth 2 的更多信息,请参阅《AWX 管理指南》中的 基于令牌的身份验证。
如果您需要编写自定义请求,可以使用 Python 库请求 编写 Python 脚本,例如以下示例
import requests
oauth2_token_value = 'y1Q8ye4hPvT61aQq63Da6N1C25jiA' # your token value from AWX
url = 'https://<awx-host>/api/v2/users/'
payload = {}
headers = {'Authorization': 'Bearer ' + oauth2_token_value,}
# makes request to awx user endpoint
response = requests.request('GET', url, headers=headers, data=payload,
allow_redirects=False, verify=False)
# prints json returned from awx with formatting
print(json.dumps(response.json(), indent=4, sort_keys=True))
10.4. SSO 身份验证
单点登录 (SSO) 身份验证方法从根本上不同于其他方法,因为用户的身份验证发生在 AWX 外部,例如 Google SSO、Azure SSO、SAML 或 GitHub。例如,使用 GitHub SSO,GitHub 是唯一真实来源,它根据您提供给 AWX 的用户名和密码来验证您的身份。
您可以使用 AWX 在大型组织中配置 SSO 身份验证,该组织具有中央身份提供者。在 AWX 中配置 SSO 方法后,登录屏幕上将出现该 SSO 的按钮。如果您单击该按钮,它将重定向到身份提供者(在本例中为 GitHub),您将在那里提供您的凭据。如果身份提供者成功验证您的身份,那么 AWX 将创建一个与您的 GitHub 用户关联的用户(如果这是您第一次通过此 SSO 方法登录),并让您登录。