درخواست‌های Google Chat را تأیید کنید

برای برنامه‌های گپ Google که بر روی نقاط پایانی HTTP ساخته شده‌اند، این بخش نحوه تأیید اینکه درخواست‌ها به نقطه پایانی شما از Chat می‌آیند را توضیح می‌دهد.

برای ارسال رویدادهای تعاملی به نقطه پایانی برنامه گپ، Google درخواست‌هایی را به سرویس شما ارسال می‌کند. برای تأیید اینکه درخواست از طرف Google ارسال می‌شود، Chat شامل یک نشانه حامل در سرصفحه Authorization هر درخواست HTTPS به نقطه پایانی شما می‌شود. به عنوان مثال:

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

رشته AbCdEf123456 در مثال قبل نشانه مجوز حامل است. این یک توکن رمزنگاری است که توسط گوگل تولید شده است. نوع رمز حامل و مقدار فیلد audience به نوع مخاطب احراز هویتی که هنگام پیکربندی برنامه چت انتخاب کرده اید بستگی دارد.

اگر برنامه چت خود را با استفاده از Cloud Functions یا Cloud Run پیاده‌سازی کرده‌اید، Cloud IAM به‌طور خودکار تأیید توکن را انجام می‌دهد. فقط باید حساب سرویس Google Chat را به عنوان یک فراخوان مجاز اضافه کنید. اگر برنامه شما سرور HTTP خود را پیاده‌سازی می‌کند، می‌توانید توکن حامل خود را با استفاده از کتابخانه مشتری Google API منبع باز تأیید کنید:

اگر رمز برای برنامه چت تأیید نشد، سرویس شما باید با کد پاسخ HTTPS 401 (Unauthorized) به درخواست پاسخ دهد.

درخواست ها را با استفاده از توابع Cloud یا Cloud Run تأیید کنید

اگر منطق عملکرد شما با استفاده از توابع Cloud یا Cloud Run پیاده‌سازی شده است، باید App URL در قسمت Authentication Audience تنظیمات اتصال برنامه Chat انتخاب کنید و مطمئن شوید که URL برنامه در پیکربندی با URL عملکرد Cloud یا Cloud Run مطابقت دارد. نقطه پایانی

سپس، باید حساب سرویس Google Chat [email protected] را به عنوان یک فراخوان مجاز کنید.

مراحل زیر نحوه استفاده از توابع ابری (نسل اول) را نشان می دهد:

کنسول

پس از استقرار عملکرد خود در Google Cloud:

  1. در کنسول Google Cloud، به صفحه Cloud Functions بروید:

    به Cloud Functions بروید

  2. در فهرست توابع ابری، روی کادر کنار تابع دریافت کلیک کنید. (روی خود تابع کلیک نکنید.)

  3. روی Permissions در بالای صفحه کلیک کنید. پانل مجوزها باز می شود.

  4. روی افزودن اصلی کلیک کنید.

  5. در قسمت New principals ، [email protected] را وارد کنید.

  6. نقش Cloud Functions > Cloud Functions Invoker را از منوی کشویی Select a role انتخاب کنید.

  7. روی ذخیره کلیک کنید.

gcloud

از دستور gcloud functions add-iam-policy-binding استفاده کنید:

gcloud functions add-iam-policy-binding RECEIVING_FUNCTION \
  --member='serviceAccount:[email protected]' \
  --role='roles/cloudfunctions.invoker'

RECEIVING_FUNCTION با نام عملکرد برنامه چت خود جایگزین کنید.

مراحل زیر نحوه استفاده از سرویس‌های Cloud Function (نسل دوم) یا Cloud Run را نشان می‌دهد:

کنسول

پس از استقرار عملکرد یا سرویس خود در Google Cloud:

  1. در کنسول Google Cloud، به صفحه Cloud Run بروید:

    به Cloud Run بروید

  2. در لیست خدمات Cloud Run، روی کادر کنار تابع دریافت کلیک کنید. (روی خود تابع کلیک نکنید.)

  3. روی Permissions در بالای صفحه کلیک کنید. پانل مجوزها باز می شود.

  4. روی افزودن اصلی کلیک کنید.

  5. در قسمت New principals ، [email protected] را وارد کنید.

  6. نقش Cloud Run > Cloud Run Invoker را از منوی کشویی Select a role انتخاب کنید.

  7. روی ذخیره کلیک کنید.

gcloud

از دستور gcloud functions add-invoker-policy-binding استفاده کنید:

gcloud functions add-invoker-policy-binding RECEIVING_FUNCTION \
  --member='serviceAccount:[email protected]'

RECEIVING_FUNCTION با نام عملکرد برنامه چت خود جایگزین کنید.

احراز هویت درخواست‌ها را با کد نشانی وب برنامه

اگر قسمت Authentication Audience تنظیمات اتصال برنامه گپ روی App URL تنظیم شده باشد، نشانه مجوز حامل در درخواست یک نشانه شناسه OpenID Connect (OIDC) امضا شده توسط Google است. فیلد email روی [email protected] تنظیم شده است. فیلد audience روی نشانی اینترنتی که Google Chat را برای ارسال درخواست‌ها به برنامه چت خود پیکربندی کرده‌اید، تنظیم شده است. به عنوان مثال، اگر نقطه پایانی پیکربندی شده برنامه چت شما https://example.com/app/ باشد، فیلد audience در نشانه شناسه https://example.com/app/ است.

نمونه‌های زیر نشان می‌دهند که چگونه می‌توان تأیید کرد که توکن حامل توسط Google Chat صادر شده و برنامه شما را با استفاده از کتابخانه سرویس گیرنده Google OAuth هدف قرار داده است.

جاوا

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

درخواست‌ها را با شماره پروژه JWT تأیید کنید

اگر قسمت Authentication Audience در تنظیمات اتصال برنامه گپ روی Project Number تنظیم شده باشد، نشانه مجوز حامل در درخواست، یک نشانه وب JSON (JWT) است که توسط [email protected] صادر و امضا شده است. فیلد audience روی شماره پروژه Google Cloud که برای ساختن برنامه چت خود استفاده کردید تنظیم شده است. برای مثال، اگر شماره پروژه Cloud برنامه Chat شما 1234567890 باشد، فیلد audience در JWT 1234567890 است.

نمونه‌های زیر نشان می‌دهند که چگونه می‌توان تأیید کرد که توکن حامل توسط Google Chat صادر شده و پروژه شما را با استفاده از کتابخانه سرویس گیرنده Google OAuth هدف قرار داده است.

جاوا

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