# 自定义模板鉴权使用说明
#### 使用说明
图1自定义模板鉴权流程图   
![](https://support.huaweicloud.com/usermanual-iothub/figure/zh-cn_image_0000001910644465.png "点击放大")
#### 操作步骤
1. 创建鉴权模板：进入设备接入控制台左侧导航栏，选择"设备 \> 自定义鉴权"，单击"自定义模板"，单击"创建鉴权模板"。本示例演示使用的鉴权模板与[平台默认鉴权方式](https://support.huaweicloud.com/api-iothub/iot_06_v5_3009.html)一致。
   
   图2自定义鉴权-创建鉴权模板   
   ![](https://support.huaweicloud.com/usermanual-iothub/figure/zh-cn_image_0000001981501733.png "点击放大")
   模板整体内容如下：
   ```
   {
     "template_name": "system-default-auth",
     "description": "华为云IoTDA系统默认鉴权模板示例",
     "status": "ACTIVE",
     "template_body": {
       "parameters": {
         "iotda::mqtt::client_id": {
           "type": "String"
         },
         "iotda::mqtt::username": {
           "type": "String"
         },
         "iotda::device::secret": {
           "type": "String"
         }
       },
       "resources": {
         "device_id": {
           "Ref": "iotda::mqtt::username"
         },
         "timestamp": {
           "type": "FORMAT",
           "pattern": "yyyyMMddHH",
           "value": {
             "Fn::SubStringAfter": [
               "${iotda::mqtt::client_id}",
               "_0_1_"
             ]
           }
         },
         "password": {
           "Fn::HmacSHA256": [
             "${iotda::device::secret}",
             {
               "Fn::SubStringAfter": [
                 "${iotda::mqtt::client_id}",
                 "_0_1_"
               ]
             }
           ]
         }
       }
     }
   }
   ```
   表1鉴权模板参数信息 
   | 参数            | 参数名称      | 是否必填 | 描述                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
   |:---|:---|:---|:---|
   | template_name | 模板名称     | 是     | **参数说明：**鉴权模板名称。 **取值范围：**单个用户下模板名称不能重复，长度不超过128，只允许字母、数字、下划线（_）、连接符（-）的组合。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
   | description  | 描述        | 否    | **参数说明** **：**鉴权模板的描述信息。 **取值范围：**长度不超过2048，只允许中文、字母、数字、以及_?'#().,\&%@!-等字符的组合。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |
   | status        | 状态       | 否      | **参数说明** **：**是否激活该模板，一个用户下只能有一个已激活状态的模板。 **默认值：**未激活。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
   | parameters  | 参数      | 是   | **参数说明** **：**平台预定义的MQTT连接参数列表，当设备使用密码认证时模板必须包含设备原始密钥参数（iotda::device::secret）。 平台预定义了如下参数： iotda::mqtt::client_id ：mqtt连接参数三元组中的Client Id iotda::mqtt::username ：mqtt连接参数三元组中的User Name iotda::certificate::country : 设备证书（国家/地区,C ） iotda::certificate::organization : 设备证书（组织,O） iotda::certificate::organizational_unit : 设备证书（组织单位,OU） iotda::certificate::distinguished_name_qualifier : 设备证书（可辨别名称限定符,dnQualifier） iotda::certificate::state_name : 设备证书（省市,ST） iotda::certificate::common_name : 设备证书（公用名,CN） iotda::certificate::serial_number : 设备证书（序列号,serialNumber） iotda::device::secret ：表示设备原始密钥 |
   | device_id     | 设备ID函数    | 是      | **参数说明** **：**设备ID取值函数，JSON格式，平台通过解析该函数获取对应设备信息。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
   | timestamp    | 是否开启时间戳校验  | 否    | **参数说明** **：**是否校验设备连接信息中的时间戳，如果设备连接参数（clientId、username）中包含时间戳建议开启校验。开启校验平台会对比设备携带时间戳与平台系统时间，若设备时间戳加一小时小于平台系统时间则校验失败。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
   | type         | 时间戳类型   | 否  | **参数说明** **：** UNIX：表示时间戳格式为Unix时间戳，长整型，单位秒。 FORMAT：格式化时间戳类型，比如：2024-03-28 11:47:39、2024/03/28 03:49:13                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |
   | pattern      | 时间戳格式    | 否     | **参数说明** **：**时间格式模板，时间戳类型为FORMAT时必填，具体字符含义如下： y：年 M：月 d：日 H：时 m：分 s：秒 S：毫秒 示例：yyyy-MM-dd HH:mm:ss、yyyy/MM/dd HH:mm:ss                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
   | value         | 时间戳取值函数 | 否   | **参数说明** **：**开启时间戳校验后必填，设备时间戳获取函数，平台通过执行该函数获取设备建链时的时间戳。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
   | password     | MQTT密码函数 | 否  | **参数说明** **：** 密码函数，当设备认证类型为密钥认证时必填，且模板参数中必须包含设备原始密钥参数（iotda::device::secret），当设备为证书认证时可不填。设备认证类型参考[注册单个设备](https://support.huaweicloud.com/usermanual-iothub/iot_01_0031.html)。平台把设备原始密钥等参数填入函数计算结果，若函数结果与设备建链携带的password参数一致则认证通过，否则认证失败。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
      
   
   
2. 选择设备调试模板：单击"调试"选择一个设备进行调试，输入mqtt连接参数后单击"调试"查看调试结果。注意：使用系统标准格式的clientId平台会校验username参数与clientId前缀一致。 
   图3自定义模板-调试   
   ![](https://support.huaweicloud.com/usermanual-iothub/figure/zh-cn_image_0000001950382316.png "点击放大")
   设备调试成功后单击"激活"启用模板，一旦激活模板所有设备鉴权将使用该模板，且已激活状态下的模板不能修改，后续修改模板建议新创建一个副本模板进行调试，确认无误后进行模板切换。
   
   
   
3. 使用mqtt.fx工具模拟设备真实建链，在控制台查看设备处于在线状态，Broker Address填[平台接入地址](https://support.huaweicloud.com/iothub_faq/iot_faq_01006.html)，选择"总览 \> 接入信息"，端口使用8883端口。
   
   图4设备建链   
   ![](https://support.huaweicloud.com/usermanual-iothub/figure/zh-cn_image_0000002586207731.png "点击放大")
   图5设备列表-设备在线   
   ![](https://support.huaweicloud.com/usermanual-iothub/figure/zh-cn_image_0000001950367902.png "点击放大")
   
   
 
