教程:为 Amazon IoT Core创建自定义授权方 - Amazon IoT Core
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

教程:为 Amazon IoT Core创建自定义授权方

本教程演示了使用 Amazon CLI创建、验证和使用自定义身份验证的步骤。或者,使用本教程,您可以借助 HTTP Publish API 使用 Postman 将数据发送到 Amazon IoT Core。

本教程介绍如何创建一个示例 Lambda 函数,该函数将在启用令牌签名的情况下,借助 create-authorizer调用实现授权和身份验证逻辑。然后,授权方会使用 test-invoke-authorizer进行验证,最后您可以使用 HTTP Publish API 将数据发送到 Amazon IoT Core来测试 MQTT 主题。示例请求将使用 x-amz-customauthorizer-name标头并传递令牌密钥名称和请求标头中的 x-amz-customauthorizer-signature来指定要调用的授权方。

您将在本教程中学到的内容:

  • 如何创建一个 Lambda 函数作为自定义授权方处理程序

  • 如何在启用令牌签名的情况下使用使用 Amazon CLI创建自定义授权方。

  • 如何使用 test-invoke-authorizer命令测试您的自定义授权方

  • 如何使用 Postman 发布 MQTT 主题并使用您的自定义授权方验证请求

完成本教程需要大约 60 分钟。

在开始本教程之前,请确保您具有:

  • 设置您的Amazon Web Services 账户

    您将需要用到您的 Amazon Web Services 账户和 Amazon IoT控制台以完成本教程。

    当您用于本教程的账户中至少包含这些Amazon托管策略时,账户的效果最佳:

    重要

    本教程中使用的 IAM 策略比您在生产实施中应遵循的更宽松。在生产环境中,请确保您的账户和资源策略仅授予必要的权限。

    在您为生产创建 IAM 策略时,请确定用户和角色需要的访问权限,然后设计允许他们仅执行这些任务的策略。

    有关更多信息,请参阅 IAM 安全最佳实践

  • 已安装 Amazon CLI

    有关如何安装 Amazon CLI的信息,请参阅安装 AmazonCLI。本教程需要 Amazon CLI版本 aws-cli/2.1.3 Python/3.7.4 Darwin/18.7.0 exe/x86_64或更高版本。

  • OpenSSL 工具

    本教程中的示例使用 LibreSSL 2.6.5。您还可以在本教程中使用 OpenSSL v1.1.1i 工具。

  • 查看 Amazon Lambda概览

    如果您未使用过 Amazon Lambda,请查看 Amazon LambdaLambda 入门以学习它的术语和概念。

  • 回顾了如何在 Postman 中构建请求

    有关更多信息,请参阅构建请求

  • 从以前的教程中删除了自定义授权方

    您的Amazon Web Services 账户一次只能配置有限数量的自定义授权方。有关如何创建和删除自定义授权方的信息,请参阅 步骤 8:清除

步骤 1:为自定义授权方创建 Lambda 函数

Amazon IoT Core 中的定制身份验证使用授权方资源来对客户端进行身份验证和授权。您将在本部分中创建的函数将在连接到 Amazon IoT Core和访问 Amazon IoT资源时对客户端进行身份验证和授权。

Lambda 函数执行以下操作:

  • 如果请求来自 test-invoke-authorizer,则它会返回一个带有 Deny操作的 IAM 策略。

  • 如果请求来自使用 HTTP 的 Passport,且 actionToken参数的值为 allow,则它会返回一个带有 Allow操作的 IAM 策略。否则,它会返回带有 Deny操作的 IAM 策略。

要为自定义授权方创建 Lambda 函数:

  1. Lambda 控制台,打开函数

  2. 选择 Create function(创建函数)。

  3. 确认 Author from scratch(从头开始编写)处于选中状态。

  4. Basic information 下:

    1. Function name (函数名称) 中,输入 custom-auth-function

    2. Runtime(运行时),确认 Node.js 14.x

  5. 选择创建函数

    Lambda 创建 Node.js 函数和执行角色,该角色将授予函数上载日志的权限。在您调用函数时,Lambda 函数将承担执行角色,并使用该执行角色为 AmazonSDK 创建凭证,并从事件源读取数据。

  6. 要在 Amazon Cloud9 编辑器中查看函数的代码和配置,请在设计窗口选择 custom-auth-function,然后在编辑器的导航窗格中选择 index.js

    对于脚本语言(如 Node.js),Lambda 包含返回成功响应的基本函数。您可以使用 Amazon Cloud9编辑器来编辑您的函数,只要源代码不超过 3MB 即可。

  7. 在编辑器中使用以下代码替换 index.js 代码:

    // A simple Lambda function for an authorizer. It demonstrates // How to parse a CLI and Http password to generate a response. exports.handler = function(event, context, callback) { //Http parameter to initiate allow/deny request const HTTP_PARAM_NAME='actionToken'; const ALLOW_ACTION = 'Allow'; const DENY_ACTION = 'Deny'; //Event data passed to Lambda function var event_str = JSON.stringify(event); console.log('Complete event :'+ event_str); //Read protocolData from the event json passed to Lambda function var protocolData = event.protocolData; console.log('protocolData value---> ' + protocolData); //Get the dynamic account ID from function's ARN to be used // as full resource for IAM policy var ACCOUNT_ID = context.invokedFunctionArn.split(":")[4]; console.log("ACCOUNT_ID---"+ACCOUNT_ID); //Get the dynamic region from function's ARN to be used // as full resource for IAM policy var REGION = context.invokedFunctionArn.split(":")[3]; console.log("REGION---"+REGION); //protocolData data will be undefined if testing is done via CLI. // This will help to test the set up. if (protocolData === undefined) { //If CLI testing, pass deny action as this is for testing purpose only. console.log('Using the test-invoke-authorizer cli for testing only'); callback(null, generateAuthResponse(DENY_ACTION,ACCOUNT_ID,REGION)); } else{ //Http Testing from Postman //Get the query string from the request var queryString = event.protocolData.http.queryString; console.log('queryString values -- ' + queryString); /* global URLSearchParams */ const params = new URLSearchParams(queryString); var action = params.get(HTTP_PARAM_NAME); if(action!=null && action.toLowerCase() === 'allow'){ callback(null, generateAuthResponse(ALLOW_ACTION,ACCOUNT_ID,REGION)); }else{ callback(null, generateAuthResponse(DENY_ACTION,ACCOUNT_ID,REGION)); } } }; // Helper function to generate the authorization IAM response. var generateAuthResponse = function(effect,ACCOUNT_ID,REGION) { var full_resource = "arn:aws:iot:"+ REGION + ":" + ACCOUNT_ID + ":*"; console.log("full_resource---"+full_resource); var authResponse = {}; authResponse.isAuthenticated = true; authResponse.principalId = 'principalId'; var policyDocument = {}; policyDocument.Version = '2012-10-17'; policyDocument.Statement = []; var statement = {}; statement.Action = 'iot:*'; statement.Effect = effect; statement.Resource = full_resource; policyDocument.Statement[0] = statement; authResponse.policyDocuments = [policyDocument]; authResponse.disconnectAfterInSeconds = 3600; authResponse.refreshAfterInSeconds = 600; console.log('custom auth policy function called from http'); console.log('authResponse --> ' + JSON.stringify(authResponse)); console.log(authResponse.policyDocuments[0]); return authResponse; }
  8. 选择 Deploy(部署)。

  9. Changes deployed(更改已部署)出现在编辑器上方后:

    1. 滚动到编辑器上方的 Function overview(函数概览)部分。

    2. 复制 Function ARN(函数 ARN)并保存以在本教程稍后的部分中使用。

  10. 测试 函数。

    1. 选择 Test(测试)选项卡。

    2. 使用默认测试设置,选择 Invoke(调用)。

    3. 如果测试成功,则在 Execution results(执行结果)下,打开 Details(详细信息)视图。您应该看到函数返回的策略文档。

      如果测试失败或没有看到策略文档,请查看代码以查找并更正错误。

步骤 2:为自定义授权方创建公有密钥和私有密钥对

您的自定义授权方需要公有密钥和私有密钥来对其进行身份验证。本部分中的命令使用 OpenSSL 工具来创建此密钥对。

要为自定义授权方创建公有和私有密钥对,请执行以下操作

  1. 创建私有密钥文件。

    openssl genrsa -out private-key.pem 4096
  2. 验证您刚创建的私有密钥文件。

    openssl rsa -check -in private-key.pem -noout

    如果命令未显示任何错误,则私有密钥文件是有效的。

  3. 创建公有密钥文件。

    openssl rsa -in private-key.pem -pubout -out public-key.pem
  4. 验证公有密钥文件。

    openssl pkey -inform PEM -pubin -in public-key.pem -noout

    如果命令未显示任何错误,则公有密钥文件是有效的。

步骤3:创建客户授权方资源及其授权

Amazon IoT 自定义授权方是将在前面步骤中创建的所有元素联系在一起的资源。在本部分中,您将创建一个自定义授权方资源,并授予其运行您之前创建的 Lambda 函数的权限。您可以通过使用 Amazon IoT控制台、Amazon CLI 或 AmazonAPI 来创建自定义授权方资源。

在本教程中,您只需要创建一个自定义授权方。本部分描述了如何使用 Amazon IoT控制台和 Amazon CLI进行创建,以便您可以使用最方便的方法操作。以两种方法创建的自定义授权方资源之间没有区别。

创建自定义授权方资源

要创建自定义授权方(控制台)

  1. 打开 Amazon IoT控制台中的自定义授权方页面,然后选择 Create(创建)。

  2. Create custom authorizer(创建自定义授权方)中:

    1. Name your custom authorizer(为自定义授权方命名)中,输入 my-new-authorizer

    2. Authorizer function(授权方函数)中,选择您之前创建的 Lambda 函数。

    3. Token validation - optional(令牌验证 — 可选)中:

      1. 检查 Enable token signing(启用令牌签名)。

      2. Token header name (optional)(令牌标头名称(可选))中,输入 tokenKeyName

      3. Key name(键名称),输入:FirstKey

      4. Value(值)中,输入 public-key.pem文件的内容。请务必包含文件中的行以及 -----BEGIN PUBLIC KEY----------END PUBLIC KEY-----,并且不要从文件内容中添加或删除任何换行符、回车符或其它字符。您输入的字符串应类似下面这个示例。

        -----BEGIN PUBLIC KEY----- MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAvEBzOk4vhN+3LgslvEWt sLCqNmt5Damas3bmiTRvq2gjRJ6KXGTGQChqArAJwL1a9dkS9+maaXC3vc6xzx9z QPu/vQOe5tyzz1MsKdmtFGxMqQ3qjEXAMPLEOmqyUKPP5mff58k6ePSfXAnzBH0q lg2HioefrpU5OSAnpuRAjYKofKjbc2Vrn6N2G7hV+IfTBvCElf0csalS/Rk4phD5 oa4Y0GHISRnevypg5C8n9Rrz91PWGqP6M/q5DNJJXjMyleG92hQgu1N696bn5Dw8 FhedszFa6b2x6xrItZFzewNQkPMLMFhNrQIIyvshtT/F1LVCS5+v8AQ8UGGDfZmv QeqAMAF7WgagDMXcfgKSVU8yid2sIm56qsCLMvD2Sq8Lgzpey9N5ON1o1Cvldwvc KrJJtgwW6hVqRGuShnownLpgG86M6neZ5sRMbVNZO8OzcobLngJ0Ibw9KkcUdklW gvZ6HEJqBY2XE70iEXAMPLETPHzhqvK6Ei1HGxpHsXx6BNft582J1VpgYjXha8oa /NN7l7Zbj/euAb41IVtmX8JrD9z613d1iM5L8HluJlUzn62Q+VeNV2tdA7MfPfMC 8btGYladFAnitThaz6+F0VSBJPu7pZQoLnqyEp5zLMtF+kFl2yOBmGAP0RBivRd9 JWBUCG0bqcLQPeQyjbXSOfUCAwEAAQ== -----END PUBLIC KEY-----
  3. 检查 Activate authorizer(激活授权方)。

  4. 选择 Create Authorizer(创建授权方)。

  5. 如果创建了自定义授权方资源,您将看到自定义授权方列表,并且您的新自定义授权方应显示在列表中,然后您便可以继续下一部分展开测试了。

    如果您看到错误,请检查错误并尝试再次创建自定义授权方,然后仔细检查条目。请注意,每个自定义授权方资源必须具有唯一的名称。

要创建自定义授权方(Amazon CLI)

  1. 将您的值替换为 authorizer-function-arntoken-signing-public-keys,然后运行以下命令:

    aws iot create-authorizer \ --authorizer-name "my-new-authorizer" \ --token-key-name "tokenKeyName" \ --status ACTIVE \ --no-signing-disabled \ --authorizer-function-arn "arn:aws:lambda:Region:57EXAMPLE833:function:custom-auth-function" \ --token-signing-public-keys FirstKey="-----BEGIN PUBLIC KEY----- MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAvEBzOk4vhN+3LgslvEWt sLCqNmt5Damas3bmiTRvq2gjRJ6KXGTGQChqArAJwL1a9dkS9+maaXC3vc6xzx9z QPu/vQOe5tyzz1MsKdmtFGxMqQ3qjEXAMPLEOmqyUKPP5mff58k6ePSfXAnzBH0q lg2HioefrpU5OSAnpuRAjYKofKjbc2Vrn6N2G7hV+IfTBvCElf0csalS/Rk4phD5 oa4Y0GHISRnevypg5C8n9Rrz91PWGqP6M/q5DNJJXjMyleG92hQgu1N696bn5Dw8 FhedszFa6b2x6xrItZFzewNQkPMLMFhNrQIIyvshtT/F1LVCS5+v8AQ8UGGDfZmv QeqAMAF7WgagDMXcfgKSVU8yid2sIm56qsCLMvD2Sq8Lgzpey9N5ON1o1Cvldwvc KrJJtgwW6hVqRGuShnownLpgG86M6neZ5sRMbVNZO8OzcobLngJ0Ibw9KkcUdklW gvZ6HEJqBY2XE70iEXAMPLETPHzhqvK6Ei1HGxpHsXx6BNft582J1VpgYjXha8oa /NN7l7Zbj/euAb41IVtmX8JrD9z613d1iM5L8HluJlUzn62Q+VeNV2tdA7MfPfMC 8btGYladFAnitThaz6+F0VSBJPu7pZQoLnqyEp5zLMtF+kFl2yOBmGAP0RBivRd9 JWBUCG0bqcLQPeQyjbXSOfUCAwEAAQ== -----END PUBLIC KEY-----"

    其中:

    • authorizer-function-arn 值是您为自定义授权方创建的 Lambda 函数的 Amazon Resource Name (ARN)。

    • token-signing-public-keys 值包含密钥的名称、FirstKey 以及 public-key.pem文件的内容。请务必包含文件中的行以及 -----BEGIN PUBLIC KEY----------END PUBLIC KEY-----,并且不要从文件内容中添加或删除任何换行符、回车符或其它字符。

      注意:输入公有密钥时要非常小心,因为对公有密钥值的任何更改都会使其无法使用。

  2. 如果创建了自定义授权方,则该命令将返回新资源的名称和 ARN,如下所示。

    { "authorizerName": "my-new-authorizer", "authorizerArn": "arn:aws:iot:Region:57EXAMPLE833:authorizer/my-new-authorizer" }

    保存 authorizerArn值,以供下一步使用。

    请记住,每个自定义授权方资源必须具有唯一的名称。

授权自定义授权方资源

在本部分中,您将为刚刚创建的自定义授权方资源授予权限,以运行 Lambda 函数

使用 Amazon CLI将权限授予您的 Lambda 函数

  1. 插入您的值后,输入以下命令。请注意,statement-id 值必须唯一。如果您之前运行过本教程,或者如果您遇到了 ResourceConflictException错误,请将 Id-1234替换为另一个值。

    aws lambda add-permission \ --function-name "custom-auth-function" \ --principal "iot.amazonaws.com" \ --action "lambda:InvokeFunction" \ --statement-id "Id-1234" \ --source-arn authorizerArn
  2. 如果命令成功,则返回一个权限语句,如本示例。您可以继续到下一部分来测试自定义授权方。

    { "Statement": "{\"Sid\":\"Id-1234\",\"Effect\":\"Allow\",\"Principal\":{\"Service\":\"iot.amazonaws.com\"},\"Action\":\"lambda:InvokeFunction\",\"Resource\":\"arn:aws:lambda:Region:57EXAMPLE833:function:custom-auth-function\",\"Condition\":{\"ArnLike\":{\"AWS:SourceArn\":\"arn:aws:lambda:Region:57EXAMPLE833:function:custom-auth-function\"}}}" }

    如果命令不成功,则返回错误,如本示例。在继续操作之前,您需要查看并更正错误。

    An error occurred (AccessDeniedException) when calling the AddPermission operation: User: arn:aws:iam::57EXAMPLE833:user/EXAMPLE-1 is not authorized to perform: lambda:AddPer mission on resource: arn:aws:lambda:Region:57EXAMPLE833:function:custom-auth-function

步骤 4:通过调用 test-invoke-authorizer 测试授权方

在本部分中,由于定义了所有资源,您将从命令行调用 test-invoke-authorizer 来测试授权通过。

请注意,在通过命令行调用授权方时,protocolData 并未定义,因此授权方将始终返回 DENY 文档。但是,此测试将确认您的自定义授权方和 Lambda 函数是否已正确配置,即使它并未完全测试 Lambda 函数。

要使用 Amazon CLI测试您的自定义授权方及其 Lambda 函数

  1. 在包含您在上一步中创建的 private-key.pem文件的目录中,请运行以下命令。

    echo -n "tokenKeyValue" | openssl dgst -sha256 -sign private-key.pem | openssl base64 -A

    此命令将创建要在下一步中使用的签名字符串。签名字符串如下所示:

    dBwykzlb+fo+JmSGdwoGr8dyC2qB/IyLefJJr+rbCvmu9Jl4KHAA9DG+V+MMWu09YSA86+64Y3Gt4tOykpZqn9mn VB1wyxp+0bDZh8hmqUAUH3fwi3fPjBvCa4cwNuLQNqBZzbCvsluv7i2IMjEg+CPY0zrWt1jr9BikgGPDxWkjaeeh bQHHTo357TegKs9pP30Uf4TrxypNmFswA5k7QIc01n4bIyRTm90OyZ94R4bdJsHNig1JePgnuOBvMGCEFE09jGjj szEHfgAUAQIWXiVGQj16BU1xKpTGSiTAwheLKUjITOEXAMPLECK3aHKYKY+d1vTvdthKtYHBq8MjhzJ0kggbt29V QJCb8RilN/P5+vcVniSXWPplyB5jkYs9UvG08REoy64AtizfUhvSul/r/F3VV8ITtQp3aXiUtcspACi6ca+tsDuX f3LzCwQQF/YSUy02u5XkWn+sto6KCkpNlkD0wU8gl3+kOzxrthnQ8gEajd5Iylx230iqcXo3osjPha7JDyWM5o+K EWckTe91I1mokDr5sJ4JXixvnJTVSx1li49IalW4en1DAkc1a0s2U2UNm236EXAMPLELotyh7h+flFeloZlAWQFH xRlXsPqiVKS1ZIUClaZWprh/orDJplpiWfBgBIOgokJIDGP9gwhXIIk7zWrGmWpMK9o=

    复制此签名字符串以在下一步中使用。请注意,不要包含任何额外的字符或遗漏任何字符。

  2. 在此命令中,将 token-signature值替换为上一步中的签名字符串,并运行此命令来测试您的授权程序。

    aws iot test-invoke-authorizer \ --authorizer-name my-new-authorizer \ --token tokenKeyValue \ --token-signature dBwykzlb+fo+JmSGdwoGr8dyC2qB/IyLefJJr+rbCvmu9Jl4KHAA9DG+V+MMWu09YSA86+64Y3Gt4tOykpZqn9mnVB1wyxp+0bDZh8hmqUAUH3fwi3fPjBvCa4cwNuLQNqBZzbCvsluv7i2IMjEg+CPY0zrWt1jr9BikgGPDxWkjaeehbQHHTo357TegKs9pP30Uf4TrxypNmFswA5k7QIc01n4bIyRTm90OyZ94R4bdJsHNig1JePgnuOBvMGCEFE09jGjjszEHfgAUAQIWXiVGQj16BU1xKpTGSiTAwheLKUjITOEXAMPLECK3aHKYKY+d1vTvdthKtYHBq8MjhzJ0kggbt29VQJCb8RilN/P5+vcVniSXWPplyB5jkYs9UvG08REoy64AtizfUhvSul/r/F3VV8ITtQp3aXiUtcspACi6ca+tsDuXf3LzCwQQF/YSUy02u5XkWn+sto6KCkpNlkD0wU8gl3+kOzxrthnQ8gEajd5Iylx230iqcXo3osjPha7JDyWM5o+KEWckTe91I1mokDr5sJ4JXixvnJTVSx1li49IalW4en1DAkc1a0s2U2UNm236EXAMPLELotyh7h+flFeloZlAWQFHxRlXsPqiVKS1ZIUClaZWprh/orDJplpiWfBgBIOgokJIDGP9gwhXIIk7zWrGmWpMK9o=

    如果命令成功,它将返回自定义授权方函数生成的信息,如此示例。

    { "isAuthenticated": true, "principalId": "principalId", "policyDocuments": [ "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Action\":\"iot:*\",\"Effect\":\"Deny\",\"Resource\":\"arn:aws:iot:Region:57EXAMPLE833:*\"}]}" ], "refreshAfterInSeconds": 600, "disconnectAfterInSeconds": 3600 }

    如果命令返回错误,请查看错误并仔细检查您在本节中使用的命令。

步骤 5:测试使用 Postman 发布 MQTT 消息

  1. 要从命令行获取设备数据端点,请如此处所示调用 describe-endpoint

    aws iot describe-endpoint --output text --endpoint-type iot:Data-ATS

    保存此地址以在后续步骤中用作 device_data_endpoint_address

  2. 打开一个新的 Postman 窗口并创建一个新的 HTTP POST 请求。

    1. 在您的计算机中,打开 Postman 应用程序。

    2. 在 Postman 的 File(文件)菜单中,选择 New…(新建)。

    3. New(新建)对话框中,选择 Request(请求)。

    4. 在“保存”请求中,

      1. Request name(请求名称)中,输入 Custom authorizer test request

      2. Select a collection or folder to save to:(选择要保存到的收藏夹或文件夹:)中选择或创建要保存此请求的收藏夹。

      3. 选择 Save to collection_name(保存到“collection_name”)。

  3. 创建 POST 请求以测试您的自定义授权方。

    1. 在 URL 字段旁边的请求方法选择器中,选择 POST

    2. 在 URL 字段中,通过使用以下 URL 和来自 describe-endpoint 命令的 device_data_endpoint_address 为您的请求创建 URL。

      https://device_data_endpoint_address:443/topics/test/cust-auth/topic?qos=0&actionToken=allow

      请注意,此 URL 包含 actionToken=allow查询参数,该参数将告诉您的 Lambda 函数返回允许访问 Amazon IoT的策略文档。输入 URL 后,查询参数也会显示在 Postman 的 Params(参数)选项卡上。

    3. Auth(身份验证)选项卡上的 Type(类型)字段中,选择 No Auth(无身份验证)。

    4. 在标头选项卡中:

      1. 如果选择了 Host(主机)密钥,请取消选中此项。

      2. 在标头列表的底部添加这些新标头并确认它们被选中。使用您在上一节中用于 test-invoke-authorize命令的签名字符串,将 Host值替换为您的 device_data_endpoint_addressx-amz-customauthorizer-signature值。

        密钥
        x-amz-customauthorizer-name my-new-authorizer
        Host device_data_endpoint_address
        tokenKeyName tokenKeyValue
        x-amz-customauthorizer-signature dBwykzlb+fo+JmSGdwoGr8dyC2qB/IyLefJJr+rbCvmu9Jl4KHAA9DG+V+MMWu09YSA86+64Y3Gt4tOykpZqn9mnVB1wyxp+0bDZh8hmqUAUH3fwi3fPjBvCa4cwNuLQNqBZzbCvsluv7i2IMjEg+CPY0zrWt1jr9BikgGPDxWkjaeehbQHHTo357TegKs9pP30Uf4TrxypNmFswA5k7QIc01n4bIyRTm90OyZ94R4bdJsHNig1JePgnuOBvMGCEFE09jGjjszEHfgAUAQIWXiVGQj16BU1xKpTGSiTAwheLKUjITOEXAMPLECK3aHKYKY+d1vTvdthKtYHBq8MjhzJ0kggbt29VQJCb8RilN/P5+vcVniSXWPplyB5jkYs9UvG08REoy64AtizfUhvSul/r/F3VV8ITtQp3aXiUtcspACi6ca+tsDuXf3LzCwQQF/YSUy02u5XkWn+sto6KCkpNlkD0wU8gl3+kOzxrthnQ8gEajd5Iylx230iqcXo3osjPha7JDyWM5o+KEWckTe91I1mokDr5sJ4JXixvnJTVSx1li49IalW4en1DAkc1a0s2U2UNm236EXAMPLELotyh7h+flFeloZlAWQFHxRlXsPqiVKS1ZIUClaZWprh/orDJplpiWfBgBIOgokJIDGP9gwhXIIk7zWrGmWpMK9o=
    5. 在“正文”选项卡中:

      1. 在数据格式选项框中,选择 Raw(原始)。

      2. 在数据类型列表中,选择 JavaScript

      3. 在文本字段中,为测试消息输入此 JSON 消息负载:

        { "data_mode": "test", "vibration": 200, "temperature": 40 }
  4. 选择 Send(发送)以提交请求。

    如果请求成功,则返回:

    { "message": "OK", "traceId": "ff35c33f-409a-ea90-b06f-fbEXAMPLE25c" }

    成功的响应表明您的自定义授权方允许与 Amazon IoT的连接并且测试消息已经传送到 Amazon IoT Core中的代理处。

    如果返回错误,请查看错误消息、device_data_endpoint_address、签名字符串和其它标头值。

将此请求保留在 Postman 中以供下一节使用。

步骤 6:在 MQTT 测试客户端中查看消息

在上一步中,您使用 Postman 将模拟设备消息发送到了 Amazon IoT。成功的响应表明您的自定义授权方允许与 Amazon IoT的连接并且测试消息已经传送到 Amazon IoT Core中的代理处。在本部分中,您将使用 Amazon IoT控制台中的 MQTT 测试客户端,以像其它设备和服务一样查看该消息中的消息内容。

要查看自定义授权方授权的测试消息

  1. 在 Amazon IoT控制台中打开 MQTT 测试客户端

  2. Subscribe to topic(订阅主题)选项卡中的 Topic filter(主题筛选条件)中,输入 test/cust-auth/topic,这是前一节中 Postman 示例使用的消息主题。

  3. 选择 Subscribe

    在下一步中,保持此窗口可见。

  4. 在 Postman 中,在您为上一节创建的请求中,选择 Send(发送)。

    查看响应以确保响应成功。如果没有,请按照上一节所述对错误进行故障排除。

  5. MQTT test client(MQTT 测试客户端),您应该看到一个新条目,其中显示消息主题以及来自从 Postman 发送的请求(如果已展开)的消息负载。

    如果您未在 MQTT test client(MQTT 测试客户端)中看到您的消息,可以检查以下事项:

    • 确保您的 Postman 请求成功返回。如果 Amazon IoT拒绝连接并返回错误,则请求中的消息不会传递给消息代理。

    • 请确保用于打开 Amazon IoT控制台的 Amazon Web Services 账户和 Amazon Web Services 区域与您在 Postman URL 中使用的相同。

    • 请确保您已在 MQTT test client(MQTT 测试客户端)中正确输入主题。主题筛选条件区分大小写。如有疑问,您还可以订阅 #主题,该主题订阅通过Amazon Web Services 账户和Amazon Web Services 区域用于打开 Amazon IoT控制台的消息代理传递的所有 MQTT 消息。

步骤 7:查看结果和后续步骤

在本教程中:

  • 您创建了一个 Lambda 函数作为自定义授权方处理程序

  • 您创建了启用令牌签名的自定义授权方

  • 您使用 test-invoke-authorizer命令测试了自定义授权方

  • 您使用 Postman 发布了一个 MQTT 主题通过并使用您的自定义授权方验证请求

  • 您使用了 MQTT test client(MQTT 测试客户端)查看 Postman 测试发送的消息

后续步骤

从 Postman 发送一些消息以验证自定义授权方是否正常工作后,请尝试试验以了解更改本教程的不同方面会对结果产生何种影响。以下是一些入门示例。

  • 更改签名字符串,使其不再有权查看未经授权的连接尝试的处理方式。您应该得到一个错误响应,如此所示,并且该消息不应出现在 MQTT test client(MQTT 测试客户端)中。

    { "message": "Forbidden", "traceId": "15969756-a4a4-917c-b47a-5433e25b1356" }
  • 要了解有关如何查找在开发和使用 Amazon IoT规则过程中可能会出现的错误,请参阅 监控 Amazon IoT

步骤 8:清除

如果您想重复本教程,可能需要删除一些自定义授权方。您的 Amazon Web Services 账户一次只能配置有限数量的自定义授权方,当您尝试在不删除现有自定义授权方的情况下添加新的授权方时,您可以获得 LimitExceededException

要删除自定义授权方(控制台)

  1. 打开 Amazon IoT控制台的自定义授权方页面,然后在自定义授权方列表中找到要删除的自定义授权方。

  2. 打开“自定义授权方详细信息”页面,然后从 Actions(操作)菜单中,选择 Edit(编辑)。

  3. 取消选中 Activate authorizer(激活授权方),然后选择 Update(更新)。

    您无法在自定义授权方处于活动状态时将其删除。

  4. 在“自定义授权方详细信息”页面,打开 Actions(操作)菜单,然后选择 Delete(删除)。

要删除自定义授权方(Amazon CLI)

  1. 列出您已安装的自定义授权方,并查找要删除的自定义授权方的名称。

    aws iot list-authorizers
  2. 在将 Custom_Auth_Name替换为要删除的自定义授权方的 authorizerName后,运行此命令,以将自定义授权方设置为 inactive

    aws iot update-authorizer --status INACTIVE --authorizer-name Custom_Auth_Name
  3. 在将 Custom_Auth_Name替换为要删除的自定义授权方的 authorizerName后,运行此命令,以删除自定义授权方。

    aws iot delete-authorizer --authorizer-name Custom_Auth_Name