OAuth2.0 客户端凭证授权流程¶
概述¶
OAuth2.0 客户端凭证授权流程基于 RFC6749 实现为 Keystone 的一个扩展。此扩展使用 应用程序凭证 作为其后端,因为它们具有一些相似的特性。用户可以使用 application_credentials_id 和 application_credentials_secret 作为客户端凭证来获取 OAuth2.0 访问令牌。然后,可以使用该访问令牌通过支持在 Authorization 标头中接收访问令牌的 Keystone 中间件来访问 OpenStack API 的受保护资源。有关生成 OAuth2.0 访问令牌的更多信息,请参阅 身份 API 参考。
指南¶
按照本指南中的以下步骤启用 Keystone 身份服务器以支持 OAuth2.0 客户端凭证授权。在本示例中,keystone.host 是 Keystone 身份服务器使用的域名。
警告
强烈建议在使用 OAuth2.0 客户端凭证时启用 Keystone 中的 HTTPS。有关详细信息,请参阅 在身份服务中配置 HTTPS。根据 RFC6749,由于请求包含敏感信息(例如客户端密钥)以明文形式,因此必须在授权服务器中启用 HTTPS 必须启用 HTTPS。请注意,您可能需要同时启用 HTTP 和 HTTPS,因为其他 OpenStack 服务或第三方应用程序可能不使用 OAuth2.0,并且需要 HTTP 与 Keystone 身份服务器进行身份验证。
启用应用程序凭证身份验证¶
由于当前实现的的设计,必须在 Keystone 中启用应用程序凭证,因为它用于 OAuth2.0 客户端凭证的管理。
修改
keystone.conf以支持应用程序凭证身份验证。
stack@oauth2-0-server:/$ vi /etc/keystone/keystone.conf
[auth]
methods = external,password,token,application_credential
重新启动 Keystone 服务,以使修改后的配置信息生效。
stack@oauth2-0-server:/$ sudo systemctl restart devstack@keystone.service
尝试访问 Keystone API¶
最后,尝试访问 Keystone API 以确认服务器正常工作。
通过应用程序凭证 API 创建 OAuth2.0 客户端凭证。
stack@oauth2-0-server:/$ openstack application credential create sample_001
+--------------+----------------------------------------------------------------------------------------+
| Field | Value |
+--------------+----------------------------------------------------------------------------------------+
| description | None |
| expires_at | None |
| id | a7850381222a4e2cb595664dfd57d083 |
| name | sample_001 |
| project_id | 2b90a96668694041a640a2ef84be6de7 |
| roles | admin reader member |
| secret | GVm33KC6AqpDZj_ZzKhZClDqnCpNDMNh66Mvait8Dxw7Kc8kwVj7ImkwnRWvovs437f2aftbW46wEMtH0cyBQA |
| system | None |
| unrestricted | False |
| user_id | 0b8426bb83d944bc8d0fe4c3b9a3f635 |
+--------------+----------------------------------------------------------------------------------------+
通过使用 OAuth2.0 客户端凭证的“Basic” HTTP 身份验证获取 oauth2.0 访问令牌。
stack@oauth2-0-server:/$ curl -sik -u "$a7850381222a4e2cb595664dfd57d083:GVm33KC6AqpDZj_ZzKhZClDqnCpNDMNh66Mvait8Dxw7Kc8kwVj7ImkwnRWvovs437f2aftbW46wEMtH0cyBQA" \
-X POST https://keystone.host/identity/v3/OS-OAUTH2/token
-H "application/x-www-form-urlencoded" -d "grant_type=client_credentials"
HTTP/1.1 200 OK
Date: Tue, 01 Mar 2022 00:56:59 GMT
Server: Apache/2.4.41 (Ubuntu)
Content-Type: application/json
Content-Length: 264
Vary: X-Auth-Token
x-openstack-request-id: req-a8358f51-2e0f-45a7-bb1e-7d29c6a793f4
Connection: close
{"access_token":"gAAAAABhi1cMynG89h8t6TJrxNiZuNzjcIUIxNctoVfuqTw7BpUedLKxjPymClVEnj9GhIT5u2mpjaJATlEAtaa3D6_t8jk_fV-mqo2IUlsmTPTnMwkcjh5FSHQVRdqvDxgY3nSqLA_Hfv-zPmjS5KWX3hmyDE5YWO1ztX6QNVQb4wTPyNL1-7I","expires_in":3600,"token_type":"Bearer"}