在 AWS IOT 中调用 getShadow/updateShadow 时出现 ForbiddenError 403

2023-12-08

我有带有联合 ID 的经过身份验证的用户。但是当我尝试访问 AWS IOT 内容时,我收到了这个错误,这让我发疯。

我正在关注iot sample code。所有相关凭证也都是正确的。

    `MQTTHelper`
    ....
        credentialsProvider = new CognitoCachingCredentialsProvider(
                        mContext.getApplicationContext(), // context
                        BuildConfig.COGNITO_POOL_ID, // Identity Pool ID
                        MY_REGION // Region
                );

                Region region = Region.getRegion(MY_REGION);

                mqttManager = new AWSIotMqttManager(clientId, BuildConfig.CUSTOMER_SPECIFIC_ENDPOINT);
                mqttManager.setKeepAlive(10);
mAwsIotDataClient = new AWSIotDataClient(credentialsProvider);
        String iotDataEndpoint = BuildConfig.CUSTOMER_SPECIFIC_ENDPOINT;
        mAwsIotDataClient.setEndpoint(iotDataEndpoint);
        mAwsIotDataClient.setRegion(region);

        // mqttManager.setMqttLastWillAndTestament(lwt);

        mIotAndroidClient = new AWSIotClient(credentialsProvider);
        mIotAndroidClient.setRegion(region);

        keystorePath = mContext.getFilesDir().getPath();
        keystoreName = BuildConfig.KEYSTORE_NAME;
        keystorePassword = BuildConfig.KEYSTORE_PASSWORD;
        certificateId = BuildConfig.CERTIFICATE_ID;

        // To load cert/key from keystore on filesystem
        try {
            if (AWSIotKeystoreHelper.isKeystorePresent(keystorePath, keystoreName)) {
                if (AWSIotKeystoreHelper.keystoreContainsAlias(certificateId, keystorePath,
                        keystoreName, keystorePassword)) {
                    Log.d(LOG_TAG, "Certificate " + certificateId
                            + " found in keystore - using for MQTT.");
                    // load keystore from file into memory to pass on connection
                    clientKeyStore = AWSIotKeystoreHelper.getIotKeystore(certificateId,
                            keystorePath, keystoreName, keystorePassword);
                    //btnConnect.setEnabled(true);
                    Log.i(LOG_TAG, "Connected....");
                    //CONNECTED_TO_DEVICE = true;
                } else {
                    Log.i(LOG_TAG, "Key/cert " + certificateId + " not found in keystore.");
                }
            } else {
                Log.i(LOG_TAG, "Keystore " + keystorePath + "/" + keystoreName + " not found.");
            }
        } catch (Exception e) {
            Log.e(LOG_TAG, "An error occurred retrieving cert/key from keystore.", e);
        }


        if (clientKeyStore == null) {

            IS_CERTIFICATE_GENERATED = false;

            Log.i(LOG_TAG, "Cert/key was not found in keystore - creating new key and certificate.");

            doGenerateNewCertificate();

        } else {

            IS_CERTIFICATE_GENERATED = true;
            doMqttConnect();
        }




    }

    private static void doMqttConnect() {

        Log.d(LOG_TAG, "clientId = " + clientId);

        try {
            mqttManager.connect(clientKeyStore, new AWSIotMqttClientStatusCallback() {
                @Override
                public void onStatusChanged(final AWSIotMqttClientStatus status,
                                            final Throwable throwable) {
                    Log.d(LOG_TAG, "Status = " + String.valueOf(status));

                    if (mqttManagerConnStatus != null) {
                        //Send Mqtt Manager Status Back
                        mqttManagerConnStatus.onStatusChanged(status, throwable);
                    }


                }

            });
        } catch (final Exception e) {
            Log.e(LOG_TAG, "Connection error.", e);

        }

与我调用的示例代码中提到的类似GetShadow()在另一个班级

 GetThingShadowRequest getThingShadowRequest = new GetThingShadowRequest() .withThingName(thingName);

                GetThingShadowResult result = mDashboard.mqttHelper.doGetAwsIotDataClient()
                        .getThingShadow(getThingShadowRequest);

                byte[] bytes = new byte[result.getPayload().remaining()];
                result.getPayload().get(bytes);

                String resultString = new String(bytes);
                return new AsyncTaskResult<String>(resultString);

我能够得到KMS工作正常,因此经过身份验证(联合 ID)没有问题。我在 AWS IOT 上获得的唯一信息来源就是this从客户的角度来看,这没有帮助。 是AWS IOT配置问题还是代码问题?我必须订阅 Thing Group,我还需要做什么才能订阅该组吗? 这是我需要订阅的事物组 ARNarn:aws:iot:us-east-1:XXXXXXXXXX:thinggroup/A_GROUP

堆栈跟踪

getShadowTask
    com.amazonaws.AmazonServiceException: null (Service: AWSIotData; Status Code: 403; Error Code: ForbiddenException; Request ID: f78eea4d-9053-4b19-1840-297dd67c2667)
        at com.amazonaws.http.AmazonHttpClient.handleErrorResponse(AmazonHttpClient.java:730)
        at com.amazonaws.http.AmazonHttpClient.executeHelper(AmazonHttpClient.java:405)
        at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:212)
        at com.amazonaws.services.iotdata.AWSIotDataClient.invoke(AWSIotDataClient.java:571)
        at com.amazonaws.services.iotdata.AWSIotDataClient.getThingShadow(AWSIotDataClient.java:406)
        at com.lyrebird.abc.device.MyDevicesFragment_RV_Adapter$GetShadowTask.doInBackground(MyDevicesFragment_RV_Adapter.java:519)
        at com.lyrebird.abc.device.MyDevicesFragment_RV_Adapter$GetShadowTask.doInBackground(MyDevicesFragment_RV_Adapter.java:497)
        at android.os.AsyncTask$2.call(AsyncTask.java:295)
        at java.util.concurrent.FutureTask.run(FutureTask.java:237)
        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
        at java.lang.Thread.run(Thread.java:818)
06-18 06:00:54.029 7489-7489/com.lyrebird.abc E/com.lyrebird.abc.device.MyDevicesFragment_RV_Adapter.GetShadowTask: getShadowTask
    com.amazonaws.AmazonServiceException: null (Service: AWSIotData; Status Code: 403; Error Code: ForbiddenException; Request ID: f78eea4d-9053-4b19-1840-297dd67c2667)
        at com.amazonaws.http.AmazonHttpClient.handleErrorResponse(AmazonHttpClient.java:730)
        at com.amazonaws.http.AmazonHttpClient.executeHelper(AmazonHttpClient.java:405)
        at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:212)
        at com.amazonaws.services.iotdata.AWSIotDataClient.invoke(AWSIotDataClient.java:571)
        at com.amazonaws.services.iotdata.AWSIotDataClient.getThingShadow(AWSIotDataClient.java:406)
        at com.lyrebird.abc.device.MyDevicesFragment_RV_Adapter$GetShadowTask.doInBackground(MyDevicesFragment_RV_Adapter.java:519)
        at com.lyrebird.abc.device.MyDevicesFragment_RV_Adapter$GetShadowTask.doInBackground(MyDevicesFragment_RV_Adapter.java:497)
        at android.os.AsyncTask$2.call(AsyncTask.java:295)
        at java.util.concurrent.FutureTask.run(FutureTask.java:237)
        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
        at java.lang.Thread.run(Thread.java:818)

Policy

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "iot:*",
        "lambda:*"
      ],
      "Resource": [
        "*"
      ]
    }
  ]
}

以下是您可能收到错误 403 的几个原因

  1. 在 Cognito 中,对于经过身份验证和未经身份验证的池,没有适当的更新/获取影子权限
  2. Cognito 池 ID 和 IoT 的 ARN 不正确
  3. 检查 Cognito 用户的 IAM 策略和以下策略,同样对于 Cognito 用户,您必须附加 AttachPrincipalPolicy 策略以授予他们获取/更新影子的适当权限。以下策略应位于 Cognito Auth 和 UnAuth 角色中。

    {

    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:AttachPrincipalPolicy"
            ],
            "Resource": [
                "*"
            ]
        }
    ] }
    
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 AWS IOT 中调用 getShadow/updateShadow 时出现 ForbiddenError 403 的相关文章

  • 从 arraylist 和 hashmap 中删除重复项

    我有一个数组列表 其中包含付款人的姓名 另一个数组列表包含每次付款的费用 例如 nameArray 尼古拉 劳尔 洛伦佐 劳尔 劳尔 洛伦佐 尼古拉 价格数组 24 12 22 18 5 8 1 我需要将每个人的费用相加 所以数组必须变成
  • Android:我可以创建一个不是矩形的视图/画布吗?圆形的?

    我有一个圆形视图 悬停在主要内容上方 gt 从屏幕出来的 z 轴方向 当有人点击屏幕时 我希望选择主要内容或悬停在上方的视图 当它覆盖主视图时 到目前为止效果很好 我在透明画布上有一个圆形物品 这意味着您可以看到该圆圈之外的背景的所有内容
  • android中根据屏幕尺寸计算图像尺寸

    我正在尝试根据屏幕尺寸计算图像高度和宽度 我从后端获取 5 x 7 尺寸的图像 为了将像素乘以 72 进行转换 我有 360 X 504 尺寸的图像 对于 360 X 504 我的动态透明矩形区域将显示为 1 223 x 1 179 即 8
  • 如何在活动中的必填字段中显示 * 符号

    我需要在活动中的必填字段中显示 符号 你能建议我怎样才能做到这一点吗 任何帮助 将不胜感激 我想说 作为必填字段的标记不遵循本机 Android 主题 的组合setHint and setError对于 Android 应用程序来说看起来更
  • onScale 事件后触发奇怪的 onScroll 事件

    我有一个同时使用 SimpleOnScaleGestureListener 和 SimpleOnGestureListener 的应用程序 每当我进行捏缩放时 我都会得到预期的 onScale 但是当我抬起时 我会看到一个奇怪的 onScr
  • 使用 HttpUrlConnection Android 将 base64 编码的图像发送到服务器

    我正在尝试使用 HttpUrlConnection 将 base64 编码的图像发送到服务器 我遇到的问题是大多数图像均已成功发送 但有些图像会生成 FileNotFound 异常 我的图像编码代码可以在下面找到 public static
  • 具有自定义源集的 Android Gradle 风格 - gradle 文件应该是什么样子?

    我有一个旧的 eclipse 项目 我已经转移到 android studio 并设置为使用flavor 它似乎工作得很好 直到我开始尝试在我的风格之间使用不同的 java 文件 我的项目设置是这样的 ProjectRoot acitonb
  • 在 Android Lollipop 中从 Uri 中裁剪照片后总是返回 Null?

    我尝试在拍照或挑选照片后从 Uri 中裁剪图像 我的代码是这样的 public static void cropImage Uri uri Activity activity int action code Intent intent ne
  • 在选项卡上保存数据

    我有 3 个选项卡 每个选项卡都有一个单独的活动 我想在用户单击任一选项卡上的 保存 时保存数据 有几个选项可供选择 共享首选项 全局变量或将对象保存在上下文中 编辑 我必须保存图像和文本字段 Android 共享首选项 https sta
  • Android:使 Dialog 周围的所有内容都比默认值更暗

    我有一个具有以下样式的自定义对话框 它显示了一个无边框对话框 后面的任何内容都会 稍微 变暗 我的设计师希望背后的一切都比 Android 的默认设置更暗 但不是完全黑色 有这样的设置吗 我能想到的唯一解决方法是使用全屏活动而不是对话框 只
  • 如何在 NumberPicker 中一次显示 3 个以上的值

    我正在创建一个数字选择器 如下图所示 但如果有可用空间 我想显示 3 个以上的值 该选择器有 20 个项目 并且有足够的空间来显示 3 个以上的值 这可以使用 NumberPicker 来完成吗 只需以编程方式设置numberPicker
  • Emma 不生成coverage.ec

    我设置了艾玛 它曾经对我有用 然后我们更改了源代码 现在它没有生成coverage ec根本不 它确实生成coverage em 测试临近结束时 出现错误消息 exec INSTRUMENTATION CODE 0 echo Downloa
  • 适用于 Android 的 Google 云端硬盘\文档 API

    我在几个小时内将 Dropbox 与我的应用程序集成 因为 SDK 描述清晰并且有很好的使用示例 Google Drive 似乎只有一个 一刀切 的 Gdata SDK 它非常重 有很多依赖项 它使我的应用程序的大小增加了三倍 而且不是很直
  • android textview 有字符限制吗?

    我正在尝试在 android TextView 中输入超过 2000 3000 个字符 它不显示任何内容 任何一份指南是否对 android textview 有字符限制或什么 我在G3中做了一些小测试 我发现 如果activtiy布局中有
  • AWS RDS MySql - 如何在设置“公开可用”后允许访问

    刚刚使用默认设置和用户 密码创建了新的 AWS RDS MySql 实例 我也将其设置为publicly available并在此过程中创建新的 VPC 目前无法从我的笔记本电脑连接到此 RDS mysql h endpoint u myu
  • Android Gradle 同步失败:无法解析配置“:classpath”的所有工件

    错误如下 Caused by org gradle api internal artifacts ivyservice DefaultLenientConfiguration ArtifactResolveException Could n
  • 无法使用文件提供程序从内部存储打开 PDF 以便在 Android 8 和 9 上查看

    仅适用于 Android 8 和 9 我这里有一个 PDF 文件管理器 String url file storage emulated 0 Android data com verna poc files Download mypdf p
  • 在android中创建SQLite数据库

    我想在我的应用程序中创建一个 SQLite 数据库 其中包含三个表 我将向表中添加数据并稍后使用它们 但我喜欢保留数据库 就好像第一次安装应用程序时它会检查数据库是否存在 如果存在则更新它 否则如果不存在则创建一个新数据库 此外 我正在制作
  • 如何在Android中创建一个简洁的两栏输入表单?

    我想创建一个整洁的两列输入表单 如下所示 到目前为止我的 xml 布局代码
  • 使用Intent拨打电话需要权限吗?

    在我的一个应用程序中 我使用以下代码来拨打电话 Intent intent new Intent Intent ACTION CALL Uri parse startActivity intent 文档说我确实需要以下清单许可才能这样做

随机推荐

  • 加载和释放NSImage时内存持续增加

    我遇到一个问题 我的应用程序在连续加载图像文件时会大量消耗内存到 崩溃点 例如 考虑以下代码 该代码重复加载和释放 15MB JPEG 文件 用于测试目的的大文件大小 NSURL inputUrl NSURL URLWithString f
  • 在 JavaScript 中运行 PHP 代码?这个可以用吗?

    我不确定 PHP 行是否可以在 JavaScript 函数内运行 例如 我没有尝试过运行这个 但我不认为你可以像这样运行 PHP 有人可以帮忙吗 我可以在 javascript 函数中运行 PHP 脚本 而不通过 Ajax 调用外部 PHP
  • Angular 文件上传进度百分比[重复]

    这个问题在这里已经有答案了 在我用 Angular 4 开发的应用程序中 用户可以将多部分文件上传到服务器 文件很大 我需要向用户显示文件上传过程的当前进度及其百分比 我该怎么做 提前致谢 这适用于 Angular 9 和 10 note
  • 在 C# 中使用 OpenGL? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 有免费的 C OpenGL 支持库吗 如果是 我应该使用哪一个 在哪里可以找到示例项目 C 是否提供 OpenGL 类 OpenTK是对 Tai A
  • 从服务器端动态检索 GridPanel 模型/存储/列

    我有一个 GridPanel 在 DB SP 返回表的列之后 必须动态创建其存储模型和列模型 我的问题是如何将值 字符串或 JSON 从服务器传递到 GridPanel Ext define Base GridPanel extend Ex
  • 在 matplotlib 中绘制带中点箭头的圆形 fancyarrowpatch

    我一直在尝试突破 matplotlib 补丁的界限并指示它绘制圆形FancyArrowPatch中点有一个方向箭头 这在我尝试创建的网络表示中非常有用 我使用 python 的编码时间还没有达到两位数 所以我不能说我对 matplotlib
  • 有谁知道如何修复此错误以将 Findbugs 安装到 Netbeans 8.2 中?

    将 Findbugs 安装到 Netbeans 8 2 时出现以下错误 There were some problems while storing Establishing a connection Cause Cannot resolv
  • 列出 Pub/Sub 订阅使用者

    服务可以对发布 订阅订阅进行长轮询 这显然需要在 pub sub 服务和客户端之间不断打开 TCP 连接 有什么方法可以查明某个订阅是否打开了该 TCP 连接吗 没有办法列出 Pub Sub 订阅的所有消费者 不 这会很困难 因为存在三种不
  • SQL Server 2005 某些数据库对象的搜索视图

    SQL Server 中有没有一种方法可以列出数据库中从特定对象连接的所有视图 即 查找从表 myTable 加入的所有视图 您可以使用sys sql dependencies select object name object id fr
  • 我可以通过基类类型的引用访问子类方法吗?

    下面是我正在尝试处理但无法解决问题的代码片段 我真的可以用 Java 执行以下操作吗 如果是 请帮助了解我 如何 如果不是 为什么 看看下面的代码 class Base public void func System out println
  • 使用正则表达式替换 CSV 中引号之间的逗号

    例如 我们有一个像这样的字符串 COURSE 247 28 4 2016 12 53 Europe Brussels 1 Verschil tussen merk product en leveranciersverantwoordelij
  • 没有焦点的按键事件

    我正在编写一个简单的 GUI 它将在特定点打开一个 opencv 窗口 这个窗口有一些非常基本的 keyEvents 来控制它 我想通过一些功能来推进这一点 由于我的 QtGui 是我的控制器 因此我认为使用 KeyPressedEvent
  • 闪亮的应用程序:保持面板在多个视图中保持一致

    在 Shiny 中 我想保持一些面板 下面的面板 1 在多个视图 下面的绘图视图 1 和 2 中保持一致 下面我可以在 Plotview2 中显示 panel1 但是 该面板在此视图中不起作用 目标是能够通过多个 绘图视图 拥有一些一致的
  • 我对值初始化的尝试被解释为函数声明,为什么 A a(()); 不被解释为函数声明?解决这个问题?

    Stack Overflow 教给我的许多东西中 有一个就是所谓的 最令人烦恼的解析 它通常用这样的行来演示 A a B declares a function 虽然对于大多数人来说 直观上这似乎是一个对象的声明a类型的A 暂时采取B对象作
  • 无法删除 docker 镜像

    在设置新的构建机器 CentOS 7 Docker CE 17 12 0 ce 时 我做了一个简单的测试 docker run it rm ubuntu bash 效果很好 但现在我无法删除 Ubuntu 映像 build docker i
  • 在 Spark 中迭代每一列并找到最大长度

    我是 Spark scala 的新手 我有以下情况 我在集群上有一个表 TEST TABLE 可以是配置单元表 我正在将其转换为数据框 作为 scala gt val testDF spark sql select from TEST TA
  • 使用向量代替循环

    我有一个巨大的矩阵 我刚刚给出了一个具有大小的矩阵的示例 1 1000000 我正在使用简单Loop 我不喜欢使用Loop 来找到k where k k ii abs a ii 1 2 a ii a ii 1 a ii 1 2 a ii a
  • GridLayout 和行/列跨度问题

    The Android 开发者博客文章介绍GridLayout显示了跨度如何影响自动索引分配的图表 我正在尝试使用GridLayout 这是我到目前为止所拥有的
  • MySQL、utf8_general_ci 和西里尔字符

    MySQL 版本 4 1 及其排序规则 utf8 general ci 似乎不喜欢特定的西里尔字符 和 适用于 MySQL 5 0 及以上版本 由于该字段用于存储俄语以外的语言 英语 爱沙尼亚语 德语 的信息 因此更改排序规则的类型是不可想
  • 在 AWS IOT 中调用 getShadow/updateShadow 时出现 ForbiddenError 403

    我有带有联合 ID 的经过身份验证的用户 但是当我尝试访问 AWS IOT 内容时 我收到了这个错误 这让我发疯 我正在关注iot sample code 所有相关凭证也都是正确的 MQTTHelper credentialsProvide