
# 获取委托Token - KeystoneCreateAgencyToken
#### 功能介绍
该接口可以用于获取委托方的token。
例如：A账号希望B账号管理自己的某些资源，所以A账号创建了委托给B账号，则A账号为委托方，B账号为被委托方。那么B账号可以通过该接口获取委托token。B账号仅能使用该token管理A账号的委托资源，不能管理自己账号中的资源。如果B账号需要管理自己账号中的资源，则需要获取自己的用户token。详情请参考：[委托其他账号管理资源](https://support.huaweicloud.com/usermanual-iam/iam_06_0001.html)。
token是系统颁发给用户的访问令牌，承载用户的身份、权限等信息。调用IAM以及其他云服务的接口时，可以使用本接口获取的token进行鉴权。
该接口可以使用全局区域的Endpoint和其他区域的Endpoint调用。IAM的Endpoint请参见：[地区和终端节点](https://developer.huaweicloud.com/endpoint?IAM)。
![](https://support.huaweicloud.com/api-iam/public_sys-resources/note_3.0-zh-cn.png)
- token的有效期为24小时，建议进行缓存，避免频繁调用。
- 使用Token前请确保Token离过期有足够的时间，防止调用API的过程中Token过期导致调用API失败。
 
#### 调试
您可以在[API Explorer](https://console.huaweicloud.com/apiexplorer/#/openapi/IAM/doc?api=KeystoneCreateAgencyToken)中调试该接口。
#### 授权信息
账号具备所有API的调用权限，如果使用账号下的IAM用户调用当前API，该IAM用户需具备调用API所需的权限，具体权限要求请参见[权限和授权项](https://support.huaweicloud.com/api-iam/iam_19_0001.html)。
#### URI
POST /v3/auth/tokens
表1Query参数 
| 参数        | 是否必选 | 参数类型   | 描述                                                     |
|:---|:---|:---|:---|
| nocatalog | 否    | String | 如果设置该参数，返回的响应体中将不显示catalog信息。任何非空字符串都将解释为true，并使该字段生效。 |
   
#### 请求参数
表2请求Header参数 
| 参数           | 是否必选 | 参数类型   | 描述                                             |
|:---|:---|:---|:---|
| Content-Type | 是    | String | 该字段内容填为"application/json;charset=utf8"。        |
| X-Auth-Token | 是    | String | 被委托方B账号中的IAM用户token，且该token具有Agent Operator权限。 |
   
表3请求Body参数 
| 参数                                                            | 是否必选 | 参数类型   | 描述    |
|:---|:---|:---|:---|
| [auth] | 是    | Object | 认证信息。 |
   
 表4auth 
| 参数                                                                        | 是否必选 | 参数类型   | 描述                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
|:---|:---|:---|:---|
| [identity] | 是    | Object | 认证参数。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
| [scope]       | 是    | Object | token的使用范围，需要填写委托方A的project或domain，填写其中任一即可。 说明： - **如果您将scope设置为domain，该Token适用于全局级服务；如果将scope设置为project，该Token适用于项目级服务。**  - **如果您将scope同时设置为project和domain，将以project参数为准，获取到项目级服务的Token。**  - **如果您将scope置空，将获取到全局级服务的Token。** **建议您按需要填写** **Token使用范围。**   |
   
 表5auth.identity 
| 参数                                                                                     | 是否必选 | 参数类型             | 描述                                                                                                                                                                                                                                                                                                                        |
|:---|:---|:---|:---|
| methods                                                                                | 是    | Array of strings | token的获取方式，该字段内容为\["assume_role"\]。 取值范围： - assume_role   |
| [assume_role] | 是    | Object           | assume_role的具体信息。                                                                                                                                                                                                                                                                                                         |
   
 表6auth.identity.assume_role 
| 参数          | 是否必选 | 参数类型   | 描述                                                                                                                                                                                                |
|:---|:---|:---|:---|
| domain_id   | 否    | String | 委托方A的账号ID。"domain_id"与"domain_name"至少填写一个，建议选择"domain_id"。 委托方A可以参考[获取账号、IAM用户、项目、用户组、区域、委托的名称和ID](https://support.huaweicloud.com/api-iam/iam_17_0002.html)获取账号ID。 |
| domain_name | 否    | String | 委托方A的账号名称。"domain_id"与"domain_name"至少填写一个，建议选择"domain_id"。 您可以在IAM控制台委托列表中查看委托方A的账号名称。                                                                                |
| agency_name | 是    | String | 委托方A创建的委托名称，获取方式请参见：[获取账号、IAM用户、项目、用户组、区域、委托的名称和ID](https://support.huaweicloud.com/api-iam/iam_17_0002.html)。                                                                                    |
   
 表7auth.scope 
| 参数                                                                           | 是否必选 | 参数类型   | 描述                                                                                                                                                                                          |
|:---|:---|:---|:---|
| [domain]   | 否    | Object | 取值为domain时，表示获取的Token可以作用于全局服务，全局服务不区分项目或区域，如OBS服务。如需了解服务作用范围，请参考**[系统权限](https://support.huaweicloud.com/usermanual-permissions/iam_01_0001.html)**。domain支持id和name，二选一即可，建议选择"domain_id"。 |
| [project] | 否    | Object | 取值为project时，表示获取的Token可以作用于项目级服务，仅能访问指定project下的资源，如ECS服务。如需了解服务作用范围，请参考**[系统权限](https://support.huaweicloud.com/usermanual-permissions/iam_01_0001.html)**。project支持id和name，二选一即可。         |
   
 表8auth.scope.domain 
| 参数   | 是否必选 | 参数类型   | 描述                                                                                                                         |
|:---|:---|:---|:---|
| id   | 否    | String | 委托方A的账号ID，获取方式请参见：[获取账号、IAM用户、项目、用户组、区域、委托的名称和ID](https://support.huaweicloud.com/api-iam/iam_17_0002.html)。id和name，二选一即可。 |
| name | 否    | String | 委托方A的账号名，获取方式请参见：[获取账号、IAM用户、项目、用户组、区域、委托的名称和ID](https://support.huaweicloud.com/api-iam/iam_17_0002.html)。id和name，二选一即可。  |
   
 表9auth.scope.project 
| 参数   | 是否必选 | 参数类型   | 描述                                                                                                                         |
|:---|:---|:---|:---|
| id   | 否    | String | 委托方A项目的ID，获取方式请参见：[获取账号、IAM用户、项目、用户组、区域、委托的名称和ID](https://support.huaweicloud.com/api-iam/iam_17_0002.html)。id和name，二选一即可。 |
| name | 否    | String | 委托方A项目的名称，获取方式请参见：[获取账号、IAM用户、项目、用户组、区域、委托的名称和ID](https://support.huaweicloud.com/api-iam/iam_17_0002.html)。id和name，二选一即可。 |
   
#### 请求示例
- 由被委托方B（账号名为IAMDomainB）中的IAM用户B（用户名IAMUserB，请求头中的X-Auth-Token字段需要填写IAMUserB的用户token，且该token需要具有Agent Operator权限），获取委托方A（账号名为IAMDomainA）创建的委托名为IAMAgency，作用范围为委托方A的项目"cn-north-1"，且返回的响应体中将不显示catalog信息的token。
  ```
  POST https://iam.myhuaweicloud.com/v3/auth/tokens?nocatalog=true
  ```
  ```
  {
      "auth": {
          "identity": {
              "methods": [
                  "assume_role"
              ],
              "assume_role": {
                  "domain_name": "IAMDomainA",                //委托方IAM用户A所属账号名称
                  "agency_name": "IAMAgency"                  //委托方IAM用户A创建的委托名称
              }
          },
          "scope": {
              "project": {
                  "name": "cn-north-1"                         //项目名称
              }
          }
      }
  }
  ```
  
- 由被委托方B（账号名为IAMDomainB）中的IAM用户B（用户名IAMUserB，请求头中的X-Auth-Token字段需要填写IAMUserB的用户token，且该token需要具有Agent Operator权限），获取委托方A（账号名为IAMDomainA）创建的委托名为IAMAgency，作用范围为委托方A整个账号的token。
  ```
  POST https://iam.myhuaweicloud.com/v3/auth/tokens
  ```
  ```
  {
      "auth": {
          "identity": {
              "methods": [
                  "assume_role"
              ],
              "assume_role": {
                  "domain_name": "IAMDomainA",                //委托方IAM用户A所属账号名称
                  "agency_name": "IAMAgency"                  //委托方IAM用户A创建的委托名称
              }
          },
          "scope": {
              "domain": {
                  "name": "IAMDomainA"                        //委托方IAM用户A所属账号名称
              }
          }
      }
  }
  ```
  
 
#### 响应参数
表10响应Header参数 
| 参数              | 参数类型   | 描述         |
|:---|:---|:---|
| X-Subject-Token | String | 签名后的token。 |
   
表11响应Body参数 
| 参数                                                               | 参数类型   | 描述         |
|:---|:---|:---|
| [token] | Object | token信息列表。 |
   
 表12token 
| 参数                                                                               | 参数类型             | 描述                                                                                                                                                                                                                                                 |
|:---|:---|:---|
| methods                                                                          | Array of strings | 获取token的方式。                                                                                                                                                                                                                                        |
| expires_at                                                                       | String           | token到期时间。 说明： UTC时间，格式为YYYY-MM-DDTHH:mm:ss.ssssssZ，日期和时间戳格式参照[ISO-8601](https://www.iso.org/iso-8601-date-and-time-format.html)，如：2023-06-28T08:56:33.710000Z。   |
| issued_at                                                                        | String           | token下发时间。 说明： UTC时间，格式为YYYY-MM-DDTHH:mm:ss.ssssssZ，日期和时间戳格式参照[ISO-8601](https://www.iso.org/iso-8601-date-and-time-format.html)，如：2023-06-28T08:56:33.710000Z。 |
| [assumed_by]   | Object           | 被委托方B的相关信息。                                                                                                                                                                                                                                        |
| [catalog] | Array of objects | 服务目录信息。                                                                                                                                                                                                                                            |
| [domain]          | Object           | 委托方A的账号信息。如果获取token时请求体中scope参数设置为domain，则返回该字段。                                                                                                                                                                                                   |
| [project]        | Object           | 委托方A的项目信息。如果获取token时请求体中scope参数设置为project，则返回该字段。                                                                                                                                                                                                  |
| [roles]     | Array of objects | 委托token的权限信息。                                                                                                                                                                                                                                      |
| [user]              | Object           | 委托方A所创建的委托的信息。                                                                                                                                                                                                                                     |
   
 表13token.assumed_by 
| 参数                                                                           | 参数类型   | 描述                |
|:---|:---|:---|
| [user] | Object | 被委托方B中IAM用户的用户信息。 |
   
 表14token.assumed_by.user 
| 参数                                                                                   | 参数类型   | 描述                                                                                                                                                                                                                                                                 |
|:---|:---|:---|
| name                                                                                 | String | 被委托方B中IAM用户的用户名。                                                                                                                                                                                                                                                   |
| id                                                                                   | String | 被委托方B中IAM用户的用户ID。                                                                                                                                                                                                                                                  |
| [domain] | Object | 被委托方B的账号信息。                                                                                                                                                                                                                                                        |
| password_expires_at                                                                  | String | 被委托方B中IAM用户的密码过期时间，""表示密码不过期。 说明： UTC时间，格式为YYYY-MM-DDTHH:mm:ss.ssssssZ，日期和时间戳格式参照[ISO-8601](https://www.iso.org/iso-8601-date-and-time-format.html)，如：2023-06-28T08:56:33.710000Z。 |
   
 表15token.assumed_by.user.domain 
| 参数   | 参数类型   | 描述          |
|:---|:---|:---|
| name | String | 被委托方B的账号名称。 |
| id   | String | 被委托方B的账号ID。 |
   
 表16token.catalog 
| 参数                                                                                                 | 参数类型             | 描述       |
|:---|:---|:---|
| [endpoints] | Array of objects | 终端节点。    |
| id                                                                                                 | String           | 服务ID。    |
| name                                                                                               | String           | 服务名称。    |
| type                                                                                               | String           | 该接口所属服务。 |
   
 表17token.catalog.endpoints 
| 参数        | 参数类型   | 描述                                         |
|:---|:---|:---|
| id        | String | 终端节点ID。                                    |
| interface | String | 接口类型，描述接口在该终端节点的可见性。值为"public"，表示该接口为公开接口。 |
| region    | String | 终端节点所属区域。                                  |
| region_id | String | 终端节点所属区域ID。                                |
| url       | String | 终端节点的URL。                                  |
   
 表18token.domain 
| 参数   | 参数类型   | 描述         |
|:---|:---|:---|
| name | String | 委托方A的账号名称。 |
| id   | String | 委托方A的账号ID。 |
   
 表19token.project 
| 参数                                                                             | 参数类型   | 描述         |
|:---|:---|:---|
| name                                                                           | String | 委托方A的项目名称。 |
| id                                                                             | String | 委托方A的项目ID。 |
| [domain] | Object | 委托方A的账号信息。 |
   
 表20token.project.domain 
| 参数   | 参数类型   | 描述         |
|:---|:---|:---|
| name | String | 委托方A的账号名称。 |
| id   | String | 委托方A的账号ID。 |
   
 表21token.roles 
| 参数   | 参数类型   | 描述                   |
|:---|:---|:---|
| name | String | 权限名称。                |
| id   | String | 权限ID。默认显示为0，非真实权限ID。 |
   
 表22token.user 
| 参数                                                                          | 参数类型   | 描述           |
|:---|:---|:---|
| name                                                                        | String | 委托方A账号名/委托名。 |
| id                                                                          | String | 委托ID。        |
| [domain] | Object | 委托方A的账号信息。   |
   
 表23token.user.domain 
| 参数   | 参数类型   | 描述         |
|:---|:---|:---|
| id   | String | 委托方A的账号ID。 |
| name | String | 委托方A的账号名称。 |
   
#### 响应示例
**状态码为 201 时:**
创建成功。
示例1：由被委托方B（账号名为IAMDomainB）中的IAM用户B（用户名IAMUserB，请求头中的X-Auth-Token字段需要填写IAMUserB的用户token，且该token需要具有Agent Operator权限），获取委托方A（账号名为IAMDomainA）创建的委托名为IAMAgency，作用范围为委托方A整个账号的token。
示例2：由被委托方B（账号名为IAMDomainB）中的IAM用户B（用户名IAMUserB，请求头中的X-Auth-Token字段需要填写IAMUserB的用户token，且该token需要具有Agent Operator权限），获取委托方A（账号名为IAMDomainA）创建的委托名为IAMAgency，作用范围为委托方A的项目"cn-north-1"，且返回的响应体中将不显示catalog信息的token。
- 示例 1
  ```
  响应Header参数：
  X-Subject-Token:MIIatAYJKoZIhvcNAQcCoIIapTCCGqECAQExDTALB...
  ```
  ```
  响应Body参数：
  {
      "token": {
          "expires_at": "2020-01-05T05:05:17.429000Z",
          "methods": [
              "assume_role"
          ],
          "catalog": [
              {
                  "endpoints": [
                      {
                          "id": "33e1cbdd86d34e89a63cf8ad16a5f49f",
                          "interface": "public",
                          "region": "*",
                          "region_id": "*",
                          "url": "https://iam.myhuaweicloud.com/v3.0"
                      }
                  ],
                  "id": "100a6a3477f1495286579b819d399e36",
                  "name": "iam",
                  "type": "iam"
              }
          ],
          "domain": {
              "id": "d78cbac186b744899480f25bd022f468",
              "name": "IAMDomainA"
          },
          "roles": [
              {
                  "id": "0",
                  "name": "op_gated_eip_ipv6"
              },
              {
                  "id": "0",
                  "name": "op_gated_rds_mcs"
              }
          ],
          "issued_at": "2020-01-04T05:05:17.429000Z",
          "user": {
              "domain": {
                  "id": "d78cbac186b744899480f25bd022f468",
                  "name": "IAMDomainA"
              },
              "id": "0760a9e2a60026664f1fc0031f9f205e",
              "name": "IAMDomainA/IAMAgency"
          },
          "assumed_by": {
              "user": {
                  "domain": {
                      "id": "a2cd82a33fb043dc9304bf72a0f38f00",
                      "name": "IAMDomainB"
                  },
                  "id": "0760a0bdee8026601f44c006524b17a9",
                  "name": "IAMUserB",
                  "password_expires_at": ""
              }
          }
      }
  }
  ```
  
- 示例 2
  ```
  响应Header参数：
  X-Subject-Token:MIIatAYJKoZIhvcNAQcCoIIapTCCGqECAQExDTALB...
  ```
  ```
  响应Body参数：
  {
      "token": {
          "expires_at": "2020-01-05T06:49:28.094000Z",
          "methods": [
              "assume_role"
          ],
          "catalog": [],
          "roles": [
              {
                  "id": "0",
                  "name": "op_gated_eip_ipv6"
              },
              {
                  "id": "0",
                  "name": "op_gated_rds_mcs"
              }
          ],
          "project": {
              "domain": {
                  "id": "d78cbac186b744899480f25bd022f468",
                  "name": "IAMDomainA"
              },
              "id": "aa2d97d7e62c4b7da3ffdfc11551f878",
              "name": "cn-north-1"
          },
          "issued_at": "2020-01-04T06:49:28.094000Z",
          "user": {
              "domain": {
                  "id": "d78cbac186b744899480f25bd022f468",
                  "name": "IAMDomainA"
              },
              "id": "0760a9e2a60026664f1fc0031f9f205e",
              "name": "IAMDomainA/IAMAgency"
          },
          "assumed_by": {
              "user": {
                  "domain": {
                      "id": "a2cd82a33fb043dc9304bf72a0f38f00",
                      "name": "IAMDomainB"
                  },
                  "id": "0760a0bdee8026601f44c006524b17a9",
                  "name": "IAMUserB",
                  "password_expires_at": ""
              }
          }
      }
  }
  ```
  
**状态码为 400 时:**
参数无效。
```
{
    "error": {
        "code": 400,
        "message": "The request body is invalid",
        "title": "Bad Request"
    }
}
```
**状态码为 401 时:**
认证失败。
```
{
    "error": {
        "code": 401,
        "message": "The X-Auth-Token is invalid!",
        "title": "Unauthorized"
    }
}
```
**状态码为 403 时:**
没有操作权限。
- 可能原因：被委托方B中用户B的用户token（即X-Auth-Token填写的token）缺少Agent Operator权限，请添加权限。
```
{
    "error": {
        "code": 403,
        "message": "You have no right to do this action",
        "title": "Forbidden"
    }
}
```
#### 返回值
| 返回值 | 描述                                                                                                                                |
|:---|:---|
| 201 | 创建成功。                                                                                                                             |
| 400 | 参数无效。                                                                                                                             |
| 401 | 认证失败。                                                                                                                             |
| 403 | 没有操作权限。 可能原因：被委托方B中用户B的用户token（即X-Auth-Token填写的token）缺少Agent Operator权限，请添加权限。 |
| 404 | 未找到相应的资源。                                                                                                                         |
| 500 | 内部服务错误。                                                                                                                           |
| 503 | 服务不可用。                                                                                                                            |
   
#### 错误码
无
