

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

# Benutzerdefinierte Autorisierer (CLI) erstellen und verwalten
<a name="config-custom-auth"></a>

AWS IoT Core implementiert benutzerdefinierte Authentifizierungs- und Autorisierungsschemata mithilfe benutzerdefinierter Autorisierer. Ein benutzerdefinierter Autorisierer ist eine AWS IoT Core Ressource, die Ihnen die Flexibilität bietet, Regeln und Richtlinien auf der Grundlage Ihrer spezifischen Anforderungen zu definieren und zu implementieren. Informationen zum Erstellen eines benutzerdefinierten Autorisierers mit step-by-step Anweisungen finden Sie unter [Tutorial: Erstellen eines benutzerdefinierten Autorisierers](https://docs.aws.amazon.com//iot/latest/developerguide/custom-auth-tutorial.html) für. AWS IoT Core

Jeder Genehmiger umfasst folgende Komponenten: 
+  *Name*: Eine eindeutige benutzerdefinierte Zeichenfolge, in der der Genehmiger identifiziert wird.
+  *ARN der Lambda-Funktion*: Der Amazon-Ressourcenname (ARN) der Lambda-Funktion, die die Autorisierungs- und Authentifizierungslogik implementiert.  
+  *Token-Schlüsselname*: Der Schlüsselname, der verwendet wird, um das Token aus den HTTP-Headern, Abfrageparametern oder dem MQTT-CONNECT-Benutzernamen zu extrahieren, um die Signaturvalidierung durchzuführen. Dieser Wert ist erforderlich, wenn in Ihrem Genehmiger die Signierung aktiviert ist. 
+  *Markierung „Signieren deaktiviert“ (optional)*: Ein boolescher Wert, der angibt, ob die Signaturanforderung für Anmeldeinformationen deaktiviert werden soll. Dies ist nützlich für Szenarien, in denen das Signieren der Anmeldeinformationen keinen Sinn macht, z. B. bei Authentifizierungsschemata, die MQTT-Benutzernamen und -Passwörter verwenden. Der Standardwert ist `false`, also ist das Signieren standardmäßig aktiviert. 
+  *Öffentlicher Schlüssel zur Tokensignierung*: Der öffentliche Schlüssel, den AWS IoT Core zur Validierung der Tokensignatur verwendet. Die Mindestlänge beträgt 2.048 Bit. Dieser Wert ist erforderlich, wenn in Ihrem Genehmiger die Signierung aktiviert ist.  

Lambda berechnet Ihnen die Anzahl der Ausführungen Ihrer Lambda-Funktion und die Dauer der Ausführung des Codes in Ihrer Funktion. Weitere Informationen zu den Preisen für Lambda finden Sie unter [Lambda-Preise](https://aws.amazon.com/lambda/pricing/). Weitere Informationen zum Erstellen von Lambda-Funktionen finden Sie im [Lambda-Entwicklerhandbuch](https://docs.aws.amazon.com/lambda/latest/dg/).

**Anmerkung**  
Wenn Sie die Signierung aktiviert lassen, können Sie verhindern, dass Ihr Lambda übermäßig oft durch unbekannte Clients ausgelöst wird. Bedenken Sie dies, bevor Sie die Signierung in Ihrem Genehmiger deaktivieren.

**Anmerkung**  
Das Timeout-Limit der Lambda-Funktion für den benutzerdefinierten Genehmiger beträgt 5 Sekunden.

**Topics**
+ [Definieren Ihrer Lambda-Funktion](custom-auth-lambda.md)
+ [Erstellen eines Genehmigers](custom-auth-create-authorizer.md)
+ [Autorisieren AWS IoT zum Aufrufen Ihrer Lambda-Funktion](custom-auth-authorize.md)
+ [Testen Ihrer Genehmiger](custom-auth-testing.md)
+ [Verwalten von benutzerdefinierten Genehmigern](custom-auth-manage.md)

# Definieren Ihrer Lambda-Funktion
<a name="custom-auth-lambda"></a>

 Wenn AWS IoT Core Sie Ihren Autorisierer aufrufen, löst er das dem Autorisierer zugeordnete Lambda mit einem Ereignis aus, das das folgende JSON-Objekt enthält. Das JSON-Beispielobjekt enthält alle möglichen Felder. Felder, die für die Verbindungsanforderung nicht relevant sind, sind nicht enthalten.

```
{
    "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.
    },
}
```

 Die Lambda-Funktion sollte diese Informationen verwenden, um die eingehende Verbindung zu authentifizieren und zu entscheiden, welche Aktionen in der Verbindung zulässig sind. Die Funktion sollte eine Antwort senden, die die folgenden Werte enthält. 
+  `isAuthenticated`: Ein boolescher Wert, der angibt, ob die Anforderung authentifiziert wurde.
+  `principalId`: Eine alphanumerische Zeichenfolge, die als Kennung für das Token dient, das von der benutzerdefinierten Autorisierungsanforderung gesendet wurde. Der Wert muss eine alphanumerische Zeichenfolge mit mindestens einem und nicht mehr als 128 Zeichen sein und dem folgenden regulären Ausdrucksmuster (Regex) entsprechen: `([a-zA-Z0-9]){1,128}`. Sonderzeichen, die nicht alphanumerisch sind, dürfen nicht zusammen mit dem in verwendet werden. `principalId` AWS IoT Core Informationen darüber, ob nicht-alphanumerische Sonderzeichen für die zulässig sind, finden Sie in der Dokumentation zu anderen AWS Diensten. `principalId`
+  `policyDocuments`: Eine Liste von AWS IoT Core Richtliniendokumenten im JSON-Format Weitere Informationen zum Erstellen von Richtlinien finden Sie unter. AWS IoT Core [AWS IoT Core Richtlinien](iot-policies.md) Die maximale Anzahl von Richtliniendokumenten ist 10. Jedes Richtliniendokument darf maximal 2048 Zeichen enthalten.
+  `disconnectAfterInSeconds`: Eine Ganzzahl, die die maximale Dauer der Verbindung zum AWS IoT Core -Gateway angibt (in Sekunden). Der Mindestwert ist 300 Sekunden und der Höchstwert 86 400 Sekunden. Der Standardwert ist 86.400.
**Anmerkung**  
Der Wert von `disconnectAfterInSeconds` (von der Lambda-Funktion zurückgegeben) wird festgelegt, wenn die Verbindung hergestellt wird. Dieser Wert kann bei nachfolgenden Lambda-Aufrufen zur Richtlinienaktualisierung nicht geändert werden.
+  `refreshAfterInSeconds`: Eine Ganzzahl, die das Intervall zwischen Richtlinienaktualisierungen angibt. Wenn dieses Intervall abläuft, ruft AWS IoT Core die Lambda-Funktion auf, um Richtlinienaktualisierungen zu ermöglichen. Der Mindestwert ist 300 Sekunden und der Höchstwert 86 400 Sekunden. 

  Das folgende JSON-Objekt enthält ein Beispiel für eine Antwort, die Ihre Lambda-Funktion senden kann. 

 **\$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**

 Der `policyDocument` Wert muss ein AWS IoT Core gültiges Richtliniendokument enthalten. Weitere Informationen zu AWS IoT Core Richtlinien finden Sie unter[AWS IoT Core Richtlinien](iot-policies.md). In MQTT über TLS und MQTT über WebSockets Verbindungen wird diese Richtlinie für das im Feldwert angegebene Intervall AWS IoT Core zwischengespeichert. `refreshAfterInSeconds` Bei HTTP-Verbindungen wird die Lambda-Funktion für jede Autorisierungsanforderung aufgerufen, es sei denn, Ihr Gerät verwendet persistente HTTP-Verbindungen (auch HTTP-Keep-Alive oder HTTP-Verbindungswiederverwendung genannt). Sie können bei der Konfiguration des Genehmigers wählen, ob Sie das Caching aktivieren möchten. AWS IoT Core Autorisiert während dieses Intervalls Aktionen in einer bestehenden Verbindung gegen diese zwischengespeicherte Richtlinie, ohne dass Ihre Lambda-Funktion erneut ausgelöst wird. Wenn bei der benutzerdefinierten Authentifizierung Fehler auftreten, AWS IoT Core wird die Verbindung beendet. AWS IoT Core beendet die Verbindung auch, wenn sie länger als der im Parameter angegebene Wert geöffnet war. `disconnectAfterInSeconds` 

 Im Folgenden finden JavaScript Sie eine Lambda-Beispielfunktion von Node.js, die in der MQTT Connect-Nachricht nach einem Passwort mit dem Wert von sucht `test` und eine Richtlinie zurückgibt, die die Erlaubnis erteilt, eine Verbindung AWS IoT Core mit einem Client herzustellen `myClientName` und zu einem Thema zu veröffentlichen, das denselben Clientnamen enthält. Wenn es das erwartete Passwort nicht findet, gibt es eine Richtlinie zurück, die diese beiden Aktionen verweigert. 

```
// 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; 
}
```

 Die vorhergehende Lambda-Funktion gibt das folgende JSON zurück, wenn sie das erwartete Passwort von `test` in der MQTT-Connect-Nachricht empfängt. Die Werte der `password`- und `principalId`-Eigenschaften sind die Werte aus der MQTT-Connect-Nachricht.

```
{
  "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
}
```

# Erstellen eines Genehmigers
<a name="custom-auth-create-authorizer"></a>

 [Sie können mithilfe der API einen Autorisierer erstellen. CreateAuthorizer](https://docs.aws.amazon.com/iot/latest/apireference/API_CreateAuthorizer.html) Das folgende Beispiel beschreibt den Befehl. 

```
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]
```

Sie können den `signing-disabled`-Parameter verwenden, um die Signaturvalidierung für jeden Aufruf Ihres Genehmigers zu deaktivieren. Es wird ausdrücklich empfohlen, dass die Signierung nur wenn unbedingt notwendig zu deaktivieren. Die Signaturvalidierung schützt Sie vor übermäßigen Aufrufen Ihrer Lambda-Funktion von unbekannten Geräten. Sie können den `signing-disabled`-Status eines Genehmigers nicht mehr ändern, nachdem Sie ihn erstellt haben. Zum Ändern dieses Verhaltens müssen Sie einen anderen benutzerdefinierten Genehmiger mit einem anderen Wert für den `signing-disabled`-Parameter erstellen. 

Die Werte für die `tokenKeyName`- und `tokenSigningPublicKeys`-Parameter sind optional, wenn Sie das Signieren deaktiviert haben. Sie sind jedoch erforderlich, wenn das Signieren aktiviert ist. 

Nachdem Sie Ihre Lambda-Funktion und den benutzerdefinierten Autorisierer erstellt haben, müssen Sie dem AWS IoT Core Dienst ausdrücklich die Berechtigung erteilen, die Funktion in Ihrem Namen aufzurufen. Sie können dies mit dem folgenden Befehl tun. 

**Anmerkung**  
Der Standard-IoT-Endpunkt unterstützt möglicherweise nicht die Verwendung von benutzerdefinierten Autorisierern mit Lambda-Funktionen. Stattdessen können Sie Domänenkonfigurationen verwenden, um einen neuen Endpunkt zu definieren und diesen Endpunkt dann für den benutzerdefinierten Autorisierer anzugeben.

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

# Autorisieren AWS IoT zum Aufrufen Ihrer Lambda-Funktion
<a name="custom-auth-authorize"></a>

In diesem Abschnitt erteilen Sie der benutzerdefinierten Autorisierungsressource, die Sie gerade erstellt haben, die Erlaubnis, die Lambda-Funktion auszuführen. Um die Berechtigung zu erteilen, können Sie den CLI-Befehl [add-permission](https://docs.aws.amazon.com//cli/latest/reference/lambda/add-permission.html) verwenden.

**Erteilen Sie Ihrer Lambda-Funktion die Erlaubnis mit dem AWS CLI**

1. Geben Sie nach der Eingabe Ihrer Werte den folgenden Befehl ein. Beachten Sie, dass der Wert `statement-id` eindeutig sein muss. `Id-1234`Ersetzen Sie es durch den exakten Wert, den Sie haben, andernfalls wird möglicherweise eine `ResourceConflictException` Fehlermeldung angezeigt.

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

1. Wenn der Befehl erfolgreich ist, gibt er eine Berechtigungsanweisung zurück, wie in diesem Beispiel. Sie können mit dem nächsten Abschnitt fortfahren, um den benutzerdefinierten Autorisierer zu testen.

   ```
   {
       "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\"}}}"
   }
   ```

   Wenn der Befehl nicht erfolgreich ist, wird ein Fehler zurückgegeben, wie in diesem Beispiel. Sie müssen den Fehler überprüfen und korrigieren, bevor Sie fortfahren können.

   ```
   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
   ```

# Testen Ihrer Genehmiger
<a name="custom-auth-testing"></a>

 Sie können die [TestInvokeAuthorizer](https://docs.aws.amazon.com/iot/latest/apireference/API_TestInvokeAuthorizer.html)API verwenden, um den Aufruf und die Rückgabewerte Ihres Autorisierers zu testen. Mit dieser API können Sie Protokollmetadaten angeben und die Signaturvalidierung in Ihrem Authorizer testen.

Die folgenden Tabs zeigen, wie Sie den verwenden können, AWS CLI um Ihren Authorizer zu testen.

------
#### [ 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
```

------

Der Wert des `token-signature`-Parameters ist das signierte Token. Weitere Informationen zum Abrufen dieses Werts finden Sie unter [Signieren des Tokens](custom-auth.md#custom-auth-token-signature).

Wenn Ihr Genehmiger einen Benutzernamen und ein Passwort verwendet, können Sie diese Informationen mithilfe des `--mqtt-context`-Parameters weitergeben. Die folgenden Registerkarten zeigen, wie Sie mithilfe der `TestInvokeAuthorizer`-API ein JSON-Objekt, das einen Benutzernamen, ein Passwort und einen Clientnamen enthält, an Ihren benutzerdefinierten Genehmiger senden.

------
#### [ 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"}'
```

------

Das Passwort muss base64-kodiert sein. Das folgende Beispiel zeigt, wie Sie ein Passwort in einer Unix-ähnlichen Umgebung kodieren.

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

# Verwalten von benutzerdefinierten Genehmigern
<a name="custom-auth-manage"></a>

 Sie können Ihre Autorisierer wie folgt verwalten. APIs 
+ [ListAuthorizers](https://docs.aws.amazon.com/iot/latest/apireference/API_ListAuthorizers.html): Zeigt alle Autorisierer in Ihrem Konto an.
+  [DescribeAuthorizer](https://docs.aws.amazon.com/iot/latest/apireference/API_DescribeAuthorizer.html): Zeigt die Eigenschaften des angegebenen Autorisierers an. Zu diesen Werten gehören das Erstellungsdatum, das Datum der letzten Änderung und andere Attribute.
+ [SetDefaultAuthorizer](https://docs.aws.amazon.com/iot/latest/apireference/API_SetDefaultAuthorizer.html): Gibt den Standardautorisierer für Ihre AWS IoT Core Datenendpunkte an. AWS IoT Core verwendet diesen Autorisierer, wenn ein Gerät keine AWS IoT Core Anmeldeinformationen weitergibt und keinen Autorisierer angibt. Weitere Informationen zur Verwendung von AWS IoT Core Anmeldeinformationen finden Sie unter. [Client-Authentifizierung](client-authentication.md)
+ [UpdateAuthorizer](https://docs.aws.amazon.com/iot/latest/apireference/API_UpdateAuthorizer.html): Ändert den Status, den Namen des Token-Schlüssels oder die öffentlichen Schlüssel für den angegebenen Autorisierer.
+  [DeleteAuthorizer](https://docs.aws.amazon.com/iot/latest/apireference/API_DeleteAuthorizer.html): Löscht den angegebenen Autorisierer. 

**Anmerkung**  
 Sie können die Signaturanforderungen eines Genehmigers nicht aktualisieren. Das bedeutet, dass Sie das Signieren in einem vorhandenen Genehmiger, der dies fordert, nicht deaktivieren können. Sie können auch nicht die Anmeldung bei einem vorhandenen Genehmiger verlangen, der dies nicht fordert. 