更新时间:2024-04-19 GMT+08:00

获取委托Token

功能介绍

该接口可以用于获取委托方的token。

例如:A账号希望B账号管理自己的某些资源,所以A账号创建了委托给B账号,则A账号为委托方,B账号为被委托方。那么B账号可以通过该接口获取委托token。B账号仅能使用该token管理A账号的委托资源,不能管理自己账号中的资源。如果B账号需要管理自己账号中的资源,则需要获取自己的用户token。详情请参考:委托其他账号管理资源

token是系统颁发给用户的访问令牌,承载用户的身份、权限等信息。调用IAM以及其他云服务的接口时,可以使用本接口获取的token进行鉴权。

该接口可以使用全局区域的Endpoint和其他区域的Endpoint调用。IAM的Endpoint请参见:地区和终端节点

  • token的有效期为24小时,建议进行缓存,避免频繁调用。
  • 使用Token前请确保Token离过期有足够的时间,防止调用API的过程中Token过期导致调用API失败。

URI

POST /v3/auth/tokens

表1 Query参数

参数

是否必选

参数类型

描述

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

认证信息。

表4 auth

参数

是否必选

参数类型

描述

identity

Object

认证参数。

scope

Object

token的使用范围,需要填写委托方A的project或domain,填写其中任一即可。

说明:
  • 如果您将scope设置为domain,该Token适用于全局级服务;如果将scope设置为project,该Token适用于项目级服务。
  • 如果您将scope同时设置为project和domain,将以project参数为准,获取到项目级服务的Token。
  • 如果您将scope置空,将获取到全局级服务的Token。建议您按需要填写Token使用范围。
表5 auth.identity

参数

是否必选

参数类型

描述

methods

Array of strings

token的获取方式,该字段内容为["assume_role"]。

取值范围:

  • assume_role

assume_role

Object

assume_role的具体信息。

表6 auth.identity.assume_role

参数

是否必选

参数类型

描述

domain_id

String

委托方A的账号ID。“domain_id”与“domain_name”至少填写一个,建议选择“domain_id”。

委托方A可以参考获取账号、IAM用户、项目、用户组、区域、委托的名称和ID获取账号ID。

domain_name

String

委托方A的账号名称。“domain_id”与“domain_name”至少填写一个,建议选择“domain_id”。

您可以在IAM控制台委托列表中查看委托方A的账号名称。

agency_name

String

委托方A创建的委托名称,获取方式请参见:获取账号、IAM用户、项目、用户组、区域、委托的名称和ID

表7 auth.scope

参数

是否必选

参数类型

描述

domain

Object

取值为domain时,表示获取的Token可以作用于全局服务,全局服务不区分项目或区域,如OBS服务。如需了解服务作用范围,请参考系统权限。domain支持id和name,二选一即可,建议选择“domain_id”。

project

Object

取值为project时,表示获取的Token可以作用于项目级服务,仅能访问指定project下的资源,如ECS服务。如需了解服务作用范围,请参考系统权限。project支持id和name,二选一即可。

表8 auth.scope.domain

参数

是否必选

参数类型

描述

id

String

委托方A的账号ID,获取方式请参见:获取账号、IAM用户、项目、用户组、区域、委托的名称和ID。id和name,二选一即可。

name

String

委托方A的账号名,获取方式请参见:获取账号、IAM用户、项目、用户组、区域、委托的名称和ID。id和name,二选一即可。

表9 auth.scope.project

参数

是否必选

参数类型

描述

id

String

委托方A项目的ID,获取方式请参见:获取账号、IAM用户、项目、用户组、区域、委托的名称和ID。id和name,二选一即可。

name

String

委托方A项目的名称,获取方式请参见:获取账号、IAM用户、项目、用户组、区域、委托的名称和ID。id和name,二选一即可。

请求示例

  • 由被委托方B(账号名为IAMDomainB)中的IAM用户B(用户名IAMUserB,请求头中的X-Auth-Token字段需要填写IAMUserB的用户token,且该token需要具有Agent Operator权限),获取委托方A(账号名为IAMDomainA)创建的委托名为IAMAgency,作用范围为委托方A的项目“ap-southeast-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": "ap-southeast-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信息列表。

表12 token

参数

参数类型

描述

methods

Array of strings

获取token的方式。

expires_at

String

token到期时间。

说明:

UTC时间,格式为 YYYY-MM-DDTHH:mm:ss.ssssssZ,日期和时间戳格式参照 ISO-8601,如:2023-06-28T08:56:33.710000Z。

issued_at

String

token下发时间。

说明:

UTC时间,格式为 YYYY-MM-DDTHH:mm:ss.ssssssZ,日期和时间戳格式参照 ISO-8601,如: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所创建的委托的信息。

表13 token.assumed_by

参数

参数类型

描述

user

Object

被委托方B中IAM用户的用户信息。

表14 token.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,如:2023-06-28T08:56:33.710000Z。

表15 token.assumed_by.user.domain

参数

参数类型

描述

name

String

被委托方B的账号名称。

id

String

被委托方B的账号ID。

表16 token.catalog

参数

参数类型

描述

endpoints

Array of objects

终端节点。

id

String

服务ID。

name

String

服务名称。

type

String

该接口所属服务。

表17 token.catalog.endpoints

参数

参数类型

描述

id

String

终端节点ID。

interface

String

接口类型,描述接口在该终端节点的可见性。值为“public”,表示该接口为公开接口。

region

String

终端节点所属区域。

region_id

String

终端节点所属区域ID。

url

String

终端节点的URL。

表18 token.domain

参数

参数类型

描述

name

String

委托方A的账号名称。

id

String

委托方A的账号ID。

表19 token.project

参数

参数类型

描述

name

String

委托方A的项目名称。

id

String

委托方A的项目ID。

domain

Object

委托方A的账号信息。

表20 token.project.domain

参数

参数类型

描述

name

String

委托方A的账号名称。

id

String

委托方A的账号ID。

表21 token.roles

参数

参数类型

描述

name

String

权限名称。

id

String

权限ID。默认显示为0,非真实权限ID。

表22 token.user

参数

参数类型

描述

name

String

委托方A账号名/委托名。

id

String

委托ID。

domain

Object

委托方A的账号信息。

表23 token.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的项目“ap-southeast-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": "ap-southeast-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

服务不可用。

错误码