2

Amazon Cognito 認証を使用して AWS IoT に接続する Android アプリケーションを作成しています。ユーザーを正常に認証でき、資格情報を取得できます。これらの認証情報を使用して Thing Shadow を更新すると、常に 403 Forbidden Exception が返されます。問題をトラブルシューティングするためにあらゆる方法を試しましたが、解決策が見つかりませんでした。

私の IAM ポリシーは次のとおりです。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:GetThingShadow",
                "iot:UpdateThingShadow",

            ],
            "Resource": [
               "arn:aws:iot:us-west-2:<my_account>:thing/mythingname"
            ]
        }
    ]
}

エンドポイントを接続するための Android コード:

userSession= AppHelper.getCurrSession();
credentialsProvider=new CognitoCachingCredentialsProvider(getApplicationContext(),POOL_ID,REGIONS);

    Map<String,String> logins=new HashMap<String, String>();
    logins.put("cognito-idp.us-west-2.amazonaws.com/user_pool_id",userSession.getIdToken().getJWTToken());

    credentialsProvider.setLogins(logins);
    iotDataClient=new AWSIotDataClient(credentialsProvider);

    iotDataClient.setEndpoint(ENDPOINT);

モノの影を更新しています:

 UpdateThingShadowRequest request=new UpdateThingShadowRequest();
            request.setThingName(thingName);

            ByteBuffer payloadBuffer=ByteBuffer.wrap(updateState.getBytes());
            request.setPayload(payloadBuffer);

            UpdateThingShadowResult result=iotDataClient.updateThingShadow(request);

この点について何か助けていただければ幸いです。

4

2 に答える 2

7

私はあなたと同じ問題を抱えていました。私は解決策を見つけました。

その 403 ステータス コードは、承認が必要であることを意味します。

このドキュメント (終わり近く) を読んだ場合:パブリッシュ/サブスクライブ ポリシーの例では、認証された Cognito ユーザーで機能させるには2 つのポリシーが必要であると述べられています。1 つは Cognito ID プール用、もう 1 つは Cognito ユーザー用です。

UI を使用して cognito ユーザーにポリシーをアタッチすることはできませんが、CLI を介して行うことができます。

ポリシーを cognito ユーザーにアタッチするコマンドは次のとおりです。

aws iot attach-principal-policy --principal "cognito user id" --policy-Name "policy name"

cognito ユーザー IDは次の場所にあります。

Cognito > Manager Federated Identities > choose your identity pool > identity browser > and find your identity ID

このポリシーはテスト目的で使用します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:*"
            ],
            "Resource": [
                "*"
            ]
        }
     ]
 }

再利用可能にするには、ラムダ関数 (ここでは JavaScript) を使用する必要があります。

var AWS = require('aws-sdk');
var iot = new AWS.Iot();

exports.handler = function(event, context, cb) {
    var params = {
        policyName: 'your policy',
        principal: 'your cognito id'
    };

    var out = iot.attachPrincipalPolicy(params, function(err, data) {
        if (err) cb(err);
        else cb(null, data); 
    });
};
于 2017-01-03T17:45:32.647 に答える