

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

# Creazione e gestione di autorizzazioni personalizzate (CLI)
<a name="config-custom-auth"></a>

AWS IoT Core implementa schemi di autenticazione e autorizzazione personalizzati utilizzando autorizzatori personalizzati. Un autorizzatore personalizzato è una AWS IoT Core risorsa che offre la flessibilità necessaria per definire e implementare le regole e le politiche in base ai requisiti specifici. Per creare un autorizzatore personalizzato con step-by-step istruzioni, vedi [Tutorial: Creazione di un autorizzatore personalizzato](https://docs.aws.amazon.com//iot/latest/developerguide/custom-auth-tutorial.html) per. AWS IoT Core

Ogni autorizzatore è costituito dai seguenti componenti: 
+  *Nome*: stringa univoca definita dall'utente che identifica l'autorizzatore.
+  *ARN della funzione Lambda*: L'Amazon Resource Name (ARN) della funzione Lambda che implementa la logica di autorizzazione e di autenticazione.  
+  *Nome della chiave dei token*: Il nome della chiave utilizzato per estrarre il token dalle intestazioni HTTP, dai parametri di query o dal nome utente MQTT CONNECT per eseguire la convalida della firma. Questo valore è obbligatorio se la firma è abilitata nell'autorizzazione. 
+  *Contrassegno di firma disabilitato (facoltativo)*: valore booleano che specifica se disattivare il requisito di firma sulle credenziali. Ciò è utile per gli scenari in cui la firma delle credenziali non ha senso, ad esempio gli schemi di autenticazione che utilizzano il nome utente e la password MQTT. Il valore predefinito è `false`, pertanto la firma è abilitata per impostazione predefinita. 
+  *Chiave pubblica per la firma di token*: chiave pubblica utilizzata da AWS IoT Core per convalidare la firma del token. La sua lunghezza minima è di 2.048 bit. Questo valore è obbligatorio se la firma è abilitata nell'autorizzatore.  

Lambda addebita per il numero di volte in cui la tua funzione Lambda viene eseguita e per il tempo necessario per l'esecuzione del codice nella funzione. Per maggiori informazioni sui prezzi di Lambda consulta [Prezzi Lambda](https://aws.amazon.com/lambda/pricing/). Per ulteriori informazioni sulla creazione di funzioni Lambda, consulta [Guida per gli sviluppatori di Lambda](https://docs.aws.amazon.com/lambda/latest/dg/).

**Nota**  
Se si lascia abilitata la firma, è possibile impedire l'attivazione eccessiva di Lambda da parte di client non riconosciuti. Consideralo prima di disabilitare l'accesso nel tuo autorizzatore.

**Nota**  
Il limite di timeout della funzione Lambda per l'autorizzatore personalizzato è di 5 secondi.

**Topics**
+ [Scrittura della funzione Lambda](custom-auth-lambda.md)
+ [Creazione di un autorizzatore](custom-auth-create-authorizer.md)
+ [Autorizzazione AWS IoT a richiamare la funzione Lambda](custom-auth-authorize.md)
+ [Verificare le autorizzazioni](custom-auth-testing.md)
+ [Gestione degli autorizzatori personalizzati](custom-auth-manage.md)

# Scrittura della funzione Lambda
<a name="custom-auth-lambda"></a>

 Quando AWS IoT Core richiama l'autorizzatore, attiva la Lambda associata all'autorizzatore con un evento che contiene il seguente oggetto JSON. L'oggetto JSON di esempio contiene tutti i campi possibili. I campi non rilevanti per la richiesta di connessione non sono inclusi.

```
{
    "token" :"aToken",
    "signatureVerified": Boolean, // Indicates whether the device gateway has validated the signature.
    "protocols": ["tls", "http", "mqtt"], // Indicates which protocols to expect for the request.
    "protocolData": {
        "tls" : {
            "serverName": "serverName" // The server name indication (SNI) host_name string.
        },
        "http": {
            "headers": {
                "#{name}": "#{value}"
            },
            "queryString": "?#{name}=#{value}"
        },
        "mqtt": {
            "username": "myUserName",
            "password": "myPassword", // A base64-encoded string.
            "clientId": "myClientId" // Included in the event only when the device sends the value.
        }
    },
    "connectionMetadata": {
        "id": UUID // The connection ID. You can use this for logging.
    },
}
```

 La funzione Lambda deve utilizzare queste informazioni per autenticare la connessione in ingresso e decidere quali azioni sono consentite nella connessione. La funzione deve inviare una risposta che contiene i seguenti valori. 
+  `isAuthenticated`: valore booleano che indica se la richiesta è stata autenticata.
+  `principalId`: Una stringa alfanumerica che funge da identificatore per il token inviato dalla richiesta di autorizzazione personalizzata. Il valore deve essere una stringa alfanumerica con almeno uno e non più di 128 caratteri e corrisponde a questo pattern di espressione regolare (regex):`([a-zA-Z0-9]){1,128}`. I caratteri speciali che non sono alfanumerici non possono essere utilizzati con l'in. `principalId` AWS IoT Core Consultate la documentazione relativa agli altri AWS servizi se sono consentiti caratteri speciali non alfanumerici per. `principalId`
+  `policyDocuments`: Un elenco di documenti relativi alle policy in formato JSON Per ulteriori informazioni sulla creazione di AWS IoT Core policy, vedere. AWS IoT Core [AWS IoT Core politiche](iot-policies.md) Il numero massimo di documenti di policy è di 10. Ogni documento di policy può contenere un massimo di 2.048 caratteri.
+  `disconnectAfterInSeconds`: numero intero che specifica la durata massima (in secondi) della connessione al gateway di AWS IoT Core . Il valore minimo è 300 secondi e il valore massimo è 86400 secondi. Il valore predefinito è 86.400.
**Nota**  
Il valore di `disconnectAfterInSeconds` (restituito dalla funzione Lambda) viene impostato quando viene stabilita la connessione. Questo valore non può essere modificato durante le successive chiamate Lambda di aggiornamento delle policy.
+  `refreshAfterInSeconds`: numero intero che specifica l'intervallo tra gli aggiornamenti delle policy. Passato questo intervallo, AWS IoT Core richiama la funzione Lambda per consentire gli aggiornamenti delle policy. Il valore minimo è 300 secondi e il valore massimo è 86400 secondi. 

  Il seguente oggetto JSON contiene un esempio di risposta che la funzione Lambda può inviare. 

 **\$1 "isAuthenticated":true, //A Boolean that determines whether client can connect. "principalId": "xxxxxxxx",  //A string that identifies the connection in logs. "disconnectAfterInSeconds": 86400,  "refreshAfterInSeconds": 300,   "policyDocuments": [       \$1         "Version": "2012-10-17",         "Statement": [            \$1               "Action": "iot:Publish",               "Effect": "Allow",               "Resource": "arn:aws:iot:us-east-1:<your\$1aws\$1account\$1id>:topic/customauthtesting"             \$1          ]        \$1     ] \$1**

 Il `policyDocument` valore deve contenere un documento di policy valido. AWS IoT Core Per ulteriori informazioni sulle AWS IoT Core politiche, vedere[AWS IoT Core politiche](iot-policies.md). In MQTT su TLS e MQTT su WebSockets connessioni, AWS IoT Core memorizza nella cache questa politica per l'intervallo specificato nel valore del campo. `refreshAfterInSeconds` Nel caso di connessioni HTTP, la funzione Lambda viene richiamata per ogni richiesta di autorizzazione a meno che il dispositivo non utilizzi connessioni persistenti HTTP (chiamate anche HTTP keep-alive o riutilizzo della connessione HTTP), è possibile scegliere di abilitare la memorizzazione nella cache durante la configurazione dell'autorizzatore. Durante questo intervallo, AWS IoT Core autorizza le azioni in una connessione stabilita contro questa policy memorizzata nella cache senza attivare nuovamente la funzione Lambda. Se si verificano errori durante l'autenticazione personalizzata, interrompe la connessione. AWS IoT Core AWS IoT Core interrompe inoltre la connessione se è rimasta aperta per un periodo superiore al valore specificato nel parametro. `disconnectAfterInSeconds` 

 Di seguito JavaScript è riportato un esempio di funzione Lambda di Node.js che cerca una password nel messaggio MQTT Connect con un valore `test` di e restituisce un criterio che concede il permesso di connettersi AWS IoT Core a un client `myClientName` denominato e pubblicare su un argomento che contiene lo stesso nome client. Se non trova la password prevista, restituisce una policy che nega queste due operazioni. 

```
// A simple Lambda function for an authorizer. It demonstrates 
// how to parse an MQTT password and generate a response.

exports.handler = function(event, context, callback) { 
    var uname = event.protocolData.mqtt.username;
    var pwd = event.protocolData.mqtt.password;
    var buff = new Buffer(pwd, 'base64');
    var passwd = buff.toString('ascii');
    switch (passwd) { 
        case 'test': 
            callback(null, generateAuthResponse(passwd, 'Allow')); 
            break;
        default: 
            callback(null, generateAuthResponse(passwd, 'Deny'));  
    }
};

// Helper function to generate the authorization response.
var generateAuthResponse = function(token, effect) { 
    var authResponse = {}; 
    authResponse.isAuthenticated = true; 
    authResponse.principalId = 'TEST123'; 
    
    var policyDocument = {}; 
    policyDocument.Version = '2012-10-17';		 	 	 
    policyDocument.Statement = []; 
    var publishStatement = {}; 
    var connectStatement = {};
    connectStatement.Action = ["iot:Connect"];
    connectStatement.Effect = effect;
    connectStatement.Resource = ["arn:aws:iot:us-east-1:123456789012:client/myClientName"];
    publishStatement.Action = ["iot:Publish"]; 
    publishStatement.Effect = effect; 
    publishStatement.Resource = ["arn:aws:iot:us-east-1:123456789012:topic/telemetry/myClientName"]; 
    policyDocument.Statement[0] = connectStatement;
    policyDocument.Statement[1] = publishStatement; 
    authResponse.policyDocuments = [policyDocument]; 
    authResponse.disconnectAfterInSeconds = 3600; 
    authResponse.refreshAfterInSeconds = 300;
    
    return authResponse; 
}
```

 La suddetta funzione Lambda restituisce il seguente JSON quando riceve la password prevista di `test` nel messaggio MQTT Connect. I valori delle proprietà `password` e `principalId` saranno i valori del messaggio MQTT Connect.

```
{
  "password": "password",
  "isAuthenticated": true,
  "principalId": "principalId",
  "policyDocuments": [
    {
      "Version": "2012-10-17",		 	 	 
      "Statement": [
        {
          "Action": "iot:Connect",
          "Effect": "Allow",
          "Resource": "*"
        },
        {
          "Action": "iot:Publish",
          "Effect": "Allow",
          "Resource": "arn:aws:iot:region:accountId:topic/telemetry/${iot:ClientId}"
        },
        {
          "Action": "iot:Subscribe",
          "Effect": "Allow",
          "Resource": "arn:aws:iot:region:accountId:topicfilter/telemetry/${iot:ClientId}"
        },
        {
          "Action": "iot:Receive",
          "Effect": "Allow",
          "Resource": "arn:aws:iot:region:accountId:topic/telemetry/${iot:ClientId}"
        }
      ]
    }
  ],
  "disconnectAfterInSeconds": 3600,
  "refreshAfterInSeconds": 300
}
```

# Creazione di un autorizzatore
<a name="custom-auth-create-authorizer"></a>

 [È possibile creare un autorizzatore utilizzando l'API. CreateAuthorizer](https://docs.aws.amazon.com/iot/latest/apireference/API_CreateAuthorizer.html) L'esempio seguente descrive il comando. 

```
aws iot create-authorizer
--authorizer-name MyAuthorizer
--authorizer-function-arn arn:aws:lambda:us-west-2:<account_id>:function:MyAuthorizerFunction  //The ARN of the Lambda function.
[--token-key-name MyAuthorizerToken //The key used to extract the token from headers.
[--token-signing-public-keys FirstKey=
 "-----BEGIN PUBLIC KEY-----
  [...insert your public key here...] 
  -----END PUBLIC KEY-----"
[--status ACTIVE]
[--tags <value>]
[--signing-disabled | --no-signing-disabled]
```

Puoi utilizzare il parametro `signing-disabled` per disattivare la convalida della firma per ogni chiamata dell'autorizzatore. Si consiglia vivamente di non disattivare la firma a meno che non sia necessario. La convalida della firma ti protegge da invocazioni eccessive della funzione Lambda da dispositivi sconosciuti. Non è possibile aggiornare lo status `signing-disabled` di un autorizzatore dopo averlo creata. Per modificare questo comportamento, è necessario creare un altro autorizzatore personalizzato con un valore diverso per il parametro `signing-disabled`. 

I valori per i parametri `tokenKeyName` e `tokenSigningPublicKeys` sono facoltativi se la firma è stata disabilitata. Sono valori obbligatori se la firma è abilitata. 

Dopo aver creato la funzione Lambda e l'autorizzatore personalizzato, devi concedere esplicitamente al AWS IoT Core servizio l'autorizzazione a richiamare la funzione per tuo conto. Puoi farlo con il seguente comando. 

**Nota**  
L'endpoint IoT predefinito potrebbe non supportare l'utilizzo di autorizzazioni personalizzate con funzioni Lambda. Puoi invece utilizzare le configurazioni di dominio per definire un nuovo endpoint e quindi specificare quell'endpoint per l'autorizzatore personalizzato.

```
aws lambda add-permission --function-name <lambda_function_name>
--principal iot.amazonaws.com --source-arn <authorizer_arn>
--statement-id Id-123 --action "lambda:InvokeFunction"
```

# Autorizzazione AWS IoT a richiamare la funzione Lambda
<a name="custom-auth-authorize"></a>

In questa sezione, concederai l'autorizzazione della risorsa di autorizzazione personalizzata che hai appena creato per eseguire la funzione Lambda. Per concedere l'autorizzazione, è possibile utilizzare il comando dell'interfaccia a riga di comando [add-permission](https://docs.aws.amazon.com//cli/latest/reference/lambda/add-permission.html).

**Concedi l'autorizzazione alla tua funzione Lambda utilizzando il AWS CLI**

1. Una volta inseriti i valori, inserisci il comando seguente. Attenzione: il valore `statement-id` deve essere univoco. Sostituisci `Id-1234` con il valore esatto che hai, altrimenti potresti ricevere un `ResourceConflictException` errore.

   ```
   aws lambda add-permission  \
   --function-name "custom-auth-function" \
   --principal "iot.amazonaws.com" \
   --action "lambda:InvokeFunction" \
   --statement-id "Id-1234" \
   --source-arn authorizerArn
   ```

1. Se il comando viene completato correttamente, restituisce un'istruzione di autorizzazione come questa. È possibile passare alla sezione successiva per testare l'autorizzazione ad hoc.

   ```
   {
       "Statement": "{\"Sid\":\"Id-1234\",\"Effect\":\"Allow\",\"Principal\":{\"Service\":\"iot.amazonaws.com\"},\"Action\":\"lambda:InvokeFunction\",\"Resource\":\"arn:aws:lambda:Region:57EXAMPLE833:function:custom-auth-function\",\"Condition\":{\"ArnLike\":{\"AWS:SourceArn\":\"arn:aws:lambda:Region:57EXAMPLE833:function:custom-auth-function\"}}}"
   }
   ```

   Se il comando non ha esito positivo, restituisce un errore come questo. Dovrai esaminare e correggere l'errore prima di continuare.

   ```
   An error occurred (AccessDeniedException) when calling the AddPermission operation: User: arn:aws:iam::57EXAMPLE833:user/EXAMPLE-1 is not authorized to perform: lambda:AddPer
   mission on resource: arn:aws:lambda:Region:57EXAMPLE833:function:custom-auth-function
   ```

# Verificare le autorizzazioni
<a name="custom-auth-testing"></a>

 Puoi utilizzare l'[TestInvokeAuthorizer](https://docs.aws.amazon.com/iot/latest/apireference/API_TestInvokeAuthorizer.html)API per testare l'invocazione e restituire i valori del tuo autorizzatore. Questa API consente di specificare i metadati del protocollo e di testare la convalida della firma nell'autorizzatore.

Le seguenti schede mostrano come utilizzare per testare l'autorizzatore AWS CLI .

------
#### [ Unix-like ]

```
aws iot test-invoke-authorizer --authorizer-name NAME_OF_AUTHORIZER \
--token TOKEN_VALUE --token-signature TOKEN_SIGNATURE
```

------
#### [ Windows CMD ]

```
aws iot test-invoke-authorizer --authorizer-name NAME_OF_AUTHORIZER ^
--token TOKEN_VALUE --token-signature TOKEN_SIGNATURE
```

------
#### [ Windows PowerShell ]

```
aws iot test-invoke-authorizer --authorizer-name NAME_OF_AUTHORIZER `
--token TOKEN_VALUE --token-signature TOKEN_SIGNATURE
```

------

Il valore del parametro `token-signature` è il token firmato. Per ulteriori informazioni su come modificare questo valore, consulta [Firma del token](custom-auth.md#custom-auth-token-signature).

Se l'autorizzatore accetta un nome utente e una password, puoi trasferire queste informazioni utilizzando il parametro `--mqtt-context`. Nelle seguenti schede viene illustrato come utilizzare l'API `TestInvokeAuthorizer` per inviare un oggetto JSON che contiene un nome utente, una password e un nome client all'autorizzatore personalizzato.

------
#### [ Unix-like ]

```
aws iot test-invoke-authorizer --authorizer-name NAME_OF_AUTHORIZER  \
--mqtt-context '{"username": "USER_NAME", "password": "dGVzdA==", "clientId":"CLIENT_NAME"}'
```

------
#### [ Windows CMD ]

```
aws iot test-invoke-authorizer --authorizer-name NAME_OF_AUTHORIZER  ^
--mqtt-context '{"username": "USER_NAME", "password": "dGVzdA==", "clientId":"CLIENT_NAME"}'
```

------
#### [ Windows PowerShell ]

```
aws iot test-invoke-authorizer --authorizer-name NAME_OF_AUTHORIZER  `
--mqtt-context '{"username": "USER_NAME", "password": "dGVzdA==", "clientId":"CLIENT_NAME"}'
```

------

La password deve essere con codifica base64. Nell'esempio seguente viene illustrato come codificare una password in un ambiente simile a UNIX.

```
echo -n PASSWORD | base64
```

# Gestione degli autorizzatori personalizzati
<a name="custom-auth-manage"></a>

 Puoi gestire i tuoi autorizzatori utilizzando quanto segue. APIs 
+ [ListAuthorizers](https://docs.aws.amazon.com/iot/latest/apireference/API_ListAuthorizers.html): Mostra tutti gli autorizzatori presenti nel tuo account.
+  [DescribeAuthorizer](https://docs.aws.amazon.com/iot/latest/apireference/API_DescribeAuthorizer.html): visualizza le proprietà dell'autorizzatore specificato. Questi valori includono data di creazione, data ultima modifica e altri attributi.
+ [SetDefaultAuthorizer](https://docs.aws.amazon.com/iot/latest/apireference/API_SetDefaultAuthorizer.html): specifica l'autorizzatore predefinito per gli endpoint di dati AWS IoT Core . AWS IoT Core utilizza questo autorizzatore se un dispositivo non trasmette AWS IoT Core le credenziali e non specifica un autorizzatore. Per ulteriori informazioni sull'utilizzo delle AWS IoT Core credenziali, vedere. [Autenticazione client](client-authentication.md)
+ [UpdateAuthorizer](https://docs.aws.amazon.com/iot/latest/apireference/API_UpdateAuthorizer.html): modifica lo stato, il nome della chiave del token o le chiavi pubbliche per l'autorizzatore specificato.
+  [DeleteAuthorizer](https://docs.aws.amazon.com/iot/latest/apireference/API_DeleteAuthorizer.html): elimina l'autorizzatore specificato. 

**Nota**  
 Non è possibile aggiornare i requisiti di firma di un autorizzatore. Ciò significa che non è possibile disabilitare la firma in un autorizzatore esistente che la richiede. Inoltre, non è possibile richiedere la firma a un autorizzatore esistente che non la richiede. 