Здесь очень важно понимать разницу между 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 < / сильный>
person
xwa130
schedule
04.03.2019