使用 cognito 凭据注册 aws iot 设备

Register aws iot device using cognito credentials

我正在开发一个应用程序,我需要在其中跟踪某些设备的变化并在前端显示这些变化。

对于用户登录,我使用的是 cognito,我在登录后获得了凭据,我已经获得了有效的凭据,因为我使用相同的凭据连接了 AWS DynamoDB。

现在我想用相同的认知凭证注册一个 aws.iot 设备。

我正在关注 https://github.com/aws/aws-iot-device-sdk-js

我检查了一些 aws 用户的静态凭证,例如:

client.device = awsIot.device({
    clientId: clientID,
    host: host,
    accessKeyId: AccessKeyId,
    secretKey: secretKey,
    protocol: 'wss'
});

这很好用。

然后我使用 aws cognito assessKeyId 和 secretKey 进行了相同的尝试,但这次我得到了 403。

我检查了 ,但没有帮助。

我当前的代码是这样的:

    var awsIot = require('aws-iot-device-sdk');

    AWS.config.credentials.get(() => {
        const IoT = new AWS.Iot();
        IoT.attachPrincipalPolicy({
            policyName: 'PubSub',
            principal: AWS.config.credentials.identityId
        }, (err, res) => {
            if (err) {
            } else {
                let credential;
                if (AWS.config.credentials && AWS.config.credentials.data && AWS.config.credentials.data.Credentials) {
                    let credentials = AWS.config.credentials.data.Credentials;
                    awsIot.device({
                       clientId: clientID,
                       host: host,
                       accessKeyId: credentials.AccessKeyId,
                       secretKey: credentials.secretKey,
                       protocol: 'wss',
                       sessionToken: credentials.SessionToken
                    });
                }
            }
        });
    });

任何人都可以帮助我,我在这里缺少什么。

对我有用的是直接从 AWS.config.credentials 对象传递数据,即

if (AWS.config.credentials) {
  awsIot.device({
     clientId: clientID,
     host: host,
     accessKeyId: AWS.config.credentials.accessKeyId,
     secretKey: AWS.config.credentials.secretAccessKey,
     protocol: 'wss',
     sessionToken: AWS.config.credentials.sessionToken
  });
}

如果您通过此方法调用,也许还要检查 accessKeyId 等是否以小写字母开头而不是大写字母。

在这种情况下,我终于得到了解决方案,我需要做的就是在创建设备时将空字符串作为访问密钥、密钥和会话令牌传递,然后在创建设备时传递设备凭据。

    AWS.config.credentials.get(() => {
        const IoT = new AWS.Iot();
        IoT.attachPrincipalPolicy({
            policyName: 'PubSub',
            principal: AWS.config.credentials.identityId
        }, (err, res) => {
            if (err) {
            } else {
                let credential;
                if (AWS.config.credentials && AWS.config.credentials.data && AWS.config.credentials.data.Credentials) {
                    let credentials = AWS.config.credentials.data.Credentials;
                    var device = awsIot.device({
                       clientId: clientID,
                       host: host,
                       accessKeyId: '',
                       secretKey: '',
                       protocol: 'wss',
                       sessionToken: ''
                    });
                    device.updateWebSocketCredentials(credentials.AccessKeyId, credentials.SecretKey, credentials.SessionToken, credentials.Expiration);
                }
            }
        });
    });