

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 授权方故障排除
<a name="custom-auth-troubleshooting"></a>

 本主题介绍可能导致自定义身份验证工作流中出现故障的常见问题以及解决这些问题的步骤。要最有效地解决问题，请启用 CloudWatch 日志 AWS IoT Core 并将日志级别设置为 **DEBUG**。您可以在 AWS IoT Core 控制台中启用 CloudWatch 日志（[https://console.aws.amazon.com/iot/](https://console.aws.amazon.com/iot/)）。有关启用和配置适用于 AWS IoT Core的日志的更多信息，请参阅 [配置 AWS IoT 日志](configure-logging.md)。

**注意**  
如果您将日志级别长时间保持在 **DEBUG**，则 CloudWatch 可能会存储大量的日志数据。这可能会增加您的 CloudWatch 费用。考虑使用基于资源的日志记录来增加仅针对特定事物组中设备的详细程度。有关基于资源的日志记录的更多信息，请参阅 [配置 AWS IoT 日志](configure-logging.md)。此外，当您完成故障排除时，将日志级别降到详细程度较低的级别。

在您开始故障排除之前，请查看 [了解自定义身份验证工作流](custom-authorizer.md) 获取自定义身份验证过程的高度概要视图。这有助于您了解应该在何处查找问题的根源。

本主题将讨论以下两个方面供您调查。
+ 与授权方 Lambda 函数相关的问题。
+ 与您的设备相关的问题。

## 检查授权方的 Lambda 函数中是否存在问题
<a name="custom-auth-troubleshooting-lambda"></a>

执行以下步骤以确保设备的连接尝试正在调用 Lambda 函数。

1. 验证哪个 Lambda 函数与您的授权方相关联。

   您可以通过调用 [DescribeAuthorizer](https://docs.aws.amazon.com/iot/latest/apireference/API_DescribeAuthorizer.html)API 或在 AWS IoT Core 控制台的 “**安全**” 部分中单击所需的授权者来执行此操作。

1. 检查 Lambda 函数的调用指标。为此，请执行以下步骤。

   1. 打开 AWS Lambda 控制台 ([https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/))，然后选择与您的授权方关联的功能。

   1. 选择**监控**选项卡并查看与您的问题相关的时间范围的指标。

1. 如果您没有看到任何调用，请验证是否 AWS IoT Core 有权调用您的 Lambda 函数。如果您看到调用，则跳到下一步。执行以下步骤以验证 Lambda 函数是否具有所需的权限。

   1. 在 AWS Lambda 控制台中为您的函数选择 “**权限**” 选项卡。

   1. 在页面底部找到**基于资源的策略**部分。如果您的 Lambda 函数具有所需的权限，则策略类似于以下示例。  
****  

      ```
      {
        "Version":"2012-10-17",		 	 	 
        "Id": "default",
        "Statement": [
          {
            "Sid": "Id123",
            "Effect": "Allow",
            "Principal": {
              "Service": "iot.amazonaws.com"
            },
            "Action": "lambda:InvokeFunction",
            "Resource": "arn:aws:lambda:us-east-1:111111111111:function:FunctionName",
            "Condition": {
              "ArnLike": {
                "AWS:SourceArn": "arn:aws:iot:us-east-1:111111111111:authorizer/AuthorizerName"
              },
              "StringEquals": {
                "AWS:SourceAccount": "111111111111"
              }
            }
          }
        ]
      }
      ```

   1. 此政策将您的职能`InvokeFunction`权限授予 AWS IoT Core 委托人。如果您没有看到它，则必须使用 [AddPermission](https://docs.aws.amazon.com/lambda/latest/dg/API_AddPermission.html)API 进行添加。以下示例说明如何使用 AWS CLI执行此操作。

      ```
      aws lambda add-permission --function-name FunctionName --principal iot.amazonaws.com --source-arn AuthorizerARn --statement-id Id-123 --action "lambda:InvokeFunction"
      ```

1. 如果您看到调用，请验证没有错误。错误可能表明 Lambda 函数未正确处理 AWS IoT Core 发送给它的连接事件。

   有关在 Lambda 函数中处理事件的信息，请参阅 [定义您的 Lambda 函数](custom-auth-lambda.md)。您可以使用 AWS Lambda 控制台 ([https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/)) 中的测试功能对函数中的测试值进行硬编码，以确保该函数正确处理事件。

1. 如果您看到没有错误的调用，但您的设备无法连接（或发布、订阅和接收消息），则问题可能是 Lambda 函数返回的策略未授予设备尝试执行的操作的权限。执行以下步骤以确定函数返回的策略是否存在任何问题。

   1. 使用 Amazon CloudWatch Logs Insights 查询在短时间内扫描日志，以检查是否存在故障。以下示例查询按时间戳对事件进行排序并查找失败。

      ```
      display clientId, eventType, status, @timestamp | sort @timestamp desc | filter status = "Failure"    
      ```

   1. 更新您的 Lambda 函数以记录它返回的数据 AWS IoT Core 以及触发该函数的事件。您可以使用这些日志检查函数创建的策略。

1. 如果您看到调用并没有错误，但您的设备无法连接（或发布、订阅和接收消息），则另一个原因可能是 Lambda 函数超出了超时限制。自定义授权方的 Lambda 函数超时限制为 5 秒。您可以在 CloudWatch 日志或指标中查看函数持续时间。

## 调查设备问题
<a name="custom-auth-troubleshooting-investigate"></a>

如果您发现调用 Lambda 函数或函数返回的策略不存在任何问题，请查找设备连接尝试是否存在问题。格式错误的连接请求可能导致 AWS IoT Core 无法触发您的授权者。TLS 层和应用程序层均可能出现连接问题。

**TLS 层可能存在的问题：**
+ 客户必须在所有自定义身份验证请求中传递主机名标头（HTTP、MQTT WebSockets）或服务器名称指示 TLS 扩展（HTTP、MQTT over WebSockets、MQTT）。在这两种情况下，传递的值都必须与您账户 AWS IoT Core 的数据端点之一匹配。这些是执行以下 CLI 命令时返回的端点。
  + `aws iot describe-endpoint --endpoint-type iot:Data-ATS`
  + `aws iot describe-endpoint --endpoint-type iot:Data`（适用于旧版 VeriSign 终端节点）
+ 在 MQTT 连接中使用自定义身份验证的设备还必须发送应用程序层协议协商（ALPN）TLS 扩展，并具有值 `mqtt`。
+ 自定义身份验证当前仅在端口 443 上可用。

**应用层可能存在的问题：**
+ 如果启用了签名（`signingDisabled` 字段在您的授权方为 false），请查找以下签名问题。
  + 请确保使用 `x-amz-customauthorizer-signature` 标头或查询字符串参数传递令牌签名。
  + 确保服务没有签署令牌以外的值。
  + 请确保使用您在授权方的 `token-key-name` 字段中指定的标头或查询参数中传递令牌。
+ 请确保您使用 `x-amz-customauthorizer-name` 标头或查询字符串参数传递的授权方名称是有效的，或者您已为您的账户定义了默认授权方。