扩展用户 API 以支持联合身份属性¶
扩展用户 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
工作项¶
扩展用户创建 API 以支持联合身份属性。
根据需要扩展其他用户 API 方法。
更新文档
依赖项¶
无
文档影响¶
我们需要更新用户 API 文档以及联合身份文档。