Anfragen von Google Chat prüfen

Für Google Chat-Apps, die auf HTTP-Endpunkten basieren, wird in diesem Abschnitt erläutert, wie Sie Prüfen Sie, ob die Anfragen an Ihren Endpunkt von Google Chat stammen.

Um Interaktionsereignisse an die stellt Google Anfragen an Ihren Dienst. Um zu prüfen, ob die Anfrage enthält Google Chat eine Inhabertoken im Authorization-Header jeder HTTPS-Anfrage an Ihren Endpunkt. Beispiel:

POST
Host: yourappurl.com
Authorization: Bearer AbCdEf123456
Content-Type: application/json
User-Agent: Google-Dynamite

Der String AbCdEf123456 im vorherigen Beispiel ist die Inhaberautorisierung. Token. Dies ist ein von Google erstelltes kryptografisches Token. Der Typ des Inhabers und den Wert des audience abhängig vom Typ der Authentifizierungszielgruppe, die Sie beim Die Chat-App konfigurieren

Chat-App mit Cloud implementiert Functions oder Cloud Run übernimmt Cloud IAM die Tokenüberprüfung automatisch. Ich Sie müssen nur das Google Chat-Dienstkonto als autorisierten Aufrufer hinzufügen. Wenn Ihre Anwendung einen eigenen HTTP-Server implementiert, können Sie das Inhabertoken überprüfen. mithilfe einer Open-Source-Google API-Clientbibliothek:

Wenn das Token für die Chat-App nicht bestätigt wird, Der Dienst sollte auf die Anfrage mit einem HTTPS-Antwortcode antworten 401 (Unauthorized)

Anfragen mit Cloud Functions oder Cloud Run authentifizieren

Wenn Ihre Funktionslogik mit Cloud Functions oder Cloud Run implementiert ist, App URL als Authentication Audience (Authentifizierungszielgruppe) der Chat-App Verbindungseinstellung und achten Sie darauf, App-URL in der Konfiguration entspricht der URL der Cloud Functions-Funktion oder Cloud Run-Endpunkt.

Dann müssen Sie das Google Chat-Dienstkonto autorisieren. chat@system.gserviceaccount.com als Aufrufer.

Die folgenden Schritte zeigen, wie Cloud Functions (1. Generation) verwendet wird:

Console

Nach der Bereitstellung der Funktion in Google Cloud:

  1. Wechseln Sie in der Google Cloud Console zur Seite Cloud Functions:

    Zu Cloud Functions

  2. Klicken Sie in der Cloud Functions-Liste auf das Kästchen neben dem . (Klicken Sie nicht auf die Funktion selbst.)

  3. Klicken Sie oben auf dem Bildschirm auf Berechtigungen. Der Bereich Berechtigungen wird geöffnet.

  4. Klicken Sie auf Hauptkonto hinzufügen.

  5. Geben Sie im Feld Neue Hauptkonten chat@system.gserviceaccount.com ein.

  6. Wählen Sie die Rolle Cloud Functions aus > Cloud Functions Invoker vom Drop-down-Menü Rolle auswählen aus.

  7. Klicken Sie auf Speichern.

gcloud

Führen Sie den Befehl gcloud functions add-iam-policy-binding aus:

gcloud functions add-iam-policy-binding RECEIVING_FUNCTION \
  --member='serviceAccount:chat@system.gserviceaccount.com' \
  --role='roles/cloudfunctions.invoker'

Ersetzen Sie RECEIVING_FUNCTION durch den Namen Ihres Die Funktion der Chat-App

Die folgenden Schritte zeigen, wie Sie Cloud Functions (2. Generation) oder Cloud Run-Dienste verwenden:

Console

Nach der Bereitstellung der Funktion oder des Dienstes in Google Cloud:

  1. Rufen Sie in der Google Cloud Console die Seite „Cloud Run“ auf:

    Zu Cloud Run

  2. Klicken Sie in der Liste der Cloud Run-Dienste auf das Kästchen neben dem . (Klicken Sie nicht auf die Funktion selbst.)

  3. Klicken Sie oben auf dem Bildschirm auf Berechtigungen. Der Bereich Berechtigungen wird geöffnet.

  4. Klicken Sie auf Hauptkonto hinzufügen.

  5. Geben Sie im Feld Neue Hauptkonten chat@system.gserviceaccount.com ein.

  6. Wählen Sie die Rolle Cloud Run aus > Cloud Run Invoker vom Drop-down-Menü Rolle auswählen aus.

  7. Klicken Sie auf Speichern.

gcloud

Führen Sie den Befehl gcloud functions add-invoker-policy-binding aus:

gcloud functions add-invoker-policy-binding RECEIVING_FUNCTION \
  --member='serviceAccount:chat@system.gserviceaccount.com'

Ersetzen Sie RECEIVING_FUNCTION durch den Namen Ihres Die Funktion der Chat-App

Anfragen mit einem App-URL-ID-Token authentifizieren

Wenn das Feld „Authentifizierungsziel“ der Chat-App Verbindungseinstellung auf App URL gesetzt ist, Das Inhaberautorisierungstoken in der Anfrage ist ein von Google signiertes OpenID Connect-Protokoll. (OIDC)-ID-Token. Das Feld email ist auf chat@system.gserviceaccount.com gesetzt. Das Feld „audience“ ist auf die URL festgelegt, die Sie in Google Chat gesendet haben an Ihre Chat-App senden. Wenn zum Beispiel der Parameter konfigurierter Endpunkt Ihrer Chat-App ist https://example.com/app/ lautet, lautet das Feld audience im ID-Token https://example.com/app/.

In den folgenden Beispielen wird gezeigt, wie überprüft werden kann, ob das Inhabertoken von Google Chat und verwenden Sie die Google OAuth-Clientbibliothek für das Targeting Ihrer App.

Java

java/basic-app/src/main/java/com/google/chat/app/basic/App.java
String CHAT_ISSUER = "chat@system.gserviceaccount.com";
JsonFactory factory = JacksonFactory.getDefaultInstance();

GoogleIdTokenVerifier verifier =
    new GoogleIdTokenVerifier.Builder(new ApacheHttpTransport(), factory)
        .setAudience(Collections.singletonList(AUDIENCE))
        .build();

GoogleIdToken idToken = GoogleIdToken.parse(factory, bearer);
return idToken != null
    && verifier.verify(idToken)
    && idToken.getPayload().getEmailVerified()
    && idToken.getPayload().getEmail().equals(CHAT_ISSUER);

Python

python/basic-app/main.py
# Bearer Tokens received by apps will always specify this issuer.
CHAT_ISSUER = 'chat@system.gserviceaccount.com'

try:
    # Verify valid token, signed by CHAT_ISSUER, intended for a third party.
    request = requests.Request()
    token = id_token.verify_oauth2_token(bearer, request, AUDIENCE)
    return token['email'] == CHAT_ISSUER

except:
    return False

Node.js

node/basic-app/index.js
// Bearer Tokens received by apps will always specify this issuer.
const chatIssuer = 'chat@system.gserviceaccount.com';

// Verify valid token, signed by chatIssuer, intended for a third party.
try {
  const ticket = await client.verifyIdToken({
    idToken: bearer,
    audience: audience
  });
  return ticket.getPayload().email_verified
      && ticket.getPayload().email === chatIssuer;
} catch (unused) {
  return false;
}

Anfragen mit einem JWT der Projektnummer authentifizieren

Wenn das Feld „Authentifizierungsziel“ der Chat-App Verbindungseinstellung auf Project Number gesetzt ist, ist das Inhaberautorisierungstoken in der Anfrage ein selbst signiertes JSON-Webtoken (JWT) von chat@system.gserviceaccount.com ausgestellt und unterzeichnet. Das Feld audience ist auf die von Ihnen verwendete Google Cloud-Projektnummer festgelegt um Ihre Chat-App zu erstellen. Wenn zum Beispiel Die Cloud-Projektnummer der Chat-App lautet 1234567890 enthält, ist das Feld audience im JWT 1234567890.

In den folgenden Beispielen wird gezeigt, wie überprüft werden kann, ob das Inhabertoken von Google Chat und verwenden Sie die Google OAuth-Clientbibliothek für das Targeting Ihres Projekts.

Java

java/basic-app/src/main/java/com/google/chat/app/basic/App.java
String CHAT_ISSUER = "chat@system.gserviceaccount.com";
JsonFactory factory = JacksonFactory.getDefaultInstance();

GooglePublicKeysManager keyManagerBuilder =
    new GooglePublicKeysManager.Builder(new ApacheHttpTransport(), factory)
        .setPublicCertsEncodedUrl(
            "https://www.googleapis.com/service_accounts/v1/metadata/x509/" + CHAT_ISSUER)
        .build();

GoogleIdTokenVerifier verifier =
    new GoogleIdTokenVerifier.Builder(keyManagerBuilder).setIssuer(CHAT_ISSUER).build();

GoogleIdToken idToken = GoogleIdToken.parse(factory, bearer);
return idToken != null
    && verifier.verify(idToken)
    && idToken.verifyAudience(Collections.singletonList(AUDIENCE))
    && idToken.verifyIssuer(CHAT_ISSUER);

Python

python/basic-app/main.py
# Bearer Tokens received by apps will always specify this issuer.
CHAT_ISSUER = 'chat@system.gserviceaccount.com'

try:
    # Verify valid token, signed by CHAT_ISSUER, intended for a third party.
    request = requests.Request()
    certs_url = 'https://www.googleapis.com/service_accounts/v1/metadata/x509/' + CHAT_ISSUER
    token = id_token.verify_token(bearer, request, AUDIENCE, certs_url)
    return token['iss'] == CHAT_ISSUER

except:
    return False

Node.js

node/basic-app/index.js
// Bearer Tokens received by apps will always specify this issuer.
const chatIssuer = 'chat@system.gserviceaccount.com';

// Verify valid token, signed by CHAT_ISSUER, intended for a third party.
try {
  const response = await fetch('https://www.googleapis.com/service_accounts/v1/metadata/x509/' + chatIssuer);
  const certs = await response.json();
  await client.verifySignedJwtWithCertsAsync(
    bearer, certs, audience, [chatIssuer]);
  return true;
} catch (unused) {
  return false;
}