במדריך הזה מוסבר איך להגדיר חשבון שירות ולהשתמש בו כדי לגשת ל-Google Chat API מטעם אפליקציית Chat. קודם מוסבר איך יוצרים חשבון שירות. לאחר מכן, נסביר איך לכתוב סקריפט שמשתמש בחשבון השירות כדי לבצע אימות באמצעות Chat API ולפרסם הודעה במרחב משותף ב-Chat.
כשמבצעים אימות באמצעות חשבון שירות, כדי לקבל נתונים על מרחב משותף ב-Chat או לבצע בו פעולות, אפליקציות Chat צריכות להיות חברות במרחב המשותף. לדוגמה, כדי להציג את רשימת המשתתפים במרחב משותף או ליצור הודעה במרחב משותף, אפליקציית Chat צריכה להיות רשומה כחברה במרחב המשותף. החריג היחיד הוא כשאפליקציה של Chat יוצרת מרחב משותף באמצעות אימות אפליקציה. במקרה כזה, האפליקציה יוצרת את המרחב המשותף ואז הופכת אוטומטית לחבר/ה בו.
שיטות של Google Chat API שתומכות באימות אפליקציות עם היקפי הרשאה ששמותיהם מתחילים ב-https://www.googleapis.com/auth/chat.app.*
מחייבות אישור אדמין חד-פעמי.
שיטות של Google Chat API שתומכות בהרשאת אפליקציה עם היקף ההרשאה https://www.googleapis.com/auth/chat.bot
לא מחייבות אישור נוסף. היקפי ההרשאה https://www.googleapis.com/auth/chat.app.*
זמינים בתצוגה המקדימה למפתחים.
אם אפליקציית Chat צריכה לגשת לנתוני משתמשים או לבצע פעולות בשם משתמש, צריך לבצע אימות כמשתמש במקום זאת. אדמינים של דומיינים יכולים להעניק הרשאת גישה ברמת הדומיין ולאפשר לחשבון שירות של אפליקציית Chat לגשת לנתונים של המשתמש בלי לבקש מכל משתמש להביע הסכמה. למידע נוסף, ראו אימות ואישור באמצעות הענקת גישה ברמת הדומיין.
למידע נוסף על המקרים שבהם נדרש אימות באפליקציות Chat ועל סוג האימות הנדרש, תוכלו לעיין בקטע סוגי האימות הנדרשים בסקירה הכללית על אימות והרשאה ב-Chat API.
דרישות מוקדמות
Java
- JDK בגרסה 1.7 ואילך
- הכלי לניהול חבילות Maven
-
פרויקט Maven מאותחל. כדי לאתחל פרויקט חדש, מריצים את הפקודה הבאה בממשק שורת הפקודה:
mvn archetype:generate -DgroupId=com.google.chat.app.authsample -DartifactId=auth-sample-app -DarchetypeArtifactId=maven-archetype-quickstart -DarchetypeVersion=1.4 -DinteractiveMode=false
- אפליקציית Google Chat שמופעלות בה תכונות אינטראקטיביות. כדי ליצור אפליקציה אינטראקטיבית ל-Chat באמצעות שירות HTTP, תוכלו להיעזר במדריך למתחילים הזה.
- מוסיפים את אפליקציית Chat למרחב המשותף. במאמר בדיקת תכונות אינטראקטיביות באפליקציות של Google Chat מוסבר איך מוסיפים את אפליקציית Chat.
Python
- Python 3.6 ואילך
- הכלי לניהול חבילות pip
- אפליקציית Google Chat שמופעלות בה תכונות אינטראקטיביות. כדי ליצור אפליקציה אינטראקטיבית ל-Chat באמצעות שירות HTTP, תוכלו להיעזר במדריך למתחילים הזה.
- מוסיפים את אפליקציית Chat למרחב המשותף. במאמר בדיקת תכונות אינטראקטיביות באפליקציות של Google Chat מוסבר איך מוסיפים את אפליקציית Chat.
Node.js
- Node.js 14 ואילך
- הכלי לניהול חבילות npm
-
פרויקט Node.js שהושאר במצב מופעל. כדי לאתחל פרויקט חדש, יוצרים תיקייה חדשה ועוברים אליה, ואז מריצים את הפקודה הבאה בממשק שורת הפקודה:
npm init
- אפליקציית Google Chat שמופעלות בה תכונות אינטראקטיביות. כדי ליצור אפליקציית Chat אינטראקטיבית באמצעות שירות HTTP, תוכלו להיעזר במדריך למתחילים.
- מוסיפים את אפליקציית Chat למרחב המשותף. במאמר בדיקת תכונות אינטראקטיביות באפליקציות של Google Chat מוסבר איך מוסיפים את אפליקציית Chat.
Apps Script
- אפליקציית Google Chat שמופעלת בה תכונות אינטראקטיביות. כדי ליצור אפליקציה אינטראקטיבית ל-Chat ב-Apps Script, תוכלו להיעזר במדריך למתחילים.
- להוסיף את אפליקציית Chat למרחב המשותף. כדי להוסיף את אפליקציית Chat, תוכלו להיעזר במאמר בדיקת תכונות אינטראקטיביות באפליקציות של Google Chat.
שלב 1: יוצרים חשבון שירות במסוף Google Cloud
יוצרים חשבון שירות שאפשר להשתמש בו באפליקציית Chat כדי לגשת ל-Google APIs.
יצירה של חשבון שירות
כדי ליצור חשבון שירות:
מסוף Google Cloud
- במסוף Google Cloud, עוברים לתפריט > IAM & Admin > Service Accounts.
- לוחצים על Create service account.
- ממלאים את פרטי חשבון השירות ולוחצים על Create and continue (יצירה והמשך).
- אופציונלי: מקצים תפקידים לחשבון השירות כדי לתת גישה למשאבים של הפרויקט ב-Google Cloud. פרטים נוספים זמינים במאמר הענקה, שינוי וביטול גישה למשאבים.
- לוחצים על המשך.
- אופציונלי: מזינים משתמשים או קבוצות שיכולים לנהל את חשבון השירות הזה ולבצע בו פעולות. פרטים נוספים זמינים במאמר ניהול התחזות לחשבון שירות.
- לוחצים על סיום. רושמים בצד את כתובת האימייל של חשבון השירות.
CLI של gcloud
- יוצרים את חשבון השירות:
gcloud iam service-accounts create
SERVICE_ACCOUNT_NAME
\ --display-name="SERVICE_ACCOUNT_NAME
" - אופציונלי: מקצים תפקידים לחשבון השירות כדי לתת גישה למשאבים של הפרויקט ב-Google Cloud. פרטים נוספים זמינים במאמר הענקה, שינוי וביטול גישה למשאבים.
חשבון השירות מופיע בדף של חשבון השירות. בשלב הבא, יוצרים מפתח פרטי לחשבון השירות.
יצירת מפתח פרטי
כדי ליצור ולהוריד מפתח פרטי לחשבון השירות:
- במסוף Google Cloud, עוברים לתפריט > IAM & Admin > Service Accounts.
- בוחרים את חשבון השירות.
- לוחצים על Keys (מפתחות) > Add key (הוספת מפתח) > Create new key (יצירת מפתח חדש).
- בוחרים באפשרות JSON ולוחצים על Create.
זוג המפתחות הציבורי/הפרטי החדש נוצר ומוריד למחשב כקובץ חדש. שומרים את קובץ ה-JSON שהורדתם בתור
credentials.json
בספריית העבודה. הקובץ הזה הוא העותק היחיד של המפתח. מידע נוסף על אחסון המפתח באופן מאובטח זמין במאמר ניהול מפתחות של חשבונות שירות. - לוחצים על סגירה.
למידע נוסף על חשבונות שירות, ראו חשבונות שירות במאמרי העזרה של Google Cloud IAM.
בשלב הבא יוצרים לקוח OAuth תואם ל-Google Workspace Marketplace לחשבון השירות הזה.
לקבל אישור מהאדמין
כדי להשתמש בהיקף הרשאה שמתחיל ב-https://www.googleapis.com/auth/chat.app.*
, שזמין כחלק מ-Developer Preview, צריך לקבל אישור אדמין חד-פעמי לאפליקציית Chat.
כדי להשתמש בהיקף ההרשאה https://www.googleapis.com/auth/chat.bot
, לא נדרש אישור מאדמין.
כדי לקבל אישור מהאדמין, צריך להכין את חשבון השירות של אפליקציית Chat עם הפרטים הבאים:
- לקוח OAuth תואם ל-Google Workspace Marketplace.
- הגדרת האפליקציה ב-Google Workspace Marketplace SDK.
יצירת לקוח OAuth תואם ל-Google Workspace Marketplace
כדי ליצור לקוח OAuth תואם ל-Google Workspace Marketplace:
במסוף Google Cloud, נכנסים לתפריט > IAM ואדמין > חשבונות שירות.
לוחצים על חשבון השירות שיצרתם לאפליקציית Chat.
לוחצים על הגדרות מתקדמות.
לוחצים על יצירת לקוח OAuth שתואם ל-Google Workspace Marketplace.
לוחצים על המשך.
תוצג הודעת אישור על כך שנוצר לקוח OAuth תואם ל-Google Workspace Marketplace.
הגדרת אפליקציית Chat ב-Google Workspace Marketplace SDK
כדי להגדיר את אפליקציית Chat באמצעות ה-SDK של Google Workspace Marketplace:
במסוף Google Cloud, מפעילים את Google Workspace Marketplace SDK.
במסוף Google Cloud, נכנסים אל תפריט > APIs & Services > Enabled APIs & services > Google Workspace Marketplace SDK > App Configuration.
ממלאים את הדף 'הגדרת האפליקציה'. האופן שבו מגדירים את אפליקציית Chat תלוי בקהל היעד ובגורמים אחרים. במאמר הגדרת האפליקציה ב-Google Workspace Marketplace SDK מוסבר איך למלא את דף ההגדרות של האפליקציה. למטרות המדריך הזה, צריך להזין את הפרטים הבאים:
- בקטע ניראות האפליקציה, בוחרים באפשרות פרטי.
- בקטע Installation settings (הגדרות ההתקנה), בוחרים באפשרות Individual + admin install (התקנה אישית + התקנה של אדמין).
- בקטע App integration, בוחרים באפשרות Chat app.
בקטע היקפי OAuth, מזינים את כל היקפי האימות שבהם משתמשת אפליקציית Chat.
בקטע פרטים למפתחים, מזינים את שם המפתח, כתובת ה-URL של אתר המפתח וכתובת האימייל של המפתח.
לוחצים על שמירת הטיוטה.
קבלת אישור מהאדמין
עכשיו, אחרי שתגדירו את חשבון השירות לקבלת אישור מהאדמין, תוכלו לקבל את האישור מהאדמין ב-Google Workspace שיכול להעניק אותו. לשם כך, פועלים לפי השלבים שמפורטים במאמר הגדרת הרשאה לאפליקציות של Chat.
שלב 2: התקנת ספריית הלקוח של Google ופריטים אחרים בקשרי תלות
מתקינים את ספריית הלקוח של Google ואת יחסי התלות האחרים הנדרשים לפרויקט.
Java
כדי להוסיף את ספריות הלקוח של Google ואת יחסי התלות הנדרשים האחרים לפרויקט Maven, עורכים את הקובץ pom.xml
בספרייה של הפרויקט ומוסיפים את יחסי התלות הבאים:
<dependencies>
<!-- ... existing dependencies ... -->
<dependency>
<groupId>com.google.apis</groupId>
<artifactId>google-api-services-chat</artifactId>
<version>v1-rev20230905-2.0.0</version>
</dependency>
<dependency>
<groupId>com.google.auth</groupId>
<artifactId>google-auth-library-oauth2-http</artifactId>
<version>1.19.0</version>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.10.1</version>
</dependency>
</dependencies>
Python
אם עדיין לא התקנתם את ספריות הלקוח של Google ל-Python, מריצים את הפקודה הבאה בממשק שורת הפקודה:
pip3 install --upgrade google-api-python-client google-auth
Node.js
כדי להוסיף את ספריות הלקוח של Google לפרויקט Node.js, עוברים לספרייה של הפרויקט ומריצים את הפקודה הבאה בממשק שורת הפקודה:
npm install "@googleapis/chat"
Apps Script
הדוגמה הזו משתמשת בספריית OAuth2 ל-Apps Script כדי ליצור אסימון JWT לאימות חשבון שירות. כדי להוסיף את הספרייה לפרויקט של Apps Script:
- בצד ימין, לוחצים על עריכה .
- בצד ימין, לצד ספריות, לוחצים על הוספת ספרייה .
- מזינים את מזהה הסקריפט
1B7FSrk5Zi6L1rSxxTDgDEUsPzlukDsi4KGuTMorsTQHhGBzBkMun4iDF
. - לוחצים על חיפוש ואז על הוספה.
בדוגמה הזו נעשה שימוש בשירות Chat מתקדם כדי לבצע קריאה ל-Google Chat API. כדי להפעיל את השירות בפרויקט שלכם ב-Apps Script:
- בצד ימין, לוחצים על עריכה .
- בצד ימין, לצד Services, לוחצים על Add a service .
- בוחרים באפשרות Google Chat API.
- בקטע Version, בוחרים באפשרות v1.
- לוחצים על הוספה.
אפשר להשתמש בכל שפה שנתמכת בספריות הלקוח שלנו.
שלב 3: כותבים סקריפט שמשתמש בחשבון השירות כדי לבצע אימות באמצעות Chat API
הקוד הבא מבצע אימות באמצעות Chat API באמצעות חשבון שירות, ולאחר מכן מפרסם הודעה במרחב משותף ב-Chat:
Java
- פותחים את הקובץ
src/main/java/com/google/chat/app/authsample/App.java
בספרייה של הפרויקט. מחליפים את התוכן ב-
App.java
בקוד הבא:package com.google.chat.app.authsample; import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.json.gson.GsonFactory; import com.google.api.services.chat.v1.HangoutsChat; import com.google.api.services.chat.v1.model.Message; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; /** * Authenticates with Chat API using service account credentials, * then creates a Chat message. */ public class App { // Specify required scopes. private static final String CHAT_SCOPE = "https://www.googleapis.com/auth/chat.bot"; // Specify service account details. private static final String PRIVATE_KEY_RESOURCE_URI = "/credentials.json"; public static void main( String[] args ) { try { // Run app. Message response = App.createChatMessage(); // Print details about the created message. System.out.println(response); } catch (Exception e) { e.printStackTrace(); } } private static Message createChatMessage() throws Exception { // Build the Chat API client and authenticate with the service account. GoogleCredentials credentials = GoogleCredentials.fromStream( App.class.getResourceAsStream(PRIVATE_KEY_RESOURCE_URI)) .createScoped(CHAT_SCOPE); HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(credentials); HangoutsChat chatService = new HangoutsChat.Builder( GoogleNetHttpTransport.newTrustedTransport(), GsonFactory.getDefaultInstance(), requestInitializer) .setApplicationName("auth-sample-app") .build(); // The space to create the message in. // // Replace SPACE_NAME with a space name. // Obtain the space name from the spaces resource of Chat API, // or from a space's URL. String spaceName = "spaces/SPACE_NAME"; // Create a Chat message. Message message = new Message().setText("Hello, world!"); return chatService.spaces().messages().create(spaceName, message).execute(); } }
בקוד, מחליפים את
SPACE_NAME
בשם של המרחב המשותף. אפשר לקבל את השם מהשיטהspaces.list
ב-Chat API או מכתובת ה-URL של המרחב המשותף.יוצרים ספריית משנה חדשה בשם
resources
בספרייה של הפרויקט.מוודאים שקובץ המפתח הפרטי של חשבון השירות נקרא
credentials.json
ומעתיקים אותו לתיקיית המשנהresources
.כדי להגדיר את Maven לכלול את קובץ המפתח הפרטי בחבילת הפרויקט, עורכים את הקובץ
pom.xml
בספריית הפרויקט ומוסיפים את ההגדרות הבאות לקטע<build>
:<build> <!-- ... existing configurations ... --> <resources> <resource> <directory>resources</directory> </resource> </resources> </build>
כדי להגדיר את Maven כך שיכלול את יחסי התלות בחבילת הפרויקט וגם כדי להריץ את הכיתה הראשית של האפליקציה, עורכים את הקובץ
pom.xml
בתיקיית הפרויקט ומוסיפים את ההגדרה הבאה לקטע<plugins>
:<plugins> <!-- ... existing configurations ... --> <plugin> <artifactId>maven-assembly-plugin</artifactId> <configuration> <archive> <manifest> <mainClass>com.google.chat.app.authsample.App</mainClass> </manifest> </archive> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> </configuration> </plugin> </plugins>
Python
- בספריית העבודה, יוצרים קובץ בשם
chat_app_auth.py
. מוסיפים את הקוד הבא ב-
chat_app_auth.py
:from apiclient.discovery import build from google.oauth2 import service_account # Specify required scopes. SCOPES = ['https://www.googleapis.com/auth/chat.bot'] # Specify service account details. creds = service_account.Credentials.from_service_account_file( 'credentials.json', scopes=SCOPES) # Build the URI and authenticate with the service account. chat = build('chat', 'v1', credentials=creds) # Create a Chat message. result = chat.spaces().messages().create( # The space to create the message in. # # Replace SPACE_NAME with a space name. # Obtain the space name from the spaces resource of Chat API, # or from a space's URL. parent='spaces/SPACE_NAME', # The message to create. body={'text': 'Hello, world!'} ).execute() # Prints details about the created message. print(result)
בקוד, מחליפים את
SPACE_NAME
בשם של המרחב המשותף. אפשר לקבל את השם מהשיטהspaces.list
ב-Chat API או מכתובת ה-URL של המרחב המשותף. חשוב לוודא שקובץ המפתח הפרטי של חשבון השירות נקראcredentials.json
.
Node.js
- בספרייה של הפרויקט, יוצרים קובץ בשם
chat_app_auth.js
. מוסיפים את הקוד הבא ב-
chat_app_auth.js
:const chat = require('@googleapis/chat'); async function createMessage() { const auth = new chat.auth.GoogleAuth({ // Specify service account details. keyFilename: 'credentials.json', // Specify required scopes. scopes: ['https://www.googleapis.com/auth/chat.bot'] }); const authClient = await auth.getClient(); // Create the Chat API client and authenticate with the service account. const chatClient = await chat.chat({ version: 'v1', auth: authClient }); // Create a Chat message. const result = await chatClient.spaces.messages.create({ // The space to create the message in. // // Replace SPACE_NAME with a space name. // Obtain the space name from the spaces resource of Chat API, // or from a space's URL. parent: 'spaces/SPACE_NAME', // The message to create. requestBody: { 'text': 'Hello, world!' } }); return result; } // Execute function then print details about the created message. createMessage().then(console.log);
בקוד, מחליפים את
SPACE_NAME
בשם של המרחב המשותף. אפשר לקבל את השם מהשיטהspaces.list
ב-Chat API או מכתובת ה-URL של המרחב המשותף. מוודאים שקובץ המפתח הפרטי של חשבון השירות נקראcredentials.json
.
Apps Script
עורכים את הקובץ
appsscript.json
במרכז העריכה של Apps Script, ומוסיפים את היקף הרשאות ה-OAuth הנדרש לשליחת בקשות חיצוניות לקבלת אסימון ה-OAuth של חשבון השירות:"oauthScopes": [ "https://www.googleapis.com/auth/script.external_request" ]
שומרים את הקוד הבא בקובץ בשם
ChatAppAuth.gs
בפרויקט Apps Script:// Specify the contents of the file credentials.json. const CREDENTIALS = CREDENTIALS; const SCOPE = 'https://www.googleapis.com/auth/chat.bot'; // The space to create the message in. // // Replace SPACE_NAME with a space name. // Obtain the space name from the spaces resource of Chat API, // or from a space's URL. const PARENT = 'spaces/SPACE_NAME' /** * Authenticates with Chat API using app credentials, then posts a message. */ function createMessageWithAppCredentials() { try { const service = getService_(); if (!service.hasAccess()) { console.error(service.getLastError()); return; } // Specify the message to create. const message = {'text': 'Hello world!'}; // Call Chat API with a service account to create a message. const result = Chat.Spaces.Messages.create( message, PARENT, {}, // Authenticate with the service account token. {'Authorization': 'Bearer ' + service.getAccessToken()}); // Log details about the created message. console.log(result); } catch (err) { // TODO (developer) - Handle exception. console.log('Failed to create message with error %s', err.message); } } /** * Configures the OAuth library to authenticate with the service account. */ function getService_() { return OAuth2.createService(CREDENTIALS.client_email) .setTokenUrl('https://oauth2.googleapis.com/token') .setPrivateKey(CREDENTIALS.private_key) .setIssuer(CREDENTIALS.client_email) .setSubject(CREDENTIALS.client_email) .setScope(SCOPE) .setPropertyStore(PropertiesService.getScriptProperties()); }
בקוד, מחליפים את
CREDENTIALS
בתוכן של הקובץcredentials.json
.בקוד, מחליפים את
SPACE_NAME
בשם של מרחב משותף, שאפשר לקבל מ-methodspaces.list
ב-Chat API או מכתובת ה-URL של המרחב.
שלב 4: מריצים את הדוגמה המלאה
בספריית העבודה, יוצרים ומריצים את הדוגמה:
Java
mvn compile assembly:single
java -jar target/auth-sample-app-1.0-SNAPSHOT-jar-with-dependencies.jar
Python
python3 chat_app_auth.py
Node.js
node chat_app_auth.js
Apps Script
פותחים את הקובץ ChatAppAuth.gs
בעורך של Apps Script ולוחצים על הפעלה.
הסקריפט שולח בקשה מאומתת ל-Chat API, שמגיבה על ידי פרסום הודעה במרחב משותף ב-Chat כאפליקציה ל-Chat.
פתרון בעיות בדוגמה
בקטע הזה מתוארות בעיות נפוצות שעשויות להתרחש במהלך ניסיון להריץ את הדוגמה הזו.
אין לך הרשאה להשתמש באפליקציה הזו
כשמריצים את הסקריפט, יכול להיות שתופיע הודעת השגיאה הבאה:
<HttpError 403 when requesting https://chat.googleapis.com/v1/spaces/{space}/messages?alt=json returned "You are not permitted to use this app". Details: "You are not permitted to use this app">
הודעת השגיאה הזו מופיעה אם לאפליקציית Chat אין הרשאה ליצור הודעות ב-Chat במרחב המשותף שצוין.
כדי לפתור את השגיאה, מוסיפים את אפליקציית Chat למרחב המשותף ב-Chat שמצוינת בסקריפט.
האדמין צריך להעניק לאפליקציה את היקף ההרשאה הנדרש של OAuth לביצוע הפעולה הזו
כשמריצים את הסקריפט, יכול להיות שתופיע הודעת השגיאה הבאה:
<HttpError 403 when requesting https://chat.googleapis.com/v1/spaces/{space}?alt=json returned "The administrator must grant the app the required OAuth authorization scope for this action.". Details: "The administrator must grant the app the required OAuth authorization scope for this action.">
הודעת השגיאה הזו מופיעה אם אדמין ב-Google Workspace עדיין לא העניק לאפליקציית Chat אישור חד-פעמי לשימוש בהיקפי הרשאה שמתחילים בשם https://www.googleapis.com/auth/chat.app.*
.
כדי לפתור את השגיאה:
- אפשר לבקש מהאדמין ב-Google Workspace להעניק אישור לאפליקציית Chat. כשמטפלים בשגיאה הזו בלוגיקה של אפליקציית Chat, כדאי לשלוח הודעה שמציינת שאפליקציית Chat זקוקה לאישור האדמין כדי לבצע את הפעולה המבוקשת, למשל:
To perform this action, I need approval. <https://support.google.com/a?p=chat-app-auth|Learn more>.
- אם השיטה של Google Chat API תומכת בהיקף ההרשאה
https://www.googleapis.com/auth/chat.bot
, שלא מחייב אישור של אדמין, מומלץ להשתמש בה במקום זאת. כדי לבדוק אילו היקפי הרשאה השיטה תומכת בהם, אפשר לעיין במסמכי העזרה של Google Chat API.
נושאים קשורים
- מידע נוסף על מה עוד אפשר לעשות ב-Chat API מופיע במאמרי העזרה של Chat API.
- אם אתם משתמשים בהיקפי הרשאות של OAuth שמתחילים ב-
https://www.googleapis.com/auth/chat.app.*
, כדאי לעיין במאמר איך אדמינים מעניקים אישור חד-פעמי.