Google Chat থেকে অনুরোধ যাচাই করুন

HTTP এন্ডপয়েন্টের উপর তৈরি Google Chat অ্যাপের জন্য, এই বিভাগটি ব্যাখ্যা করে যে কীভাবে আপনার এন্ডপয়েন্টের অনুরোধগুলি Chat থেকে এসেছে তা যাচাই করবেন।

আপনার চ্যাট অ্যাপের এন্ডপয়েন্টে ইন্টারঅ্যাকশন ইভেন্ট পাঠানোর জন্য, Google আপনার পরিষেবাতে অনুরোধ করে। অনুরোধটি Google থেকে আসছে কিনা তা যাচাই করার জন্য, Chat আপনার এন্ডপয়েন্টে প্রতিটি HTTPS অনুরোধের Authorization হেডারে একটি bearer টোকেন অন্তর্ভুক্ত করে। উদাহরণস্বরূপ:

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

পূর্ববর্তী উদাহরণে AbCdEf123456 স্ট্রিংটি হল bearer authorization token। এটি Google দ্বারা তৈরি একটি ক্রিপ্টোগ্রাফিক টোকেন। bearer টোকেনের ধরণ এবং audience ফিল্ডের মান Chat অ্যাপ কনফিগার করার সময় আপনি যে ধরণের প্রমাণীকরণ audience token নির্বাচন করেছেন তার উপর নির্ভর করে।

যদি আপনি আপনার চ্যাট অ্যাপটি ক্লাউড রান ফাংশন ব্যবহার করে বাস্তবায়ন করে থাকেন, তাহলে ক্লাউড আইএএম স্বয়ংক্রিয়ভাবে টোকেন যাচাইকরণ পরিচালনা করে। আপনাকে অবশ্যই গুগল চ্যাট পরিষেবা অ্যাকাউন্টটি একটি অনুমোদিত ইনভোকার হিসেবে যুক্ত করতে হবে। যদি আপনার অ্যাপটি নিজস্ব HTTP সার্ভার বাস্তবায়ন করে, তাহলে আপনি একটি ওপেন সোর্স গুগল এপিআই ক্লায়েন্ট লাইব্রেরি ব্যবহার করে আপনার বেয়ারার টোকেন যাচাই করতে পারেন:

যদি টোকেনটি চ্যাট অ্যাপের জন্য যাচাই না করে, তাহলে আপনার পরিষেবাটি HTTPS রেসপন্স কোড 401 (Unauthorized) দিয়ে অনুরোধের জবাব দেবে।

ক্লাউড রান ফাংশন ব্যবহার করে অনুরোধগুলি প্রমাণীকরণ করুন

যদি আপনার ফাংশন লজিক ক্লাউড রান ফাংশন ব্যবহার করে বাস্তবায়িত হয়, তাহলে আপনাকে চ্যাট অ্যাপ সংযোগ সেটিংয়ের প্রমাণীকরণ শ্রোতা ক্ষেত্রে HTTP এন্ডপয়েন্ট URL নির্বাচন করতে হবে এবং নিশ্চিত করতে হবে যে কনফিগারেশনে HTTP এন্ডপয়েন্ট URLটি ক্লাউড রান ফাংশন এন্ডপয়েন্টের URL এর সাথে মিলে যায়।

তারপর, আপনাকে নিম্নলিখিত পদক্ষেপগুলি ব্যবহার করে Google Chat পরিষেবা অ্যাকাউন্ট chat@system.gserviceaccount.com কে একটি ইনভোকার হিসেবে অনুমোদন করতে হবে:

কনসোল

গুগল ক্লাউডে আপনার ফাংশন বা পরিষেবা স্থাপনের পরে:

  1. গুগল ক্লাউড কনসোলে, ক্লাউড রান পৃষ্ঠায় যান:

    ক্লাউড রানে যান

  2. ক্লাউড রান সার্ভিসেস তালিকায়, রিসিভিং ফাংশনের পাশে থাকা চেকবক্সে ক্লিক করুন। (ফাংশনটিতেই ক্লিক করবেন না।)

  3. স্ক্রিনের উপরে Permissions-এ ক্লিক করুন। Permissions প্যানেলটি খোলে।

  4. প্রধান যোগ করুন ক্লিক করুন।

  5. নতুন প্রিন্সিপালস ক্ষেত্রে, chat@system.gserviceaccount.com লিখুন।

  6. "একটি ভূমিকা নির্বাচন করুন" মেনু থেকে, "ক্লাউড রান" ভূমিকাটি নির্বাচন করুন।

    ক্লাউড রান ইনভোকার

  7. সংরক্ষণ করুন ক্লিক করুন।

জিক্লাউড

gcloud functions add-invoker-policy-binding কমান্ডটি ব্যবহার করুন:

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

আপনার চ্যাট অ্যাপের ফাংশনের নাম দিয়ে RECEIVING_FUNCTION প্রতিস্থাপন করুন।

একটি আইডি টোকেন ব্যবহার করে HTTP অনুরোধগুলি প্রমাণীকরণ করুন

যদি চ্যাট অ্যাপ সংযোগ সেটিংয়ের প্রমাণীকরণ শ্রোতা ক্ষেত্রটি HTTP এন্ডপয়েন্ট URL এ সেট করা থাকে, তাহলে অনুরোধে থাকা বহনকারী অনুমোদন টোকেনটি একটি Google-স্বাক্ষরিত OpenID Connect (OIDC) আইডি টোকেন হবে। email ক্ষেত্রটি chat@system.gserviceaccount.com এ সেট করা আছে। প্রমাণীকরণ শ্রোতা ক্ষেত্রটি আপনার চ্যাট অ্যাপে অনুরোধ পাঠানোর জন্য Google Chat কনফিগার করা URL এ সেট করা আছে। উদাহরণস্বরূপ, যদি আপনার চ্যাট অ্যাপের কনফিগার করা শেষ বিন্দু https://example.com/app/ হয়, তাহলে আইডি টোকেনে প্রমাণীকরণ শ্রোতা ক্ষেত্রটি https://example.com/app/ হবে।

যদি আপনার HTTP এন্ডপয়েন্ট IAM-ভিত্তিক প্রমাণীকরণ সমর্থন করে এমন কোনও পরিষেবাতে (যেমন ক্লাউড রান) হোস্ট না করা হয়, তাহলে এটি প্রস্তাবিত প্রমাণীকরণ পদ্ধতি। এই পদ্ধতি ব্যবহার করে, আপনার HTTP পরিষেবাটি যেখানে চলছে সেই এন্ডপয়েন্টের URL সম্পর্কে তথ্যের প্রয়োজন, কিন্তু ক্লাউড প্রকল্প নম্বর সম্পর্কে তথ্যের প্রয়োজন নেই।

নিম্নলিখিত নমুনাগুলি দেখায় যে কীভাবে বেয়ারার টোকেনটি Google Chat দ্বারা জারি করা হয়েছে এবং Google OAuth ক্লায়েন্ট লাইব্রেরি ব্যবহার করে আপনার অ্যাপকে লক্ষ্য করে তৈরি করা হয়েছে তা যাচাই করবেন।

জাভা

জাভা/বেসিক-অ্যাপ/এসআরসি/মেইন/জাভা/কম/গুগল/চ্যাট/অ্যাপ/বেসিক/অ্যাপ.জাভা
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);

পাইথন

পাইথন/বেসিক-অ্যাপ/মেইন.পি
# 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

নোড.জেএস

নোড/বেসিক-অ্যাপ/ইন্ডেক্স.জেএস
// 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 এ সেট করা থাকে, তাহলে অনুরোধে থাকা bearer authorization টোকেনটি একটি স্ব-স্বাক্ষরিত JSON Web Token (JWT) হবে, যা chat@system.gserviceaccount.com দ্বারা জারি এবং স্বাক্ষরিত হবে। audience ক্ষেত্রটি আপনার চ্যাট অ্যাপ তৈরি করার জন্য ব্যবহৃত Google Cloud Project নম্বরে সেট করা আছে। উদাহরণস্বরূপ, যদি আপনার Chat অ্যাপের Cloud Project নম্বর 1234567890 হয়, তাহলে JWT এর audience ক্ষেত্রটি 1234567890 হবে।

এই প্রমাণীকরণ পদ্ধতিটি শুধুমাত্র তখনই সুপারিশ করা হয় যখন আপনি HTTP এন্ডপয়েন্ট URL এর পরিবর্তে ক্লাউড প্রজেক্ট নম্বর ব্যবহার করে অনুরোধ যাচাই করতে চান। উদাহরণস্বরূপ, যদি আপনি একই ক্লাউড প্রজেক্ট নম্বর রেখে সময়ের সাথে সাথে এন্ডপয়েন্ট URL পরিবর্তন করতে চান, অথবা যদি আপনি একাধিক ক্লাউড প্রজেক্ট নম্বরের জন্য একই এন্ডপয়েন্ট ব্যবহার করতে চান এবং ক্লাউড প্রজেক্ট নম্বরের তালিকার সাথে audience ক্ষেত্র তুলনা করতে চান।

নিম্নলিখিত নমুনাগুলি দেখায় যে কীভাবে বেয়ারার টোকেনটি Google Chat দ্বারা জারি করা হয়েছে এবং Google OAuth ক্লায়েন্ট লাইব্রেরি ব্যবহার করে আপনার প্রকল্পের লক্ষ্যবস্তুতে তৈরি করা হয়েছে তা যাচাই করবেন।

জাভা

জাভা/বেসিক-অ্যাপ/এসআরসি/মেইন/জাভা/কম/গুগল/চ্যাট/অ্যাপ/বেসিক/অ্যাপ.জাভা
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);

পাইথন

পাইথন/বেসিক-অ্যাপ/মেইন.পি
# 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

নোড.জেএস

নোড/বেসিক-অ্যাপ/ইন্ডেক্স.জেএস
// 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;
}