2016-10-18 7 views
1

Amazon Cognito認証を使用してAWS IoTに接続するアンドロイドアプリケーションを作成しています。私は正常にユーザーを認証することができ、私は資格情報を取得することができます。 これらの資格情報を使用して物件の影を更新すると、常に403禁止された例外が返されます。私は問題を解決するためのすべての方法を試しましたが、解決策は見つかりませんでした。Amazon Cognitoを使用してAWSにアクセスすることを禁じている

私の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); 

この点で任意の助けいただければ幸いです。

+0

このIAMポリシーには、認証済みロールまたは認証されていないロールが添付されていますか。ある場合は、どの認証プロバイダを使用していますか? –

+0

私は認証されたロールを使用しています。プロバイダーとして、ユーザープールと統合されたIDプールを使用しています – Arun

答えて

3

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

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

Publish/Subscribe Policy Exempleこのドキュメントを読むと2ポリシーがAuthenticated Cognito Userと連携する必要があると記載されています。 1つはCognito IDプール用、もう1つはCognitoユーザー用です。

UIを使用してCognitoユーザーにポリシーを添付することはできませんが、CLIを使用して行うことはできます。

コマンドcognitoユーザーにポリシーを付加するには、次のとおりです。私は、このポリシーを使用

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

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

はあなたには、あなたのcognitoユーザー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); 
    }); 
}; 
+0

このコメントをありがとう、これは私がする必要があったものです!最後のステップ(ラムダ関数に入れてください)について質問があります。ラムダを自動的に実行するために使用できるトリガー/イベントはありますか? –

+0

@TurnerHoughtonありがとう。この解決策を見つけるのは少し難しかった、それがあなたを助けてくれてうれしい。あなたの質問については、あなたがやりたいことにかかっています。私はapi gatewayに/ registerというパスを作成しました。これは特定のユーザーアカウントにiotデバイスを登録します。 – Sapher

+0

フロントエンドにそのエンドポイントにヒットしたタイミングを決めるロジックがありますか?または、ユーザーがログインするたびにそれを実行するだけですか? 1人のユーザーにつき1回だけ実行する必要があるためです。 –

0

問題を特定できました。私の場合、AWS iotクライアントの場合はregionに設定されていませんでした。

Region region = Region.getRegion(MY_REGION); 
mIotAndroidClient.setRegion(region); // I was missing this piece of code 
関連する問題