【问题标题】:Fiware KeyRock SCIM API bug: _check_allowed_to_get_and_assign() got an unexpected keyword argument 'userName'Fiware KeyRock SCIM API 错误:_check_allowed_to_get_and_assign() 有一个意外的关键字参数“用户名”
【发布时间】:2016-07-21 19:21:19
【问题描述】:

我们想使用 FIWARE IdM,Keystone 和 Horizo​​n。特别是在注册期间,我们希望

  • 创建用户
  • 将该用户添加到组织中
  • 授权用户使用应用程序

我们已经使用 docker hub (https://hub.docker.com/r/fiware/idm/) 上的最新 KeyRock docker 映像安装了 Keystone 和 Horizo​​n。

由于 KeyRock 网络界面创建云组织、西班牙等地区的社区用户,我决定尝试使用 SCIM API 来创建和授权用户:

注意:SCIM API 文档 (http://docs.keyrock.apiary.io/#reference/scim-2.0) 暗示 SCIM 调用在 KeyRock 服务器端口上,但它们在 Keystone 服务器端口上可用。如果 SCIM 文档提到 http://[keystone server]/v3/OS-SCIM/v2/Users/ 而不是 http://keyrock/v3/OS-SCIM/v2/Users/ 会更清楚

假设我们有一个 application_id=app1 的应用程序(SCIM 使用者)。此应用程序是使用 Horizo​​n 前端创建的,或者使用

    POST /v3/OS-OAUTH2/consumers 

打电话。我不知道创建应用程序的两种方式之间的区别,尽管我还没有尝试过后者。这是一次性操作,因此我们使用 Web 界面来创建应用程序和关联角色。

所以我们有一个应用程序的角色 = role1

我们使用 SCIM 创建一个用户

POST /v3/OS-SCIM/v2/Users/

产生 user_id=user1

当我尝试授权他使用我们的应用程序时

PUT /v3/OS-ROLES/users/user1/applications/app1/roles/role1

我收到以下错误:

{
    "error": {
    "message": "_check_allowed_to_get_and_assign() got an unexpected keyword argument 'userName'",
    "code": 400,
    "title": "Bad Request"
    }
}

下一步是使用 KeyRock 获取资源所有者令牌

POST [KeyStone server]/oauth2/token

但由于上述错误,这没有实际意义。

使用 user1 登录 KeyRock 用户界面会出现错误: “你没有任何项目的授权。”我认为这是因为 user1 未获得组织的授权。 user1 对其他用户或 KeyRock 用户界面中的管理员不可见,因此我无法分配必要的授权。

有什么想法吗? user1 还需要拥有哪些角色以及如何分配它们才能满足 KeyRock?

【问题讨论】:

  • 我罗宾,我们仍在努力为您提供解决方案。
  • 我的问题已经一个月了。对解决方法有任何更新或见解吗?
  • 现在已经两个月了,我们仍然无法使用 SCIM API 以编程方式创建用户。有人在做这个吗?我们应该放弃 SCIM API 吗?
  • 我们希望这周能修复它。

标签: fiware


【解决方案1】:

深入研究您的问题后,发现可能与缺少新用户的默认组织有关。尽管对 SCIM API 用户端点的请求应该只创建用户,但可以肯定 KeyRock 用户在内部有一个默认组织,从外部看不到。由于自动创建这个组织也很有意义,我们只是在 KeyRock 的 SCIM 控制器中进行了一些改进来负责这个。大家可以看看our GitHub repository的变化。

我自己确保这应该可以解决您的问题,遵循相同的流程(请注意,X-Auth-Token 标头的值是 admin 标记,Host 标头应该是您的 Keystone 端点):

  1. 通过 SCIM API 注册用户

    POST /v3/OS-SCIM/v2/Users HTTP/1.1
    Host: localhost:5000
    Accept: */*
    Content-Type: application/json
    X-Auth-Token: 6bd914d9976c448a98b83ccaf5931c4e
    Content-Length: 55
    
    {
      "userName": "foo@foo.bar",
      "password": "foobar"
    }
    

    返回以下响应:

    HTTP/1.1 201 Created
    Vary: X-Auth-Token
    Content-Type: application/json
    Content-Length: 276
    
    {
      "userName": "foo@foo.bar",
      "urn:scim:schemas:extension:keystone:2.0": {
        "domain_id": "default",
        "default_project_id": "c590cea2b37c4f1c9ca94a015837cde9"
      },
      "active": true,
      "id": "foo-foo-bar",
      "schemas": [
        "urn:scim:schemas:core:2.0",
        "urn:scim:schemas:extension:keystone:2.0"
      ]
    }
    
  2. 为应用程序app1 授权新创建的用户,为他们分配角色role1

    PUT /v3/OS-ROLES/users/foo-foo-bar/applications/app1/roles/role1 HTTP/1.1
    Host: localhost:5000
    Accept: */*
    Content-Type: application/json
    X-Auth-Token: fd817b31444141a7a8a15d6d6afd2078
    

    依次返回以下成功响应:

    HTTP/1.1 204 No Content
    Vary: X-Auth-Token
    Content-Length: 0
    
  3. 在此之后,我终于能够按照您的要求获得资源所有者 OAuth2 令牌Authorization 标头包含 app1 的 OAuth2 凭据)。

    POST /oauth2/token HTTP/1.1
    Host: localhost:8000
    Accept: */*
    Authorization: Basic 12345678abcdefgh=
    Content-Type: application/x-www-form-urlencoded
    Content-Length: 56
    
    grant_type=password&username=foo@foo.bar&password=foobar
    

    令牌终于返回了:

    HTTP/1.0 200 OK
    Vary: Accept-Language, Cookie
    Content-Type: application/json
    
    {
      "access_token": "JYjCV2H8QNakRPUqqdoAHZmpmD0vgQ",
      "token_type": "Bearer",
      "expires_in": 3600,
      "refresh_token": "snnS8djsYw62aUtl9Szk9BBqti36jF"
    }
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-26
    • 2019-01-05
    • 2022-10-24
    • 2020-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多