

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# Amazon Cognito ID を使用した承認
<a name="cog-iot-policies"></a>

Amazon Cognito ID には、未認証と認証済みの 2 種類あります。アプリが認証されていない Amazon Cognito ID をサポートしている場合、認証が実行されないため、ユーザーが誰であるかを知りません。

**認証されていない ID:** 認証されていない Amazon Cognito ID の場合、認証されていない ID プールに IAM ロールをアタッチしてアクセス許可を付与します。不明なユーザーが使用できるようにするそれらのリソースにのみアクセスを許可する必要があります。

**重要**  
認証されていない Amazon Cognito ユーザーが に接続する場合は AWS IoT Core、IAM ポリシーで非常に制限されたリソースへのアクセスを許可することをお勧めします。

**認証された ID:** 認証された Amazon Cognito ID には、2 つの場所でアクセス許可を指定する必要があります。
+ 認証された Amazon Cognito ID に IAM ポリシーをアタッチし、
+ Amazon Cognito ID (認証済みユーザー) に AWS IoT Core ポリシーをアタッチします。

## に接続する認証されていない Amazon Cognito ユーザーのポリシー例 AWS IoT Core
<a name="cog-iot-policies-auth-unauth-examples"></a>

次の例は、Amazon Cognito ID の IAM ポリシーと IoT ポリシーの両方におけるアクセス許可を示しています。認証されたユーザーは、デバイス固有のトピック (デバイス/DEVICE\$1ID/ステータスなど) に公開したいと考えています。

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:Connect"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:client/Client_ID"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:Publish"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:topic/device/Device_ID/status"
            ]
        }
    ]
}
```

次の例は、Amazon Cognito の認証されていないロールの IAM ポリシー内のアクセス許可を示しています。認証されていないユーザーは、認証を必要としない非デバイス固有のトピックに発行したいと考えています。

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:Connect"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:client/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:Publish"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:topic/non_device_specific_topic"
            ]
        }
    ]
}
```

## GitHub の例
<a name="cog-iot-policies-github"></a>

次の GitHub でのウェブアプリケーションの例は、認証されたユーザーへのポリシーの添付をユーザーのサインアップと認証プロセスに組み込む方法を示しています。
+ [AWS Amplify と を使用した MQTT パブリッシュ/サブスクライブ React ウェブアプリケーション AWS IoT Device SDK for JavaScript](https://github.com/aws-samples/aws-amplify-react-iot-pub-sub-using-cp)
+ [AWS Amplify、、 AWS IoT Device SDK for JavaScriptおよび Lambda 関数を使用した MQTT パブリッシュ/サブスクライブ React ウェブアプリケーション](https://github.com/aws-samples/aws-amplify-react-iot-pub-sub-using-lambda)

Amplify は、 サービスと統合するウェブおよびモバイルアプリケーションの構築に役立つ一連のツールと AWS サービスです。Amplify の詳細については、[Amplify Framework Documentation](https://docs.amplify.aws/) を参照してください。

どちらの例でも、次の手順を実行します。

1. ユーザーがアカウントにサインアップすると、アプリケーションが Amazon Cognito ユーザープールおよび ID を作成します。

1. ユーザーが認証されると、アプリケーションがポリシーを作成し、ID にアタッチします。これにより、ユーザーは発行およびサブスクライブのアクセス許可を与えられます。

1. ユーザーは、アプリケーションを使用して MQTT トピックを発行およびサブスクライブできます。

最初の例では、認証オペレーション内で直接 `AttachPolicy` API オペレーションを使用します。次の例は、Amplify および AWS IoT Device SDK for JavaScriptを使用する React ウェブアプリケーション内に、この API コールを実装する方法を示しています。

```
function attachPolicy(id, policyName) {
    var Iot = new AWS.Iot({region: AWSConfiguration.region, apiVersion: AWSConfiguration.apiVersion, endpoint: AWSConfiguration.endpoint});
    var params = {policyName: policyName, target: id};

    console.log("Attach IoT Policy: " + policyName + " with cognito identity id: " + id);
    Iot.attachPolicy(params, function(err, data) {
         if (err) {
               if (err.code !== 'ResourceAlreadyExistsException') {
                  console.log(err);
               }
          }
         else  {
            console.log("Successfully attached policy with the identity", data);
         }
     });
}
```

このコードは、[AuthDisplay.js](https://github.com/aws-samples/aws-amplify-react-iot-pub-sub-using-cp/blob/d1c307b36357be934db9dda020140fa337709cd9/src/AuthDisplay.js#L45) ファイルに表示されます。

2 番目の例では、Lambda 関数に `AttachPolicy` API オペレーションを実装します。次の例は、Lambda がこの API コールを使用する方法を示しています。

```
iot.attachPolicy(params, function(err, data) {
     if (err) {
           if (err.code !== 'ResourceAlreadyExistsException') {
              console.log(err);
              res.json({error: err, url: req.url, body: req.body});
           }
      }
     else  {
        console.log(data);
        res.json({success: 'Create and attach policy call succeed!', url: req.url, body: req.body});
     }
 });
```

このコードは、[app.js](https://github.com/aws-samples/aws-amplify-react-iot-pub-sub-using-lambda/blob/e493039581d2aff0faa3949086deead20a2c5385/amplify/backend/function/amplifyiotlambda/src/app.js#L50) ファイルの `iot.GetPolicy` 関数内に表示されます。

**注記**  
Amazon Cognito ID プールを介して取得した AWS 認証情報を使用して関数を呼び出すと、Lambda 関数のコンテキストオブジェクトに の値が含まれます`context.cognito_identity_id`。詳細については、以下を参照してください。  
[AWS Lambda Node.js のコンテキストオブジェクト](https://docs.aws.amazon.com/lambda/latest/dg/nodejs-context.html)
[AWS Lambda Python のコンテキストオブジェクト](https://docs.aws.amazon.com/lambda/latest/dg/python-context.html)
[AWS Lambda Ruby のコンテキストオブジェクト](https://docs.aws.amazon.com/lambda/latest/dg/ruby-context.html)
[AWS Lambda Java のコンテキストオブジェクト](https://docs.aws.amazon.com/lambda/latest/dg/java-context.html)
[AWS Lambda Go のコンテキストオブジェクト](https://docs.aws.amazon.com/lambda/latest/dg/golang-context.html)
[AWS Lambda C\$1 のコンテキストオブジェクト](https://docs.aws.amazon.com/lambda/latest/dg/csharp-context.html)
[AWS Lambda PowerShell のコンテキストオブジェクト](https://docs.aws.amazon.com/lambda/latest/dg/powershell-context.html)