برای برنامههای گپ 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://github.com/google/google-api-java-client
- پایتون : https://github.com/google/google-api-python-client
- Node.js : https://github.com/google/google-api-nodejs-client
- دات نت : https://github.com/google/google-api-dotnet-client
اگر رمز برای برنامه چت تأیید نشد، سرویس شما باید با کد پاسخ 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:
در کنسول Google Cloud، به صفحه Cloud Functions بروید:
در فهرست توابع ابری، روی کادر کنار تابع دریافت کلیک کنید. (روی خود تابع کلیک نکنید.)
روی Permissions در بالای صفحه کلیک کنید. پانل مجوزها باز می شود.
روی افزودن اصلی کلیک کنید.
در قسمت New principals ،
[email protected]
را وارد کنید.نقش Cloud Functions > Cloud Functions Invoker را از منوی کشویی Select a role انتخاب کنید.
روی ذخیره کلیک کنید.
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:
در کنسول Google Cloud، به صفحه Cloud Run بروید:
در لیست خدمات Cloud Run، روی کادر کنار تابع دریافت کلیک کنید. (روی خود تابع کلیک نکنید.)
روی Permissions در بالای صفحه کلیک کنید. پانل مجوزها باز می شود.
روی افزودن اصلی کلیک کنید.
در قسمت New principals ،
[email protected]
را وارد کنید.نقش Cloud Run > Cloud Run Invoker را از منوی کشویی Select a role انتخاب کنید.
روی ذخیره کلیک کنید.
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 هدف قرار داده است.
جاوا
import java.io.IOException;
import java.security.GeneralSecurityException;
import java.util.Collections;
import com.google.api.client.googleapis.auth.oauth2.GoogleIdToken;
import com.google.api.client.googleapis.auth.oauth2.GoogleIdTokenVerifier;
import com.google.api.client.googleapis.auth.oauth2.GooglePublicKeysManager;
import com.google.api.client.http.apache.ApacheHttpTransport;
import com.google.api.client.json.gson.GsonFactory;
import com.google.api.client.json.JsonFactory;
/** Tool for verifying JWT Tokens for Apps in Google Chat. */
public class JWTVerify {
// Bearer Tokens received by apps will always specify this issuer.
static String CHAT_ISSUER = "[email protected]";
// Intended audience of the token, which is the URL of the app.
static String AUDIENCE = "https://example.com/app/";
// Get this value from the request's Authorization HTTPS header.
// For example, for "Authorization: Bearer AbCdEf123456" use "AbCdEf123456".
static String BEARER_TOKEN = "AbCdEf123456";
public static void main(String[] args) throws GeneralSecurityException, IOException {
JsonFactory factory = new GsonFactory();
GoogleIdTokenVerifier verifier =
new GoogleIdTokenVerifier.Builder(new ApacheHttpTransport(), factory)
.setAudience(Collections.singletonList(AUDIENCE))
.build();
GoogleIdToken idToken = GoogleIdToken.parse(factory, BEARER_TOKEN);
if (idToken == null) {
System.out.println("Token cannot be parsed");
System.exit(-1);
}
// Verify valid token, signed by CHAT_ISSUER, intended for a third party.
if (!verifier.verify(idToken)
|| !idToken.getPayload().getEmailVerified()
|| !idToken.getPayload().getEmail().equals(CHAT_ISSUER)) {
System.out.println("Invalid token");
System.exit(-1);
}
// Token originates from Google and is targeted to a specific client.
System.out.println("The token is valid");
}
}
پایتون
import sys
from google.oauth2 import id_token
from google.auth.transport import requests
# Bearer Tokens received by apps will always specify this issuer.
CHAT_ISSUER = '[email protected]'
# Intended audience of the token, which is the URL of the app.
AUDIENCE = 'https://example.com/app/'
# Get this value from the request's Authorization HTTPS header.
# For example, for 'Authorization: Bearer AbCdEf123456' use 'AbCdEf123456'.
BEARER_TOKEN = 'AbCdEf123456'
try:
# Verify valid token, signed by CHAT_ISSUER, intended for a third party.
request = requests.Request()
token = id_token.verify_oauth2_token(BEARER_TOKEN, request, AUDIENCE)
if token['email'] != CHAT_ISSUER:
sys.exit('Invalid token')
except:
sys.exit('Invalid token')
# Token originates from Google and is targeted to a specific client.
print('The token is valid')
Node.js
import {OAuth2Client} from 'google-auth-library';
// Bearer Tokens received by apps will always specify this issuer.
const CHAT_ISSUER = '[email protected]';
// Intended audience of the token, which is the URL of the app.
const AUDIENCE = 'https://example.com/app/';
// Get this value from the request's Authorization HTTPS header.
// For example, for "Authorization: Bearer AbCdEf123456" use "AbCdEf123456"
const BEARER_TOKEN = 'AbCdEf123456';
const client = new OAuth2Client();
async function verify() {
// Verify valid token, signed by CHAT_ISSUER, intended for a third party.
try {
const ticket = await client.verifyIdToken({
idToken: BEARER_TOKEN,
audience: AUDIENCE
});
if (!ticket.getPayload().email_verified
|| ticket.getPayload().email !== CHAT_ISSUER) {
throw new Error('Invalid issuer');
}
} catch (unused) {
console.error('Invalid token');
process.exit(1);
}
// Token originates from Google and is targeted to a specific client.
console.log('The token is valid');
}
verify();
درخواستها را با شماره پروژه JWT تأیید کنید
اگر قسمت Authentication Audience در تنظیمات اتصال برنامه گپ روی Project Number
تنظیم شده باشد، نشانه مجوز حامل در درخواست، یک نشانه وب JSON (JWT) است که توسط [email protected]
صادر و امضا شده است. فیلد audience
روی شماره پروژه Google Cloud که برای ساختن برنامه چت خود استفاده کردید تنظیم شده است. برای مثال، اگر شماره پروژه Cloud برنامه Chat شما 1234567890
باشد، فیلد audience
در JWT 1234567890
است.
نمونههای زیر نشان میدهند که چگونه میتوان تأیید کرد که توکن حامل توسط Google Chat صادر شده و پروژه شما را با استفاده از کتابخانه سرویس گیرنده Google OAuth هدف قرار داده است.
جاوا
import java.io.IOException;
import java.security.GeneralSecurityException;
import java.util.Collections;
import com.google.api.client.googleapis.auth.oauth2.GoogleIdToken;
import com.google.api.client.googleapis.auth.oauth2.GoogleIdTokenVerifier;
import com.google.api.client.googleapis.auth.oauth2.GooglePublicKeysManager;
import com.google.api.client.http.apache.ApacheHttpTransport;
import com.google.api.client.json.gson.GsonFactory;
import com.google.api.client.json.JsonFactory;
/** Tool for verifying JWT Tokens for Apps in Google Chat. */
public class JWTVerify {
// Bearer Tokens received by apps will always specify this issuer.
static String CHAT_ISSUER = "[email protected]";
// Url to obtain the public certificate for the issuer.
static String PUBLIC_CERT_URL_PREFIX =
"https://www.googleapis.com/service_accounts/v1/metadata/x509/";
// Intended audience of the token, which is the project number of the app.
static String AUDIENCE = "1234567890";
// Get this value from the request's Authorization HTTPS header.
// For example, for "Authorization: Bearer AbCdEf123456" use "AbCdEf123456".
static String BEARER_TOKEN = "AbCdEf123456";
public static void main(String[] args) throws GeneralSecurityException, IOException {
JsonFactory factory = new GsonFactory();
GooglePublicKeysManager.Builder keyManagerBuilder =
new GooglePublicKeysManager.Builder(new ApacheHttpTransport(), factory);
String certUrl = PUBLIC_CERT_URL_PREFIX CHAT_ISSUER;
keyManagerBuilder.setPublicCertsEncodedUrl(certUrl);
GoogleIdTokenVerifier.Builder verifierBuilder =
new GoogleIdTokenVerifier.Builder(keyManagerBuilder.build());
verifierBuilder.setIssuer(CHAT_ISSUER);
GoogleIdTokenVerifier verifier = verifierBuilder.build();
GoogleIdToken idToken = GoogleIdToken.parse(factory, BEARER_TOKEN);
if (idToken == null) {
System.out.println("Token cannot be parsed");
System.exit(-1);
}
// Verify valid token, signed by CHAT_ISSUER, intended for a third party.
if (!verifier.verify(idToken)
|| !idToken.verifyAudience(Collections.singletonList(AUDIENCE))
|| !idToken.verifyIssuer(CHAT_ISSUER)) {
System.out.println("Invalid token");
System.exit(-1);
}
// Token originates from Google and is targeted to a specific client.
System.out.println("The token is valid");
}
}
پایتون
import sys
from google.oauth2 import id_token
from google.auth.transport import requests
# Bearer Tokens received by apps will always specify this issuer.
CHAT_ISSUER = '[email protected]'
# Url to obtain the public certificate for the issuer.
PUBLIC_CERT_URL_PREFIX = 'https://www.googleapis.com/service_accounts/v1/metadata/x509/'
# Intended audience of the token, which will be the project number of the app.
AUDIENCE = '1234567890'
# Get this value from the request's Authorization HTTPS header.
# For example, for 'Authorization: Bearer AbCdEf123456' use 'AbCdEf123456'.
BEARER_TOKEN = 'AbCdEf123456'
try:
# Verify valid token, signed by CHAT_ISSUER, intended for a third party.
request = requests.Request()
certs_url = PUBLIC_CERT_URL_PREFIX CHAT_ISSUER
token = id_token.verify_token(BEARER_TOKEN, request, AUDIENCE, certs_url)
if token['iss'] != CHAT_ISSUER:
sys.exit('Invalid issuer')
except:
sys.exit('Invalid token')
# Token originates from Google and is targeted to a specific client.
print('The token is valid')
Node.js
import fetch from 'node-fetch';
import {OAuth2Client} from 'google-auth-library';
// Bearer Tokens received by apps will always specify this issuer.
const CHAT_ISSUER = '[email protected]';
// Url to obtain the public certificate for the issuer.
const PUBLIC_CERT_URL_PREFIX =
'https://www.googleapis.com/service_accounts/v1/metadata/x509/';
// Intended audience of the token, which is the project number of the app.
const AUDIENCE = '1234567890';
// Get this value from the request's Authorization HTTPS header.
// For example, for "Authorization: Bearer AbCdEf123456" use "AbCdEf123456"
const BEARER_TOKEN = 'AbCdEf123456';
const client = new OAuth2Client();
/** Verifies JWT Tokens for Apps in Google Chat. */
async function verify() {
// Verify valid token, signed by CHAT_ISSUER, intended for a third party.
try {
const response = await fetch(PUBLIC_CERT_URL_PREFIX CHAT_ISSUER);
const certs = await response.json();
const ticket = await client.verifySignedJwtWithCertsAsync(
BEARER_TOKEN, certs, AUDIENCE, [CHAT_ISSUER]);
} catch (unused) {
console.error('Invalid token');
process.exit(1);
}
// Token originates from Google and is targeted to a specific client.
console.log('The token is valid');
}
verify();
مطالب مرتبط
- برای یک نمای کلی از احراز هویت و مجوز در Google Workspace، به اطلاعاتی درباره احراز هویت و مجوز مراجعه کنید.
- برای مرور کلی احراز هویت و مجوز در چت، به نمای کلی احراز هویت مراجعه کنید.
- احراز هویت و مجوز را با اعتبار کاربری یا یک حساب سرویس تنظیم کنید.