5.4. 认证服务

5.4.1. 概要

UOS认证服务提供认证、授权、用户管理和服务发现等服务,基于OpenStack Keystone V3 API。

5.4.2. 核心概念

5.4.2.1. 用户账号(User)

用户账号有邮箱、用户名和密码,用于登陆UOS Cloud的Web管理面板。

5.4.2.2. 项目(Project)

每个用户拥有一个项目,并且作为这个项目的拥有者(Owner),同时可以参与其他用户的项目中去。

5.4.2.3. 区域(Region)

目前支持北京(bj1)和广州(gz1)两个区域,除了认证服务是统一入口,其他的服务都区分区域。

5.4.2.4. 角色(Role)

目前系统支持的角色有:

  • 拥有者(Project_Owner) 是指该项目的所有者,拥有对项目资源和账号CRUD权限,能够创建其他角色的用户。
  • 管理员(Project_Admin) 是指该项目的管理者,拥有对项目资源的CRUD权限,不能管理账号。
  • 观察者(Project_Observer) 是指该项目的观察者,对项目资源有只读权限。
  • 无权限(Project_Noaccess) 对该项目没有任何权限。

5.4.2.5. 服务目录(Service Catalog)

服务目录是指在获得Token并且通过权限认证之后UOS认证服务返回的授权的服务列表,比如,如下

{
  "token": {
      "catalog": [   #以下段即就"服务目录""

          {                     #这一段列出了compute服务的endpoint信息。
              "endpoints": [
                  {
                      "id": "bj1__compute__public__id",
                      "interface": "public",
                      "region": "bj1",
                      "url": "https://bj1.compute.api.ustack.com"
                  }
              ],
              "id": "compute__id",
              "type": "compute"
          },
……

UOS目前支持的服务有云主机服务(Compute),网络服务(Network), 块存储服务(Volume), 报表统计服务(Metering), 监控报警服务(Alarm), 计费服务(Billing)等。

Note

为了降低用户的使用成本,OpenStack Keystone的Domain和Policy的概念在UOS认证服务中被隐藏。

5.4.3. API规范

认证服务API入口与API列表如下:

资源 操作 HTTP方法 URI路径
Versions (版本) 查看API版本 GET /
Tokens (令牌) 认证并生成新令牌 POST /v3/auth/tokens
Projects (项目) 列出某用户的所有项目 GET /v3/users/{user_id}/projects

5.4.4. 版本 (Versions)

该API返回UOS认证服务支持的版本和不同版本支持的状态。目前UOS只支持v3.0版本。

5.4.4.1. 查看API版本

HTTP方法 URI路径 描述
GET / 查看API版本

请求参数

无。

返回参数

字段名 类型 描述
verions dict API版本详情
id string 版本号,如v2.0, v3.0
status string 当前版本状态:stable (稳定状态,推荐使用), beta (测试阶段)
updated string 该版本API最近更新时间

请求样例

curl https://identity.api.ustack.com | python -m json.tool

返回样例

{
  "versions": {
      "values": [
          {
              "id": "v3.0",
              "links": [
                  {
                      "href": "https://identity.api.ustack.com",
                      "rel": "self"
                  }
              ],
              "media-types": [
                  {
                      "base": "application/json",
                      "type": "application/vnd.openstack.identity-v3+json"
                  },
                  {
                      "base": "application/xml",
                      "type": "application/vnd.openstack.identity-v3+xml"
                  }
              ],
              "status": "stable",
              "updated": "2013-03-06T00:00:00Z"
          }
      ]
  }
}

5.4.5. 令牌 (Tokens)

5.4.5.1. 认证并生成新令牌

HTTP方法 URI路径 描述
POST /v3/auth/tokens 获取令牌

请求参数

字段名 类型 描述
auth dict 认证信息(identity)和认证的范围(scope)
identity dict 认证信息,包含论证方法(methods)和密钥信息(accessKey)
scope dict 认证的范围,是指该获得的token的作用域,UOS支持项目级别的作用域
methods array 认证方法,目前UOS两种认证方法: password和accessKey: password认证需要用户名(name)和密码(password)认证方法, accessKey认证方法需要accessKey和secretKey
project dict 项目标识信息,UOS只支持通过项目id标识一个项目

请求样例

curl -i -s \
     -X POST https://identity.api.ustack.com/v3/auth/tokens \
     -H "Content-Type:application/json" \
     -d '{
            "auth": {
                "identity": {
                    "methods": [
                        "password"
                    ],
                    "password": {
                        "user": {
                            "id": "ac27e806fb814f9cb053176451455a61",
                            "password": "17814e8b"
                        }
                    }
                },
                "scope": {
                    "project": {
                        "id": "55c3518815194c448f51ba464d5e5d68"
                    }
                }
            }
        }'

返回参数

字段名 类型 描述
X-Subject-Token string 一个32位的字符串,验证成功之后在返回头中, 在随后的请求中会用到该Token
token dict 返回token信息,包含了catalog, project, rule, user, methods等信息
catalog array 服务目录,包含了用户有权限的所有UOS云服务的endpoints信息
project dict 项目信息,包含了项目名,项目ID和项目所属的域 (Domain) 信息
user dict 用户信息,包含了用户名,用户ID和用户所属的域 (Domain) 信息
rules array 该用户在该项目上的角色信息
expires_at timestamp Token失效日期
issued_at timestamp Token创建日期
extras dict Token额外信息,该字段暂时为空
endpoints array UOS云服务id, 类型 (type) 和endpoint信息(包含url, region)

返回样例

HTTP/1.1 201 Created
X-Subject-Token: b258ff6f28704c078e300e79a9b25e21

{
  "token": {
      "catalog": [
          {
              "endpoints": [
                  {
                      "id": "gd1__volume__public__id",
                      "interface": "public",
                      "region": "gd1",
                      "url": "https://gd1.volume.api.ustack.com"
                  },
                  {
                      "id": "bj1__volume__public__id",
                      "interface": "public",
                      "region": "bj1",
                      "url": "https://bj1.volume.api.ustack.com"
                  }
              ],
              "id": "volume__id",
              "type": "volume"
          },
          {
              "endpoints": [
                  {
                      "id": "gd1__image__public__id",
                      "interface": "public",
                      "region": "gd1",
                      "url": "https://gd1.image.api.ustack.com"
                  },
                  {
                      "id": "bj1__image__public__id",
                      "interface": "public",
                      "region": "bj1",
                      "url": "https://bj1.image.api.ustack.com"
                  }
              ],
              "id": "image__id",
              "type": "image"
          },
          {
              "endpoints": [
                  {
                      "id": "gd1__compute__public__id",
                      "interface": "public",
                      "region": "gd1",
                      "url": "https://gd1.compute.api.ustack.com"
                  },
                  {
                      "id": "bj1__compute__public__id",
                      "interface": "public",
                      "region": "bj1",
                      "url": "https://bj1.compute.api.ustack.com"
                  }
              ],
              "id": "compute__id",
              "type": "compute"
          },
          {
              "endpoints": [
                  {
                      "id": "gd1__share__public__id",
                      "interface": "public",
                      "region": "gd1",
                      "url": "https://gd1.share.api.ustack.com"
                  },
                  {
                      "id": "bj1__share__public__id",
                      "interface": "public",
                      "region": "bj1",
                      "url": "https://bj1.share.api.ustack.com"
                  }
              ],
              "id": "share__id",
              "type": "share"
          },
          {
              "endpoints": [
                  {
                      "id": "gd1__trove__public__id",
                      "interface": "public",
                      "region": "gd1",
                      "url": "https://gd1.trove.api.ustack.com"
                  },
                  {
                      "id": "bj1__trove__public__id",
                      "interface": "public",
                      "region": "bj1",
                      "url": "https://bj1.trove.api.ustack.com"
                  }
              ],
              "id": "trove__id",
              "type": "trove"
          },
          {
              "endpoints": [
                  {
                      "id": "gd1__network__public__id",
                      "interface": "public",
                      "region": "gd1",
                      "url": "https://gd1.network.api.ustack.com"
                  },
                  {
                      "id": "bj1__network__public__id",
                      "interface": "public",
                      "region": "bj1",
                      "url": "https://bj1.network.api.ustack.com"
                  }
              ],
              "id": "network__id",
              "type": "network"
          },
          {
              "endpoints": [
                  {
                      "id": "center__identity__public__id",
                      "interface": "public",
                      "region": "center",
                      "url": "https://identity.api.ustack.com"
                  }
              ],
              "id": "identity__id",
              "type": "identity"
          }
      ],
      "expires_at": "2014-07-04T06:09:48.853381Z",
      "extras": {},
      "issued_at": "2014-07-04T05:09:48.853413Z",
      "methods": [
          "password"
      ],
      "project": {
          "domain": {
              "id": "e4f99cfe1cd148aaa1bb5f9e5c51afbc",
              "name": "uos_e4f99cfe1cd148aaa1bb5f9e5c51afbc_domain_default"
          },
          "id": "55c3518815194c448f51ba464d5e5d68",
          "name": "uos_project"
      },
      "roles": [
          {
              "id": "1a4b9c02eba24151b39eb300a658df7e",
              "name": "domain_admin"
          }
      ],
      "user": {
          "domain": {
              "id": "e4f99cfe1cd148aaa1bb5f9e5c51afbc",
              "name": "uos_e4f99cfe1cd148aaa1bb5f9e5c51afbc_domain_default"
          },
          "id": "ac27e806fb814f9cb053176451455a61",
          "name": "uos_e4f99cfe1cd148aaa1bb5f9e5c51afbc"
      }
  }
}

5.4.6. 项目 (Projects)

5.4.6.1. 列出某用户的所有项目

HTTP方法 URI路径 描述
GET /v3/users/{user_id}/projects 列出用户{user_id}能够有权限访问的所有项目

请求参数

参数名 类型 描述
X-Auth-Token string 通过UOS认证服务获得的有效Token

请求样例

curl -s \
     -X GET https://identity.api.ustack.com/v3/users/{user_id}/projects \
     -H "X-Auth-Token: b258ff6f28704c078e300e79a9b25e21" | python -m json.tool

返回参数

参数名 类型 描述
projects array 项目列表信息
enabled bool 该项目是否被启用,取值true或false
domain_id string 项目所属域id

表中只列举部分重要参数,全部参数见 返回样例

返回样例

{
   "links": {
       "next": null,
       "previous": null,
       "self": "https://identity.api.ustack.com/v3/users/{User_ID}/projects"
   },
   "projects": [
       {
           "description": "Project One for {User_ID}",
           "domain_id": "--domain--one--id---",
           "enabled": true,
           "id": "--project--one--id--",
           "links": {
               "self": "https://identity.api.ustack.com/v3/projects/--project-one--id--"
           },
           "name": "project-one"
       },
       {
           "description": "Another project for {User_ID}",
           "domain_id": "--domain--two--id--",
           "enabled": true,
           "id": "--project--two--id--",
           "links": {
               "self": "https://identity.api.ustack.com/v3/projects/--project-two--id--"
           },
           "name": "project-two"
       }
   ]
 }