扩展用户 API 以支持联合身份属性

bug #1816076

扩展用户 API 以支持联合身份属性,以便我们将联合用户视为任何其他 Keystone 用户。

问题描述

随着影子用户 [1] 的添加,联合用户不再是短暂存在的,而是像任何其他 Keystone 用户一样。因此,联合用户在用户表中有一条记录,并且可以接收具体的角色分配。但是,为了向联合用户分配角色,您需要本地用户 ID。同样,您需要用户 ID 来进行委托和创建信任。但是,我们没有一个 API 方法支持查询联合用户以获取本地用户 ID。

我们一直在处理的另一个问题是,如何为联合用户提供授权,因为联合用户在第一次进行身份验证之前在 Keystone 中不存在。此外,在巴塞罗那峰会上,我们讨论了运营商能够轻松更改和回滚配置的需求。

提议的变更

为了解决这个问题,我们可以简单地扩展用户 API 以支持联合身份属性。例如,创建一个联合用户

POST /v3/users
{
    "user": {
        "default_project_id": "263fd9",
        "domain_id": "1789d1",
        "enabled": true,
        "name": "James Doe",
        "federated": [
            {
                "idp_id": "1789d1",
                "protocols": [
                    {
                        "protocol_id": "saml2",
                        "unique_id": "jdoe"
                    }
                ]
            }
        ]
    }
}

响应示例

{
    "user": {
        "domain_id": "1789d1",
        "id": "9fe1d3",
        "name": "James Doe",
        "enabled": true,
        "links": {
            "self": "https://example.com/identity/v3/users/9fe1d3"
        }
        "federated": [
            {
                "idp_id": "1789d1",
                "protocols": [
                    {
                        "protocol_id": "saml2",
                        "unique_id": "jdoe"
                    }
                ]
            }
        ]
    }
}

为现有用户创建一个联合对象

PUT /v3/users/{id}
{
    "federated": {
        "idp_id": "1789d1",
        "protocols": [
            {
                "protocol_id": "saml2",
                "unique_id": "jdoe"
            }
        ]
    }
}

响应示例

{
    "federated": {
        "idp_id": "1789d1",
        "protocols": [
            {
                "protocol_id": "saml2",
                "unique_id": "jdoe"
            }
        ]
        "links": {
            "self": "http://.../v3/users/{id}/federated/{id}"
        }
    }
}

同样,您可以通过查询联合 unique_id 来查询特定的联合用户

GET /v3/users/?unique_id={unique_id}

如果 unique_id 在组织内不唯一,则请求需要包含其他参数才能返回特定的用户。

扩展 API 允许运营商获取联合用户的本地用户 ID,以便进行配置。并且用户 API 是这些操作的自然位置,因为联合用户实际上是一个用户。联合身份属性存在于 sql 后端的用户数据模型中。

这也可以与影子映射 [2] 一起使用,允许运营商批量配置,并充分利用 API 来管理联合身份。总之,让我们像对待任何其他 Keystone 用户一样对待联合用户。

备选方案

继续使用影子映射 [3] 作为提供联合用户配置的唯一选项。

我们可以扩展 OS-FEDERATION 以支持联合用户操作。

安全影响

通知影响

其他最终用户影响

性能影响

其他部署者影响

开发人员影响

实现

负责人

主要负责人

  • Kristi Nikolla

其他贡献者

  • Ron De Rose

工作项

  1. 扩展用户创建 API 以支持联合身份属性。

  2. 根据需要扩展其他用户 API 方法。

  3. 更新文档

依赖项

文档影响

我们需要更新用户 API 文档以及联合身份文档。

参考资料

  1. 影子用户

  2. 影子映射