OAuth2.0 客户端凭证授权流程

概述

OAuth2.0 客户端凭证授权流程基于 RFC6749 实现为 Keystone 的一个扩展。此扩展使用 应用程序凭证 作为其后端,因为它们具有一些相似的特性。用户可以使用 application_credentials_idapplication_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 客户端凭证的管理。

  1. 修改 keystone.conf 以支持应用程序凭证身份验证。

stack@oauth2-0-server:/$ vi /etc/keystone/keystone.conf
[auth]
methods = external,password,token,application_credential
  1. 重新启动 Keystone 服务,以使修改后的配置信息生效。

stack@oauth2-0-server:/$ sudo systemctl restart devstack@keystone.service

尝试访问 Keystone API

最后,尝试访问 Keystone API 以确认服务器正常工作。

  1. 通过应用程序凭证 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                                                       |
+--------------+----------------------------------------------------------------------------------------+
  1. 通过使用 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"}