在这里了解IAM 策略和AWS IOT 策略之间的区别非常重要。假设您使用cognito user pool 作为您的身份提供者。
首先,您需要设置一个cognito identity pool,将身份池链接到您的user pool 并将一个角色(将IAM 策略附加到此角色)到此身份池。
其次,在您的应用程序中,您首先登录以获得用户池凭据,然后调用
AWS.config.credentials = new AWS.CognitoIdentityCredentials({
IdentityPoolId: 'us-west-2:b8d2b32b-cbab-4ae3-9d47-1624d09c9350',
Logins: {
'cognito-idp.us-west-2.amazonaws.com/${userPoolIdentity}': userPoolCredential.getIdToken().getJwtToken(),
}
});
用 aws 临时访问凭证交换您的用户池凭证:
AWS.config.getCredentials(e => {
if(e) console.log("Get credential failed", e);
this.device = AwsIot.device({//AwsIot is the aws-iot-sdk package
clientId: clientID,//clientId is just random string
host: '*-ats.iot.us-west-2.amazonaws.com',//replace * with your own host
protocol: 'wss',
accessKeyId: AWS.config.credentials.accessKeyId,
secretKey: AWS.config.credentials.secretAccessKey,
sessionToken: AWS.config.credentials.sessionToken
});
this.device.on('connect', function() {
console.log("DEVICE CONNECTED");
});
this.device.subscribe('test');
this.device
.on('message', function(topic, payload) {
console.log(`TOPIC IS ${topic}\nMESSAGE IS ${payload.toString()}`);
});
});
但是上面的代码不行!!!
这是棘手的部分:通过交换用户池凭据获得的凭据只是一个临时凭据,代表您刚刚附加到身份池的 AWS IAM 策略!当它请求与您的 IOT 连接时,AWS 将检查是否允许请求以及是否允许执行用户请求的操作。您已经获得了IAM 策略,因此您可以请求,但它会检查附加到此身份的AWS IOT 策略。由于您还没有这样做,因此您不能做您真正要求的事情(即连接)。所以在你第一次想连接的时候,你应该给这个身份附加一个IOT策略。您可以通过命令行或
(<AWS.CognitoIdentityCredentials>AWS.config.credentials).refresh(e => {
if(e) console.log('error', e);
const principal = (<AWS.CognitoIdentityCredentials>AWS.config.credentials).identityId;
console.log(`IdentityId: ${principal}`);
this.attachPrincipalPolicy("test-delete-after-use", principal);
});
attachPrincipalPolicy(policyName, principal) {
new AWS.Iot().attachPrincipalPolicy({
policyName: policyName, // you need to create policy beforehand in iot
principal: principal
}, err => {
err ? console.log('ATTACH PRINCIPAL POLICY ERROR', err) : console.log('ATTACH PRINCIPAL POLICY SUCCESS');
});
}
现在,当身份尝试与 IOT 连接时,IOT 将找到附加到此身份的 IOT 策略,并批准此连接。
很抱歉措辞不好。综上所述,您需要明确IAM 策略和IOT 策略之间的区别。这只是我的理解,它可能有错误的地方。如果你找到它,请发表评论或编辑我的答案。
重要
刚刚从官方文档中找到了这两个政策之间的关系:
https://docs.aws.amazon.com/iot/latest/developerguide/pub-sub-policy.html
查看 HTTP 和 WebSocket 客户端策略
部分