[PYTHON] Treffen Sie Cognito-zertifiziertes AppSync von hinten mit IAM-Zertifizierung

Treffen Sie Cognito-zertifiziertes AppSync von hinten mit IAM-Zertifizierung

Einführung

Zuvor habe ich "AppSync im Frontend und Backend verwenden" als praktischen Artikel für serverlose Web-Apps veröffentlicht. Hier wurde selbstverständlich "API-Schlüssel" als Authentifizierungsmodus verwendet. Die Authentifizierung mit diesem API-Schlüssel ist gut für Anfänger, die ihn zuerst oder als einfachen Prototyp verwenden möchten. Angesichts der Sicherheit und der Schwierigkeiten bei der Aktualisierung mit einem maximalen Ablaufdatum von 365 Tagen Wenn möglich, sollten andere Authentifizierungsmodi verwendet werden. ink (6).png Sie können den Schlüssel sehen ... Ich werde definitiv vergessen, den Schlüssel nach 365 Tagen zu aktualisieren.

Typ des AppSync-Authentifizierungsmodus

Zusätzlich zum API-Schlüssel unterstützt AppSync die folgenden Authentifizierungsmodi.

** Was ist IAM ** Es ist ein Mechanismus zur Steuerung des Bereichs und der Zugriffsmethode für den Zugriff auf AWS-Ressourcen.

** Was ist der Cognito-Benutzerpool ** Es ist ein Mechanismus zur Bereitstellung der Anwendungsbenutzerverwaltung (Anmelde- und Anmeldestatus).

** Was ist OpenID Connect ** Ich bin damit nicht vertraut, weil ich es nie benutzt habe. (Ähnlich wie bei Cognito möchten Sie sich mit dem ausgestellten Token anmelden und authentifizieren?)

Verwenden Sie eine Kombination aus mehreren Authentifizierungsmodi

AppSync unterstützte im Mai 2019 mehrere Authentifizierungsmodi. https://aws.amazon.com/jp/about-aws/whats-new/2019/05/aws-appsync-now-supports-configuring-multiple-authorization-type/

Dadurch kann sich das Front-End (Client-Seite) bei Cognito und das Back-End (Server-Seite) bei IAM authentifizieren.

Fügen Sie die IAM-Authentifizierung hinzu und schlagen Sie mit Lambda (Python)

Durch die Verwendung von Amplify ist es möglich geworden, den Aufbau von AppSync mit Cognito-Authentifizierung und die Implementierung seiner Verwendung vom Front-End (Webanwendung) aus schnell zu realisieren.

Von dort in diesem Artikel, IAM als Authentifizierungsanbieter für die Verwendung im Backend hinzugefügt, Ich möchte über das tatsächliche Schlagen (Aufrufen der API) von Lambda (Python) schreiben.

Fügen Sie IAM zu weiteren Authentifizierungsanbietern hinzu

AWS Console> AWS AppSync> Wählen Sie die gewünschte API> Einstellungen Unten befindet sich ein Element mit dem Namen "Zusätzlicher Authentifizierungsanbieter". Klicken Sie daher auf die Schaltfläche "Neu". Screenshot 2020-03-01 at 10.02.59.png Wählen Sie im Kombinationsfeld "Authentifizierungsmodus" im Popup-Bildschirm "Zusätzlichen Authentifizierungsanbieter festlegen" die Option "AWS Identify and Access Management (IAM)" aus und klicken Sie auf "Senden". Screenshot 2020-03-01 at 10.04.31.png Vergewissern Sie sich, dass "AWS Identify and Access Management (IAM)" in den Einstellungen zu "Additional Authentication Provider" hinzugefügt wurde, und klicken Sie unten auf die Schaltfläche "Speichern". (* Vergiss nicht!) Screenshot 2020-03-01 at 10.05.41.png

Geben Sie den Authentifizierungsmodus im Schema an

Wenn Sie mehrere Authentifizierungsmodi verwenden möchten, müssen Sie das Schema erweitern. Sie können detailliert angeben, was in welchem Authentifizierungsmodus für jeden Stammtyp ausgeführt werden kann, z. B. Abfrage, Mutation, Abonnement sowie benutzerdefinierte Funktionsfelder und Objekttypen. (* Kann nicht für die Eingabe angegeben werden (Eingabetyp).)

Standardmäßig ist nichts angegeben, was bedeutet, dass nur der primäre Authentifizierungsmodus zulässig ist und der hinzugefügte Authentifizierungsmodus nicht zulässig ist. Sie können den Authentifizierungsmodus angeben, indem Sie die folgenden Markierungen vornehmen.

Weitere Informationen finden Sie in diesem Entwicklerhandbuch. (Vielmehr ist hier alles geschrieben) https://docs.aws.amazon.com/ja_jp/appsync/latest/devguide/appsync-dg%20.pdf

AWS Console> AWS AppSync> Wählen Sie die gewünschte API> Schema Nachdem Sie das graphql-Schema hier bearbeitet haben, klicken Sie auf die Schaltfläche "Schema speichern". Screenshot 2020-03-01 at 14.19.30.png

Hier sind einige Beispiele für vorbearbeitete (Before.graphql) und nachbearbeitete (After.graphql) Schemata.

Before.graphql


type Mutation {
	createSampleAppsyncTable(input: CreateSampleAppsyncTableInput!): SampleAppsyncTable
	updateSampleAppsyncTable(input: UpdateSampleAppsyncTableInput!): SampleAppsyncTable
	deleteSampleAppsyncTable(input: DeleteSampleAppsyncTableInput!): SampleAppsyncTable
}

type Query {
	getSampleAppsyncTable(group: String!, path: String!): SampleAppsyncTable
	listSampleAppsyncTables(filter: TableSampleAppsyncTableFilterInput, limit: Int, nextToken: String): SampleAppsyncTableConnection
}

type SampleAppsyncTable {
	group: String!
	path: String!
}

After.graphql


type Mutation {
	createSampleAppsyncTable(input: CreateSampleAppsyncTableInput!): SampleAppsyncTable
		@aws_cognito_user_pools @aws_iam
	updateSampleAppsyncTable(input: UpdateSampleAppsyncTableInput!): SampleAppsyncTable
		@aws_iam
	deleteSampleAppsyncTable(input: DeleteSampleAppsyncTableInput!): SampleAppsyncTable
}

type Query @aws_cognito_user_pools {
	getSampleAppsyncTable(group: String!, path: String!): SampleAppsyncTable
	listSampleAppsyncTables(filter: TableSampleAppsyncTableFilterInput, limit: Int, nextToken: String): SampleAppsyncTableConnection
}

type SampleAppsyncTable @aws_cognito_user_pools @aws_iam {
	group: String!
	path: String!
}

In diesem Beispiel wird es wie folgt angegeben. Mutation.create: Cognito und IAM Mutation.update: Nur IAM Mutation.delete: Nur Cognito (nicht angegeben = primär) Abfrage: get und list sind nur Cognito

Wie ich bisher geschrieben habe, scheint es gut, die primäre Authentifizierung als IAM anstelle von Cognito zu gestalten und Cognito nur die Berechtigung zu erteilen, die der Client benötigt.

Hit mit Lambda (Python)

Es ist eine Implementierung zum Aufrufen von AppSync mit IAM-Authentifizierungsberechtigung mit Python of Lambda.

sample_graphql_with_iam.py


import requests
from requests_aws4auth import AWS4Auth

AWS_REGION = os.environ["AWS_REGION"]
AWS_ACCESS_KEY_ID = os.environ["AWS_ACCESS_KEY_ID"]
AWS_SECRET_ACCESS_KEY = os.environ["AWS_SECRET_ACCESS_KEY"]
AWS_SESSION_TOKEN = os.environ["AWS_SESSION_TOKEN"]
ENDPOINT = "https://{0}.{1}.{2}.amazonaws.com/{3}".format("xxxxxxxxxxxxxxxxxxxxxx", "appsync-api", AWS_REGION, "graphql")
AUTH = AWS4Auth(AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_REGION, 'appsync', session_token=AWS_SESSION_TOKEN)

def apiCreateTable(group, path):
    try:        
        body_json = {"query": 
            """
            mutation create {{
                createSampleAppsyncTable(input:{{
                group: \"{0}\"
                path: \"{1}\"
              }}){{
                group path
              }}
            }}
            """.format(group, path)
        }
        body = json.dumps(body_json)
        response = requests.request("POST", ENDPOINT, auth=AUTH, data=body, headers={})
    except Exception as e:
        logger.exception(e)
        raise e

Fügen Sie der IAM-Rolle eine Richtlinie hinzu

Fügen Sie die AppSync-Richtlinie der Lambda-IAM-Rolle hinzu, die Sie ausführen möchten. Sie müssen lediglich AWSAppSyncAdministrator anhängen. (* Ich denke, es ist besser, eine Inline-Richtlinie zu schreiben, um nur die Ziel-API zuzulassen, nicht die gesamte AppSync, aber ich weiß nicht, wie ich sie schreiben soll. Kann mir bitte jemand sagen!)

Nachwort

Sie können es von vorne und von hinten treffen. Wenn Sie vor sich warten, um von hinten getroffen zu werden, fühlt es sich cool an. (* Abonnement Geschichte) Sowohl vorne als auch hinten sind mit Cognito langweilig, daher verwende ich IAM hinten. (* Authentifizierungsgeschichte)

Als ich als Person mit JAWS UG Hamamatsu (Onkel Amplify) darüber sprach, kam mir die Idee, diesen Artikel zu schreiben.

In LT habe ich Ende letzten Jahres diese Art von Illustration verwendet. Screenshot 2020-03-01 at 16.55.05.png (Bild des Wartens vor einem Treffer von hinten)

Ich möchte weiterhin AppSync erfassen, das für verschiedene Zwecke nützlich zu sein scheint und dessen Entwicklung es wert ist!

Recommended Posts

Treffen Sie Cognito-zertifiziertes AppSync von hinten mit IAM-Zertifizierung
Versuchen Sie die IAM-Datenbankauthentifizierung von Python aus
Passwortlose Authentifizierung mit RDS und IAM (Python)
Klicken Sie nach der Oauth-Authentifizierung mit Django auf die Twitter-API