IAM
ここでポリシーとポリシーの違いを理解することは非常に重要AWS IOT
です。cognito user pool
ID プロバイダーとしてを使用するとします。
最初に を設定しcognito identity pool
、ID プールをリンクして、ロールをこの ID プール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
ここで注意が必要な点があります。ユーザー プールの資格情報を交換して取得する資格情報は、ID プールにアタッチしたばかりのポリシーを表す一時的な資格情報にすぎません。IOT との接続をリクエストすると、AWS はリクエストが許可されているかどうか、およびユーザーがリクエストしたことを実行できるかどうかを確認します。すでにIAM
ポリシーを取得しているため、リクエストは許可されていますが、AWS IOT
この ID に関連付けられているポリシーがチェックされます。これを行っていないため、実際に要求したこと (つまり、接続) を行うことは許可されていません。そのため、初めて接続するときに、IOT
この ID にポリシーをアタッチする必要があります。これは、コマンドラインまたは
(<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');
});
}
これで、ID が IOT に接続しようとすると、IOT はIOT
この ID に添付されたポリシーを見つけ、この接続を承認します。
言葉遣い悪くてすみません。IAM
要約すると、ポリシーとポリシーの違いを明確にする必要がありますIOT
。これは私が理解していることであり、間違った場所があるかもしれません。見つけたら、コメントを残すか、私の回答を編集してください。
重要
公式ドキュメントからこれら 2 つのポリシーの関係を見つけました:
https://docs.aws.amazon.com/iot/latest/developerguide/pub-sub-policy.html HTTP および WebSocket クライアントのポリシーの
セクションを参照してください。