Google Chat'ten gelen istekleri doğrulama

Bu bölümde, HTTP uç noktaları üzerine oluşturulan Google Chat uygulamaları için Uç noktanıza gönderilen isteklerin Chat'ten geldiğini doğrulayın.

Etkileşim etkinliklerini Chat uygulamanızın uç noktanız olduğunda Google, hizmetinize istek yapar. Bu isteğin Chat, Google'dan geliyor. Chat'te hamiline ait jeton ifadesini Authorization arayın. Örneğin:

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

Önceki örnekte bulunan AbCdEf123456 dizesi, hamiline ait yetkilendirmedir jeton. Bu, Google tarafından oluşturulan bir şifreleme jetonudur. Taşıyıcının türü ve jetonun değerini audience alanı, verileri yapılandırmanın önemli bir yoludur. Chat uygulamasını yapılandırma.

Chat uygulamanızı Cloud kullanarak uyguladıysanız Functions veya Cloud Run olan Cloud IAM, jeton doğrulamasını otomatik olarak gerçekleştirir. Siz Google Chat hizmet hesabını yetkili bir çağrıcı olarak eklemeniz yeterlidir. Uygulamanız kendi HTTP sunucusunu uyguluyorsa hamiline ait jetonunuzu doğrulayabilirsiniz Açık kaynak bir Google API istemci kitaplığı kullanarak:

Jeton Chat uygulaması için doğrulama yapmazsa hizmeti, isteğe bir HTTPS yanıt koduyla yanıt vermelidir 401 (Unauthorized)

Cloud Functions veya Cloud Run kullanarak isteklerin kimliğini doğrulama

İşlev mantığınız Cloud Functions veya Cloud Run kullanılarak uygulanırsa App URL Chat uygulaması bağlantı ayarınızı yapın ve uygulama URL'si Cloud Functions işlevinin URL'sine veya Cloud Run uç noktası.

Ardından, Google Chat hizmet hesabını yetkilendirmeniz gerekir Çağrı yapan olarak chat@system.gserviceaccount.com.

Aşağıdaki adımlarda Cloud Functions'ın (1. nesil) nasıl kullanılacağı gösterilmektedir:

Konsol

İşlevinizi Google Cloud'a dağıttıktan sonra:

  1. Google Cloud Console'da Cloud Functions sayfasına gidin:

    Cloud Functions'a git

  2. Cloud Functions listesinde, alıcı yapılandırmasının yanındaki onay kutusunu işaretleyin. işlevini kullanın. (İşlevi tıklamayın.)

  3. Ekranın üst kısmındaki İzinler'i tıklayın. İzinler paneli açılır.

  4. Ana hesap ekle'yi tıklayın.

  5. Yeni ana hesaplar alanına chat@system.gserviceaccount.com yazın.

  6. Cloud Functions rolünü seçin > Cloud Functions Çağırıcısı'na Bir rol seçin açılır menüsü.

  7. Kaydet'i tıklayın.

gcloud

gcloud functions add-iam-policy-binding komutunu kullanın:

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

RECEIVING_FUNCTION yerine Chat uygulamasının işlevi.

Aşağıdaki adımlarda, Cloud Functions (2. nesil) veya Cloud Run hizmetlerinin nasıl kullanılacağı gösterilmektedir:

Konsol

İşlevinizi veya hizmetinizi Google Cloud'a dağıttıktan sonra:

  1. Google Cloud Console'da Cloud Run sayfasına gidin:

    Cloud Run'a git

  2. Cloud Run hizmetleri listesinde alıcı hizmet sağlayıcısının yanındaki onay kutusunu işaretleyin. işlevini kullanın. (İşlevi tıklamayın.)

  3. Ekranın üst kısmındaki İzinler'i tıklayın. İzinler paneli açılır.

  4. Ana hesap ekle'yi tıklayın.

  5. Yeni ana hesaplar alanına chat@system.gserviceaccount.com yazın.

  6. Cloud Run rolünü seçin > Cloud Run Çağırıcısı'nı kullanarak Bir rol seçin açılır menüsü.

  7. Kaydet'i tıklayın.

gcloud

gcloud functions add-invoker-policy-binding komutunu kullanın:

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

RECEIVING_FUNCTION yerine Chat uygulamasının işlevi.

Uygulama URL'si Kimliği Jetonu ile isteklerin kimliğini doğrulama

Chat uygulamasının Authentication Audience (Kimlik Doğrulama Kitlesi) alanında bağlantı ayarı App URL olarak belirlenmişse istekteki hamiline ait yetkilendirme jetonu Google tarafından imzalanmış bir RFC Connect'tir (OIDC) Kimlik jetonu. email alanı chat@system.gserviceaccount.com olarak ayarlanmış. audience alanı, Google Chat'in göndermek için yapılandırdığınız URL'ye ayarlandı isteklerinizi karşılayın. Örneğin, yapılandırılmış uç noktasıdır. https://example.com/app/ ise kimlik jetonundaki audience alanı https://example.com/app/.

Aşağıdaki örnekler, hamiline ait jetonun Google tarafından verilmiş olduğunun nasıl doğrulanacağını Google Chat'te yer alır ve Google OAuth istemci kitaplığı kullanılarak uygulamanızı hedefler.

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

Proje Numarası JWT ile isteklerin kimliğini doğrulama

Chat uygulamasının Authentication Audience (Kimlik Doğrulama Kitlesi) alanında bağlantı ayarı Project Number olarak belirlendiyse istekteki hamiline ait yetkilendirme jetonu kendinden imzalı bir JSON Web Token (JWT), chat@system.gserviceaccount.com tarafından düzenlenmiş ve imzalanmıştır. audience alanı, kullandığınız Google Cloud projesi numarasına ayarlanır. inceleyebilirsiniz. Örneğin, Chat uygulamasının Cloud proje numarası: 1234567890 ise JWT'deki audience alanı 1234567890 olur.

Aşağıdaki örnekler, hamiline ait jetonun Google tarafından verilmiş olduğunun nasıl doğrulanacağını Google Chat ile çalışır ve Google OAuth istemci kitaplığı kullanılarak projenizi hedefler.

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