当前位置: 首页 > 知识库问答 >
问题:

使用具有Cognito认证用户的web套接字连接到AWS IoT

海典
2023-03-14

我正在尝试从浏览器使用web套接字连接到AWS IoT。

我试过这个例子:https://github.com/awslabs/aws-iot-examples/tree/master/mqttSample

还有一个稍微修改了一下,以便可以与Cognito身份池登录的用户一起使用。https://github.com/dwyl/learn-aws-iot/blob/master/src/js/utils/request.js#L27

如果我使用具有有效物联网策略的IAM用户,我可以成功连接,但如果我使用用户凭据,我会收到“101交换协议”响应,但随后它会关闭。

与经过身份验证的用户关联的IAM角色是正确的,我可以签署请求执行其他私有操作,如调用APIGendpoint。此外,套接字连接不响应403。所以这可能不是权限问题。

还可能是什么?

共有3个答案

凌联
2023-03-14

下面是一个代码示例,用于从Lambda(NodeJS)函数将IoT策略附加到Cognito用户id。

function attachPrincipalPolicy(device_id, cognito_user_id) {
    const iotMgmt = new AWS.Iot();
    return new Promise(function(resolve, reject) {
        let params = {
            policyName: device_id + '_policy',
            principal: cognito_user_id
        };
        console.log("Attaching IoT policy to Cognito principal")
        iotMgmt.attachPrincipalPolicy(params, (err, res) => {
            if (err) {
                console.error(err);
                reject(err);
            } else {
                resolve();
            }
        });
    });
}
师增
2023-03-14

为了在前端实现凯勒的答案,我必须做几件事:

  1. 通过转到物联网控制台创建物联网策略(名为“默认”)

然后我将前端代码更新为:

AWS.config.region = process.env.AWS_REGION;
AWS.config.credentials = new AWS.CognitoIdentityCredentials({
  IdentityPoolId: process.env.AWS_IDENTITY_POOL,
  Logins: {
    'graph.facebook.com': FACEBOOK_ACCESS_TOKEN
  }
});
AWS.config.credentials.get(() => {
  const IoT = new AWS.Iot();
  IoT.attachPrincipalPolicy({
    policyName: 'default',
    principal: AWS.config.credentials.identityId
  }, (err, res) => {
    if (err) console.error(err);
    // Connect to AWS IoT MQTT
  });
});
朱兴学
2023-03-14

对于未经身份验证的cognito身份,“身份池未经身份验证”角色足以允许连接到IoT MQTT代理。然而,对于经过身份验证的cognito身份,需要两件事:

>

您必须使用AttachPrindal策略API将物联网策略(与附加到您的设备上的策略完全相同)附加到认知标识

第二步是我今天早些时候卡住的地方,因为在任何地方都不太清楚需要这样做。

AFAIK无法从任何AWS网站将IoT策略附加到cognito用户。但是,如果您的计算机上设置了AWS命令行界面,则可以从那里进行设置。该命令如下所示:

aws iot attach-principal-policy --policy-name <iot-policy-name> --principal <cognito-identity-id>

可以使用联邦标识找到cognito标识id

对于生产系统,您显然希望自动附加此策略,可能在用户注册时使用lambda函数。

文档中关于需要附加物联网策略的部分可以在此页面上找到:

要使经过身份验证的Amazon Cognito标识在AWS帐户中的topic1上通过HTTP发布MQTT消息,必须指定两个策略,如下所述。第一个策略必须附加到Amazon Cognito标识池角色,并允许该池中的标识进行发布调用。第二个策略使用AWS IoT AttachPrincipalPolicy API附加到Amazon Cognito用户,并允许指定的Amazon Cognito用户访问topic1主题。

 类似资料:
  • 问题内容: 如何验证socket.io连接?我的应用程序使用来自另一台服务器(python)的登录端点来获取令牌,每当用户在节点侧打开套接字连接时如何使用该令牌? 和客户端: 如果令牌是在python中创建的: 如何使用此令牌对节点中的套接字连接进行身份验证? 问题答案: 令牌是否在另一台服务器上创建都没有关系。如果您拥有正确的密钥和算法,您仍然可以验证它。 用模块实施 客户 服务器 用模块实施

  • 我需要用AWS Cognito实现本机身份验证,我正试图在我的iOS应用程序(客户端)中使用https://github.com/adam-fowler/soto-cognito-authentication-kit。 我正在努力使用对象来启动用户名/密码身份验证。 这是我的代码: [CNNVD]EventLoopFuture验证方法返回漏洞(CNNVD-200512-343) 如何处理方法的响应

  • 问题内容: 我用NodeJS,socketIO和Express中的不同聊天室制作了一个聊天客户端。我正在尝试显示每个房间的已连接用户的更新列表。 有没有一种方法可以将用户名连接到对象,以便在执行操作时可以看到所有用户名: 然后执行以下操作: 我还可以通过其他方式做到这一点? 解决: 这有点重复,但是解决方案在任何地方都不很清楚地写出来,所以我想我会在这里写下来。这是的解决方案后由安迪轩至极被回答。

  • 问题内容: 我在Linux上使用 --skip-networking 选项使用MySQL 。 尝试使用JDBC将基于J2EE的应用程序(使用servlet)连接到MySQL数据库。 使用 禁用* 了 --skip-networking 选项的MySQL时,我以以下方式连接到数据库: * 启用 --skip-networking 选项后,我尝试将其连接为: 但这似乎不起作用,当我尝试连接到应用程序中

  • 我可以通过JavaScript直接将Web套接字连接到我的PHP守护进程服务器:var websocket = new WebSocket(“ws://IP:PORT”);这将正确握手,但是当我尝试nginx代理 http://IP 它无法接收Sec-WebSocket-Key的标头值并且握手失败。 -最近更新:JavaScript根本无法连接,原因是:语法错误:指定了无效或非法的字符串! 变量:

  • 我在unix(OSX)机器上使用kqueue建立了一个TCP/IP echo服务器,它可以打开100个TCP/IP端口,每个端口接受4000个客户端,我使用另外15台机器建立了大约23万个连接。(每道工序4000康纳,每箱4道工序) 服务器似乎可以接受更多,但问题是客户端,建立更多连接是有限制的。如Windows XP-3000、Windows7、UNIX-16384。 我怎么克服?