非常重要的是要理解这里
IAM
策略和
AWS IOT
策略之间的区别。假设您使用
cognito用户池
作为身份提供者。
首先,您需要设置一个
cognito身份池
,将身份池链接到您的
用户池
并为此身份池分配角色(将
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({
clientId: clientID,
host: '*-ats.iot.us-west-2.amazonaws.com',
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,
principal: principal
}, err => {
err ? console.log('ATTACH PRINCIPAL POLICY ERROR', err) : console.log('ATTACH PRINCIPAL POLICY SUCCESS');
});
}
现在,当身份尝试连接IOT时,IOT会找到与此身份相关联的策略,并批准此连接。
抱歉措辞不佳。简而言之,您需要澄清策略和策略之间的区别。这只是我的理解,可能有错误的地方。如果您发现了,请留下评论或编辑我的答案。
重要提示
刚刚从官方文档中找到了这两个策略之间的关系:
https://docs.aws.amazon.com/iot/latest/developerguide/pub-sub-policy.html请查看“HTTP和WebSocket客户端的策略”部分。
npm i moment --save
。同时,“iotdevicegateway” 保持字符串格式。 - Georgii Oleinikovnew Paho.MQTT.Client
,但我不知道它从哪里来。 - Dan Esparza