# 获取IAM用户Token（使用密码+虚拟MFA）- KeystoneCreateUserTokenByPasswordAndMfa
#### 功能介绍
该接口可以用于**通过用户名/密码+虚拟MFA** 的方式进行认证，在IAM用户**开启了的登录保护功能，并选择通过虚拟MFA验证时**获取IAM用户Token。Token是系统颁发给用户的访问令牌，承载用户的身份、权限等信息。调用IAM以及其他云服务的接口时，可以使用本接口获取的Token进行鉴权。
该接口可以使用全局区域的Endpoint和其他区域的Endpoint调用。IAM的Endpoint请参见：[地区和终端节点](https://developer.huaweicloud.com/endpoint?IAM)。
接口使用导航：
[IAM用户获取Token]
[判断当前账号是华为账号还是华为云账号]
[华为账号获取Token]
[华为云账号获取Token]
[第三方系统用户获取Token]
[Token有效期说明]
[获取Token常见问题]
[其他相关操作]
- **IAM用户获取Token**
  无特殊要求，请按照[请求参数]说明获取Token。
  
- **判断当前账号是华为账号还是华为云账号**
  华为账号不支持直接获取账号Token，排查是否为华为账号请参见：[怎么知道当前登录华为云使用的是"华为账号" 还是"华为云账号"？](https://support.huaweicloud.com/account_faq/faq_id_0009.html)
  
- **华为账号获取Token**
  华为账号获取token请参见以下步骤：[创建一个IAM用户](https://support.huaweicloud.com/usermanual-iam/iam_02_0001.html)，[授予该用户必要的权限](https://support.huaweicloud.com/usermanual-iam/iam_03_0001.html)，使用创建的IAM用户，获取IAM用户Token。
  
- **华为云账号获取Token**
  无特殊要求，请按照[请求参数]说明获取Token。
  
- **第三方系统用户获取Token**
  如果您是第三方系统用户，直接使用联邦认证的用户名和密码获取Token，系统会提示密码错误。请先在华为云的登录页面，通过"忘记密码"功能，设置**华为云账号** **密码**。
  
- **Token有效期说明**
  - Token的有效期为**24小时**。建议进行缓存，避免频繁调用。使用Token前请确保Token离过期有足够的时间，防止调用API的过程中Token过期导致调用API失败。重新获取Token，不影响已有Token有效性。
  
  - 如果在Token有效期内进行如下操作，**当前Token或该账号下Token最长30分钟失效。**
    - 删除/停用IAM用户。
    
    - 修改IAM用户密码、访问密钥。
    
    - IAM用户权限发生变化（如账号欠费无法访问云服务、申请公测通过、IAM用户权限被修改等）。账号欠费、申请或退出公测、账号下任意用户组权限发生变化会导致该账号下所有用户已获取的Token失效。
     
  
  - 使用Token调用云服务API时， 返回"**The token must be updated**"，则Token过期或失效，需要客户端重新获取Token。
   
- **获取Token常见问题**
  用户名或密码错误：请排查输入的用户名和密码是否正确。用户名密码正确但是仍旧报错，请排查[当前获取Token的账号是否为华为账号]，华为账号不支持直接获取Token，请新建IAM用户并授权，使用IAM用户获取Token。
  没有API访问权限：调用API前，请确保已[开启编程访问](https://support.huaweicloud.com/usermanual-iam/iam_02_0002.html#section0)。
  

- **相关操作**
  - 如果需要获取具有Security Administrator权限的Token，请参见：[如何获取Security Administrator权限的Token](https://support.huaweicloud.com/iam_faq/iam_01_0608.html)。
  
  - 通过Postman获取用户Token示例请参见：[如何通过Postman获取用户Token](https://support.huaweicloud.com/iam_faq/iam_01_034.html)。
   
 
#### 调试
您可以在[API Explorer](https://console.huaweicloud.com/apiexplorer/#/openapi/IAM/doc?api=KeystoneCreateUserTokenByPasswordAndMfa)中调试该接口。
#### 授权信息
当前API调用无需策略权限。
#### URI
POST /v3/auth/tokens
表1Query参数 
| 参数        | 是否必选 | 参数类型    | 描述                                                    |
|:---|:---|:---|:---|
| nocatalog | 否     | String | 如果设置该参数，返回的响应体中将不显示catalog信息。任何非空字符串都将解释为true，并使该字段生效。 |
   
 #### 请求参数
表2请求Header参数 
| 参数          | 是否必选 | 参数类型 | 描述                                       |
|:---|:---|:---|:---|
| Content-Type | 是    | String | 该字段内容填为"application/json;charset=utf8"。 |
   
表3请求Body参数 
| 参数                                                             | 是否必选 | 参数类型    | 描述     |
|:---|:---|:---|:---|
| [auth] | 是   | Object | 认证信息。 |
   
 表4auth 
| 参数                                                                         | 是否必选 | 参数类型  | 描述                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
|:---|:---|:---|:---|
| [identity] | 是    | Object | 认证参数。                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
| [scope]         | 是    | Object  | Token的使用范围，取值为project或domain，二选一即可。 说明： - **如果您将scope设置为domain，该Token适用于全局级服务；如果将scope设置为project，该Token适用于项目级服务。**  - **如果您将scope同时设置为project和domain，将以project参数为准，获取到项目级服务的Token。**  - **如果您将scope置空，将获取到全局级服务的Token。** **建议您按需要填写** **Token使用范围。**   |
   
 表5auth.identity 
| 参数                                                                         | 是否必选 | 参数类型            | 描述                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |
|:---|:---|:---|:---|
| methods                                                                     | 是     | Array of strings | 认证方法，该字段内容为\["password", "totp"\]。 取值范围： - password  - totp                                                                                                                                                                                                                                                                                                                                                                     |
| [password] | 是      | Object           | 用户密码认证信息。 说明： - user.name和user.domain.name可以在界面控制台"我的凭证"中查看，具体获取方法请参见：[获取账号、IAM用户、项目、用户组、区域、委托的名称和ID](https://support.huaweicloud.com/api-iam/iam_17_0002.html)。  - 该接口提供了锁定机制用于防止暴力破解，调用时，请确保用户名密码正确，输错一定次数（[管理员](https://support.huaweicloud.com/usermanual-iam/iam_01_0001.html)可设置该规则，方法请参见：[账号锁定策略](https://support.huaweicloud.com/usermanual-iam/iam_01_0704.html)）将被锁定。   |
| [totp] | 是     | Object           | totp认证信息，仅在您已开启虚拟MFA方式的登录保护功能时需要填写该参数。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
   
 表6auth.identity.password 
| 参数                                                                          | 是否必选 | 参数类型   | 描述                  |
|:---|:---|:---|:---|
| [user] | 是  | Object | 需要获取Token的IAM用户信息。 |
   
 表7auth.identity.password.user 
| 参数                                                                                  | 是否必选 | 参数类型     | 描述                                                                                                                                                                                                                                                                                                                  |
|:---|:---|:---|:---|
| [domain] | 是   | Object  | IAM用户所属账号信息。了解[账号与IAM用户的关系](https://support.huaweicloud.com/productdesc-iam/iam_01_0023.html#section2)。                                                                                                                                                                                                               |
| name                                                                              | 是   | String  | IAM用户名。                                                                                                                                                                                                                                                                                                                 |
| password                                                                            | 是    | String | IAM用户的登录密码。 说明： - 务必保证密码输入正确，避免获取Token失败。  - 如果您是第三方系统用户，直接使用联邦认证的用户名和密码获取Token，系统会提示密码错误。请在华为云的登录页面，通过"忘记密码"功能，设置**华为云账号** **密码**，并在password中输入新设置的密码。   |
   
 表8auth.identity.password.user.domain 
| 参数 | 是否必选 | 参数类型   | 描述                                                                                                            |
|:---|:---|:---|:---|
| name | 是    | String | IAM用户所属账号名称，获取方式请参见：[获取账号、IAM用户、项目、用户组、区域、委托的名称和ID](https://support.huaweicloud.com/api-iam/iam_17_0002.html)。 |
   
 表9auth.identity.totp 
| 参数                                                                               | 是否必选 | 参数类型    | 描述                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
|:---|:---|:---|:---|
| [user] | 是      | Object | IAM用户信息，要求该IAM用户已开启登录保护，并选择以虚拟MFA方式进行身份验证。控制台开启/关闭登录保护方法请参见：[登录保护](https://support.huaweicloud.com/usermanual-iam/iam_07_0002.html#section1)，API开启登录保护的方法请参见：[修改IAM用户的登录保护状态信息](https://support.huaweicloud.com/api-iam/iam_08_0021.html)。在使用API方式开启登录保护并设置为虚拟MFA验证时，该API的verification_method参数可以选择"console_vmfa"或者"vmfa"：在使用"console_vmfa"时仅控制台登录才需要输入虚拟MFA验证码，您仍然可以使用"password"方式[获取IAM用户Token](https://support.huaweicloud.com/api-iam/iam_30_0001.html)；在使用"vmfa"时，您不仅在控制台登录时需要输入虚拟MFA验证码，而且只能通过"password+totp"方式[获取IAM用户Token](https://support.huaweicloud.com/api-iam/iam_03_0006.html)。 |
   
 表10auth.identity.totp.user 
| 参数     | 是否必选 | 参数类型  | 描述                                                                                                                                                                     |
|:---|:---|:---|:---|
| id        | 是     | String | 已开启虚拟MFA方式的登录保护的IAM用户ID。                                                                                                                                               |
| passcode | 是     | String | 虚拟MFA验证码，在MFA应用程序中获取动态验证码，获取方法请参见：[如何获取虚拟MFA验证码](https://support.huaweicloud.com/iam_faq/iam_01_0001.html)。 说明： 务必保证验证码输入正确，避免获取Token失败。 |
   
 表11auth.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，二选一即可。        |
   
 表12auth.scope.domain 
| 参数  | 是否必选 | 参数类型       | 描述                                                                                                                                     |
|:---|:---|:---|:---|
| id | 否    | String   | IAM用户所属账号ID，获取方式请参见：[获取账号、IAM用户、项目、用户组、区域、委托的名称和ID](https://support.huaweicloud.com/api-iam/iam_17_0002.html)。    |
| name | 否    | String | IAM用户所属账号名称，获取方式请参见：[获取账号、IAM用户、项目、用户组、区域、委托的名称和ID](https://support.huaweicloud.com/api-iam/iam_17_0002.html)。 |
   
 表13auth.scope.project 
| 参数  | 是否必选 | 参数类型    | 描述                                                                                                                                           |
|:---|:---|:---|:---|
| id    | 否   | String | IAM用户所属账号的项目id，获取方式请参见：[获取账号、IAM用户、项目、用户组、区域、委托的名称和ID](https://support.huaweicloud.com/api-iam/iam_17_0002.html)。 |
| name | 否    | String    | IAM用户所属账号的项目名称，获取方式请参见：[获取账号、IAM用户、项目、用户组、区域、委托的名称和ID](https://support.huaweicloud.com/api-iam/iam_17_0002.html)。   |
   
#### 请求示例
- 示例1：获取IAM用户名为"IAMUser"，密码为"IAMPassword"，所属账号名为"IAMDomain"，作用范围为整个账号的Token。IAM用户名、所属账号名可以在界面控制台"我的凭证"中查看，具体获取方法请参见：[获取账号、IAM用户、项目、用户组、区域、委托的名称和ID](https://support.huaweicloud.com/api-iam/iam_17_0002.html)。
  ```
  POST https://iam.myhuaweicloud.com/v3/auth/tokens
  ```
  ```
  {
      "auth": {
          "identity": {
              "methods": [
                  "password",
                  "totp"
              ],
              "password": {
                  "user": {
                      "name": "IAMUser",                            //IAM用户名
                      "password": "IAMPassword",                   //IAM用户密码
                      "domain": {
                          "name": "IAMDomain"                      //IAM用户所属账号名
                      }
                  }
              },
              "totp": {
                  "user": {
                      "id": "7116d09f88fa41908676fdd4b039e...",  //IAM用户ID
                      "passcode": "******"                           //虚拟MFA验证码
                  }
              }
          },
          "scope": {
              "domain": {
                  "name": "IAMDomain"                                 //IAM用户所属账号名
              }
          }
      }
  }
  ```
  
- 示例2：获取IAM用户名为"IAMUser"，密码为"IAMPassword"，所属账号名为"IAMDomain"，作用范围为项目"cn-north-1"，且返回的响应体中将不显示catalog信息的Token。IAM用户名、所属账号名可以在界面控制台"我的凭证"中查看，具体获取方法请参见：[获取账号、IAM用户、项目、用户组、区域、委托的名称和ID](https://support.huaweicloud.com/api-iam/iam_17_0002.html)。
  ```
  POST https://iam.myhuaweicloud.com/v3/auth/tokens?nocatalog=true
  ```
  ```
  {
      "auth": {
          "identity": {
              "methods": [
                  "password",
                  "totp"
              ],
              "password": {
                  "user": {
                      "name": "IAMUser",                            //IAM用户名
                      "password": "IAMPassword",                   //IAM用户密码
                      "domain": {
                          "name": "IAMDomain"                      //IAM用户所属账号名
                      }
                  }
              },
              "totp": {
                  "user": {
                      "id": "7116d09f88fa41908676fdd4b039e...",  //IAM用户ID
                      "passcode": "******"                           //虚拟MFA验证码
                  }
              }
          },
          "scope": {
              "project": {
                  "name": "cn-north-1"                                //项目名称
              }
          }
      }
  }
  ```
  
 
#### 响应参数
表14响应Header参数 
| 参数                | 参数类型   | 描述          |
|:---|:---|:---|
| X-Subject-Token | String | 签名后的Token。 |
   
表15响应Body参数 
| 参数                                                               | 参数类型    | 描述           |
|:---|:---|:---|
| [token] | Object | 获取到的Token信息。 |
   
 表16token 
| 参数                                                                             | 参数类型              | 描述                                                                                                                                                                                               |
|:---|:---|:---|
| [catalog] | Array of objects  | 服务目录信息。                                                                                                                                                                                          |
| [domain]        | Object              | 获取Token的IAM用户所属的账号信息。如果获取Token时请求体中scope参数设置为domain，则返回该字段。                                                                                                                                   |
| 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。 |
| mfa_authn_at                                                                                           | String                                    | MFA验证时间。 说明： 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。 |
| methods                                                                          | Array of strings | 获取Token的方式。                                                                                                                                                                                      |
| [project]        | Object           | 获取Token的IAM用户所属账号的项目信息。如果获取Token时请求体中scope参数设置为project，则返回该字段。                                                                                                                                 |
| [roles]    | Array of objects    | Token的权限信息。                                                                                                                                                                                    |
| [user]           | Object             | 获取Token的IAM用户信息。                                                                                                                                                                               |
   
 表17token.catalog 
| 参数                                                                                                 | 参数类型                | 描述        |
|:---|:---|:---|
| [endpoints] | Array of objects | 终端节点。  |
| id                                                                                               | String             | 服务ID。   |
| name                                                                                              | String            | 服务名称。     |
| type                                                                                             | String            | 该接口所属服务。 |
   
 表18token.catalog.endpoints 
| 参数        | 参数类型     | 描述                                            |
|:---|:---|:---|
| id        | String  | 终端节点ID。                                       |
| interface   | String | 接口类型，描述接口在该终端节点的可见性。值为"public"，表示该接口为公开接口。 |
| region      | String  | 终端节点所属区域。                                   |
| region_id | String    | 终端节点所属区域ID。                                  |
| url        | String    | 终端节点的URL。                                   |
   
 表19token.domain 
| 参数   | 参数类型    | 描述    |
|:---|:---|:---|
| name | String  | 账号名称。 |
| id | String | 账号ID。 |
   
 表20token.project 
| 参数                                                                              | 参数类型     | 描述        |
|:---|:---|:---|
| [domain] | Object | 项目所属账号信息。 |
| id                                                                              | String  | 项目ID。      |
| name                                                                           | String   | 项目名称。    |
   
 表21token.project.domain 
| 参数    | 参数类型      | 描述      |
|:---|:---|:---|
| id   | String | 账号ID。  |
| name | String | 账号名称。 |
   
 表22token.roles 
| 参数 | 参数类型     | 描述                     |
|:---|:---|:---|
| name  | String     | 权限名称。                 |
| id    | String | 权限ID。默认显示为0，非真实权限ID。 |
   
 表23token.user 
| 参数                                                                        | 参数类型     | 描述                                                                                                                                                                                                    |
|:---|:---|:---|
| name                                                                      | String   | IAM用户名。                                                                                                                                                                                               |
| id                                                                         | String   | IAM用户ID。                                                                                                                                                                                             |
| password_expires_at                                                      | String  | 密码过期时间，""表示密码不过期。 说明： 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。 |
| [domain] | Object | IAM用户所属的账号信息。                                                                                                                                                                                        |
   
 表24token.user.domain 
| 参数 | 参数类型     | 描述           |
|:---|:---|:---|
| name  | String | IAM用户所属账号名称。 |
| id  | String   | IAM用户所属账号ID。 |
   
#### 响应示例
**状态码为 201 时:**
创建成功。
- 示例 1：获取IAM用户名为"IAMUser"，密码为"IAMPassword"，所属账号名为"IAMDomain"，作用范围为整个账号的Token。
  ```
  响应Header参数（获取到的Token）：
  X-Subject-Token:MIIatAYJKoZIhvcNAQcCoIIapTCCGqECAQExDTALB...
  ```
  ```
  响应Body参数：
  {
      "token": {
          "expires_at": "2020-01-04T09:08:49.965000Z",
          "mfa_authn_at": "2020-01-03T09:08:49.965000Z",
          "methods": [
              "password",
              "totp"
          ],
          "catalog": [
              {
                  "endpoints": [
                      {
                          "id": "33e1cbdd86d34e89a63cf8ad16a5f...",
                          "interface": "public",
                          "region": "*",
                          "region_id": "*",
                          "url": "https://iam.myhuaweicloud.com/v3.0"
                      }
                  ],
                  "id": "100a6a3477f1495286579b819d399...",
                  "name": "iam",
                  "type": "iam"
              },
              {
                  "endpoints": [
                      {
                          "id": "29319cf2052d4e94bcf438b55d143...",
                          "interface": "public",
                          "region": "*",
                          "region_id": "*",
                          "url": "https://bss.sample.domain.com/v1.0"
                      }
                  ],
                  "id": "c6db69fabbd549908adcb861c7e47...",
                  "name": "bssv1",
                  "type": "bssv1"
              }
          ],
          "domain": {
              "id": "d78cbac186b744899480f25bd022f...",
              "name": "IAMDomain"
          },
          "roles": [
              {
                  "id": "0",
                  "name": "te_admin"
              },
              {
                  "id": "0",
                  "name": "secu_admin"
              },
              {
                  "id": "0",
                  "name": "te_agency"
              }
          ],
          "issued_at": "2020-01-03T09:08:49.965000Z",
          "user": {
              "domain": {
                  "id": "d78cbac186b744899480f25bd022f...",
                  "name": "IAMDomain"
              },
              "id": "7116d09f88fa41908676fdd4b039e...",
              "name": "IAMUser",
              "password_expires_at": ""
          }
      }
  }
  ```
  

- 示例 2：获取IAM用户名为"IAMUser"，密码为"IAMPassword"，所属账号名为"IAMDomain"，作用范围为项目"cn-north-1"，且返回的响应体中将不显示catalog信息的Token。
  ```
  响应Header参数（获取到的Token）：
  X-Subject-Token:MIIatAYJKoZIhvcNAQcCoIIapTCCGqECAQExDTALB...
  ```
  ```
  响应Body参数：
  {
      "token": {
          "expires_at": "2020-01-04T09:05:22.701000Z",
          "mfa_authn_at": "2020-01-03T09:05:22.701000Z",
          "methods": [
              "password",
              "totp"
          ],
          "catalog": [],
          "roles": [
              {
                  "id": "0",
                  "name": "te_admin"
              },
              {
                  "id": "0",
                  "name": "op_gated_OBS_file_protocol"
              },
              {
                  "id": "0",
                  "name": "op_gated_Video_Campus"
              }
          ],
          "project": {
              "domain": {
                  "id": "d78cbac186b744899480f25bd022f...",
                  "name": "IAMDomain"
              },
              "id": "aa2d97d7e62c4b7da3ffdfc11551f...",
              "name": "cn-north-1"
          },
          "issued_at": "2020-01-03T09:05:22.701000Z",
          "user": {
              "domain": {
                  "id": "d78cbac186b744899480f25bd022f...",
                  "name": "IAMDomain"
              },
              "id": "7116d09f88fa41908676fdd4b039e...",
              "name": "IAMUser",
              "password_expires_at": ""
          }
      }
  }
  ```
  
**状态码为 400 时:**
参数无效。
```
{
    "error": {
        "code": 400,
        "message": "The request body is invalid",
        "title": "Bad Request"
    }
}
```
**状态码为 401 时:**
认证失败。
- 如果您是第三方系统用户，直接使用联邦认证的用户名和密码获取Token，系统会提示密码错误。请在华为云的登录页面，通过"忘记密码"功能，设置**华为云账号** **密码**，并在password中输入新设置的密码。
- 如果您的华为云账号已升级为华为账号，直接使用华为账号名和密码获取Token，系统会提示密码错误。建议您为自己创建一个IAM用户，授予该用户必要的权限，获取IAM用户Token。
```
{
    "error": {
        "code": 401,
        "message": "The username or password is wrong.",
        "title": "Unauthorized"
    }
}
```
#### 返回值
| 返回值    | 描述        |
|:---|:---|
| 201    | 创建成功。   |
| 400    | 参数无效。     |
| 401   | 认证失败。    |
| 403 | 没有操作权限。   |
| 404   | 未找到相应的资源。 |
| 500    | 内部服务错误。   |
| 503  | 服务不可用。  |
   
#### 错误码
无
