19

シンプルな AWS IOT REST サービスにアクセスしようとしていますが、まだ成功していません。これが私がしたことです。

  1. aws で iam ユーザーを作成し、アクセス キーとシークレット キーをダウンロードしました
  2. そのユーザーで AWS IOT にログインし、「モノ」を作成しました
  3. モノのプロパティから、シャドウの REST URL を見つけました
  4. Postman に新しい「aws signature」機能を使用し、アクセス キー、シークレット キー、リージョン (us-east-1)、およびサービス名 (iot) を提供しました。
  5. エンドポイントを「GET」しようとしましたが、これが得られたものです-

    { "message": "Credential should be scoped to correct service. ", "traceId": "be056198-d202-455f-ab85-805defd1260d" }

  6. postman に問題があると思ったので、S3 に接続する aws-sdk-sample の例を使用して、IOT URL に接続するように変更しました。これが私のプログラムスニペットです(Java)

    String awsAccessKey = "fasfasfasdfsdafs";
    String awsSecretKey = "asdfasdfasfasdfasdfasdf/asdfsdafsd/fsdafasdf";
    
    URL  endpointUrl = null;
    String regionName = "us-east-1";
    try {
        endpointUrl = new URL("https://dasfsdfasdf.iot.us-east-1.amazonaws.com/things/SOMETHING/shadow");
    }catch (Exception e){
        e.printStackTrace();
    }
    Map<String, String> headers = new HashMap<String, String>();
    headers.put("x-amz-content-sha256", AWSSignerBase.EMPTY_BODY_SHA256);
    
    AWSSignerForAuthorizationHeader signer = new AWSSignerForAuthorizationHeader(
            endpointUrl, "GET", "iot", regionName);
    String authorization = signer.computeSignature(headers,
            null, // no query parameters
            AWSSignerBase.EMPTY_BODY_SHA256,
            awsAccessKey,
            awsSecretKey);
    
    // place the computed signature into a formatted 'Authorization' header
    // and call S3
    headers.put("Authorization", authorization);
    String response = HttpUtils.invokeHttpRequest(endpointUrl, "GET", headers, null);
    System.out.println("--------- Response content ---------");
    System.out.println(response);
    System.out.println("------------------------------------");
    

これは私に同じエラーを与えます -

--------- Request headers ---------
x-amz-content-sha256: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Authorization: AWS4-HMAC-SHA256 Credential=fasfasfasdfsdafs/20160212/us-east-1/iot/aws4_request, SignedHeaders=host;x-amz-content-sha256;x-amz-date, Signature=3b2194051a8dde8fe617219c78c2a79b77ec92338028e9e917a74e8307f4e914
x-amz-date: 20160212T182525Z
Host: dasfsdfasdf.iot.us-east-1.amazonaws.com
--------- Response content ---------
{"message":"Credential should be scoped to correct service. ","traceId":"cd3e0d96-82fa-4da5-a4e1-b736af6c5e34"}
------------------------------------

誰かが私が間違っていることを教えてもらえますか? AWS のドキュメントには、このエラーに関する情報があまりありません。助けてください

4

4 に答える 4

20

たとえば 、iotdata代わりに次のようにリクエストに署名します。iot

AWSSignerForAuthorizationHeader signer = new AWSSignerForAuthorizationHeader(
    endpointUrl, "GET", "iotdata", regionName);
于 2016-03-22T11:20:22.147 に答える
2

4 番目のステップでは、サービス名には何も入力しないでください。Postman は、execute-api で値をデフォルトに設定します。

これがうまくいくことを願っています!

于 2020-12-29T07:22:10.990 に答える
-2

代わりにAWS IoT SDK for Node.jsを使用してください。IoT コンソールで生成された秘密鍵とクライアント証明書、および CA ルート証明書をここからダウンロードします。examples ディレクトリにあるスクリプトから始めます。

于 2016-02-12T22:47:19.450 に答える