التحقّق من الطلبات من Google Chat

بالنسبة إلى تطبيقات Google Chat المستندة إلى نقاط نهاية HTTP، يوضّح هذا القسم كيفية التحقّق من أنّ الطلبات إلى نقطة النهاية واردة من Chat

لإرسال أحداث التفاعل إلى تطبيق Chat نقطة النهاية، تقدم Google طلبات إلى خدمتك. وللتحقق من أن الطلب الواردة من Google، يتضمن Chat رمز الحامل المميز في الرأس Authorization لكل طلب HTTPS إلى نقطة النهاية. على سبيل المثال:

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

السلسلة AbCdEf123456 في المثال السابق هي تفويض الحامل الرمز المميز. هذا الرمز هو رمز تشفيري أنشأته Google. نوع الحامل الرمز وقيمة audience على نوع جمهور المصادقة الذي اخترته عند ضبط تطبيق Chat

في حال كنت قد نفّذت تطبيق Chat باستخدام السحابة الإلكترونية الوظائف أو Cloud Run، تتولى Cloud IAM إثبات ملكية الرموز المميزة تلقائيًا. إِنْتَ إضافة حساب خدمة Google Chat كمُتصل معتمد. إذا كان تطبيقك ينفِّذ خادم HTTP الخاص به، يمكنك التحقّق من رمز المرور المميّز باستخدام مكتبة عملاء واجهة برمجة تطبيقات Google مفتوحة المصدر:

إذا لم يتم إثبات صحة الرمز المميّز لتطبيق Chat، يجب أن تُجيب خدمتك عن الطلب باستخدام رمز استجابة HTTPS 401 (Unauthorized).

مصادقة الطلبات باستخدام دوال Cloud أو Cloud Run

في حال تنفيذ منطق الدالة باستخدام دوال Cloud أو تشغيل Cloud، اختيار عنوان URL لنقطة نهاية HTTP في الحقل Authentication Audience (جمهور المصادقة) في تطبيق Chat إعداد الاتصال والتأكد من يتوافق عنوان URL لنقطة نهاية HTTP في الإعدادات مع عنوان URL لدالة السحابة الإلكترونية أو نقطة نهاية تشغيل السحابة الإلكترونية.

بعد ذلك، عليك تفويض حساب خدمة Google Chat. "chat@system.gserviceaccount.com" كمتصل.

توضّح الخطوات التالية كيفية استخدام دوال Cloud (الجيل الأول):

وحدة التحكّم

بعد نشر الدالة على Google Cloud:

  1. في وحدة تحكّم Google Cloud، انتقِل إلى صفحة Cloud Functions:

    الانتقال إلى وظائف السحابة الإلكترونية

  2. في قائمة "دوال السحابة الإلكترونية"، انقر على مربّع الاختيار بجانب مربّع الاختيار الأخرى. (لا تنقر على الدالة نفسها.)

  3. النقر على الأذونات في أعلى الشاشة تفتح لوحة الأذونات .

  4. انقر على إضافة مدير.

  5. في الحقل القواعد الرئيسية الجديدة، أدخِل chat@system.gserviceaccount.com.

  6. اختَر الدور Cloud Functions > Cloud Functions Invoker من القائمة المنسدلة اختيار دور.

  7. انقر على حفظ.

gcloud

استخدِم الأمر gcloud functions add-iam-policy-binding:

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

استبدِل RECEIVING_FUNCTION باسم وظيفة تطبيق Chat

توضّح الخطوات التالية كيفية استخدام خدمات Cloud Functions (الجيل الثاني) أو Cloud Run:

وحدة التحكّم

بعد نشر الدالة أو الخدمة على Google Cloud:

  1. في Google Cloud Console، انتقِل إلى صفحة "تشغيل السحابة الإلكترونية":

    الانتقال إلى Cloud Run

  2. في قائمة خدمات Cloud Run، انقر على مربّع الاختيار بجانب دالّة الاستقبال . (لا تنقر على الدالة نفسها.)

  3. النقر على الأذونات في أعلى الشاشة تفتح لوحة الأذونات .

  4. انقر على إضافة مدير.

  5. في الحقل القواعد الرئيسية الجديدة، أدخِل chat@system.gserviceaccount.com.

  6. اختَر الدور تشغيل السحابة الإلكترونية > Cloud Run Invoker من اختيار دور

  7. انقر على حفظ.

gcloud

استخدِم الأمر gcloud functions add-invoker-policy-binding:

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

استبدِل RECEIVING_FUNCTION باسم دالة تطبيق Chat.

مصادقة طلبات HTTP باستخدام الرمز المميّز للمعرّف

إذا كان حقل Authentication Audience (جمهور المصادقة) في تطبيق Chat تم ضبط إعداد الاتصال على عنوان URL لنقطة نهاية HTTP الرمز المميز لتفويض الحامل في الطلب هو OpenID Connect من Google الرمز المميّز للمعرّف (OIDC) تم ضبط الحقل email على chat@system.gserviceaccount.com. يتم ضبط حقل Authentication Audience (جمهور المصادقة) على عنوان URL الذي أعددته لتطبيق Google Chat لإرسال الطلبات إلى تطبيق Chat. على سبيل المثال، إذا كانت نقطة النهاية التي تم ضبطها لتطبيق Chat هي https://example.com/app/، سيكون حقل Authentication Audience (جمهور المصادقة) في الرمز المميّز للتعريف هوhttps://example.com/app/.

توضح النماذج التالية كيفية التحقق من إصدار رمز الحامل بواسطة Google Chat واستهدف تطبيقك باستخدام مكتبة برامج Google OAuth.

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

العقدة/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;
}

مصادقة الطلبات باستخدام رمز JWT الخاص برقم المشروع

إذا كان حقل Authentication Audience (جمهور المصادقة) في تطبيق Chat تم ضبط إعداد الاتصال على Project Number، والرمز المميز لتفويض الحامل في الطلب هو رمز موقَّع ذاتيًا. رمز JSON المميّز للويب (JWT) وإصدار وتوقيع chat@system.gserviceaccount.com. تم ضبط الحقل audience على رقم مشروع Google Cloud الذي استخدمته. لإنشاء تطبيق Chat. على سبيل المثال، إذا كان رقم مشروع Cloud لتطبيق Chat هو 1234567890، ثم الحقل audience في JWT هو 1234567890.

توضح النماذج التالية كيفية التحقق من إصدار رمز الحامل بواسطة Google Chat واستهدف مشروعك باستخدام مكتبة عملاء Google OAuth.

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

العقدة/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;
}