אימות והרשאות
הכותרת שתמיד נשלחת
Section titled “הכותרת שתמיד נשלחת”מזהה ציבורי, לא סוד: הוא מופיע ב‑JavaScript של כל דף נחיתה. השער הוא ההרשאות בצד השרת. מוציאים אותו ב‑Databases ← המערכת שלכם ← לשונית Settings (סביבות וגישה).
טבלת ההחלטה
Section titled “טבלת ההחלטה”| השיטה | הכותרת | מה היא מרשה | איפה מותר להחזיק אותה |
|---|---|---|---|
| Application Id בלבד | X-Parse-Application-Id |
getlead / web2table — ובנוסף, בפועל, גם POST /parse/files/… |
מותר בדפדפן |
| API Key | X-Parse-API-Key |
הכול, בזהות Master; ניתן לביטול נקודתי |
צד שרת בלבד; אסור בדפדפן |
| Master Key | X-Parse-Master-Key |
הכול, עוקף כל הרשאה; אין ביטול נקודתי | צד שרת בלבד; אסור בדפדפן |
| Session Token | X-Parse-Session-Token |
מה שהמשתמש עצמו מורשה | צד שרת, או אפליקציה שהמשתמש התחבר אליה |
בסדר הזה:
- קוד בדפדפן של גולש אנונימי → Application Id בלבד, מול
getlead/web2table. עצרו כאן. - הרשאות של משתמש מסוים (פורטל, אפליקציה שכל אחד רואה את שלו) → Session Token דרך
POST /parse/login. - כתיבה ל‑
_Timeline, מחיקת קובץ, אוskipTriggers/skipTimelineב‑Create-Many→ Master Key, ממנהל סודות, בצד שרת. - אחרת → API Key, כי אפשר לבטל אותה נקודתית.
1 · Application Id בלבד — הדלת הציבורית
Section titled “1 · Application Id בלבד — הדלת הציבורית”await fetch(`https://api.mbapps.co.il/functions/${APP_ID}/getlead`, { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-Parse-Application-Id': APP_ID }, body: JSON.stringify({ PhoneNumber: '0501234567', Email: 'a@b.co.il' }),});POST /parse/classes/<Table> עם ה‑Application Id בלבד מוחזר ב‑{"code":119,"error":"This action is not allowed without a valid CAPTCHA"}, גם אחרי create: {"*": true}. שער ה‑CAPTCHA יושב לפני בדיקת ההרשאות; פתיחת ה‑CLP פותחת את הקריאה האנונימית בלבד.
2 · API Key — לשירותים בצד שרת
Section titled “2 · API Key — לשירותים בצד שרת”הפקה: תפריט המשתמש ← סביבת פיתוח ← Databases ← המערכת שלכם ← Settings ← בלוק API Keys ← + Add Key ← שם ← Save.
curl -sS "https://api.mbapps.co.il/parse/classes/Sales?limit=5" \ -H "X-Parse-Application-Id: {appId}" \ -H "X-Parse-API-Key: {apiKey}"const APP_ID = "{appId}";const API_KEY = "{apiKey}";
const res = await fetch("https://api.mbapps.co.il/parse/classes/Sales?limit=5", { headers: { "X-Parse-Application-Id": APP_ID, "X-Parse-API-Key": API_KEY, },});const data = await res.json();import requests
APP_ID = "{appId}"API_KEY = "{apiKey}"
res = requests.get( "https://api.mbapps.co.il/parse/classes/Sales", headers={ "X-Parse-Application-Id": APP_ID, "X-Parse-API-Key": API_KEY, }, params={"limit": 5},)data = res.json()$appId = "{appId}";$apiKey = "{apiKey}";
$ch = curl_init();curl_setopt_array($ch, [ CURLOPT_URL => "https://api.mbapps.co.il/parse/classes/Sales?limit=5", CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => [ "X-Parse-Application-Id: $appId", "X-Parse-API-Key: $apiKey", ],]);$response = curl_exec($ch);curl_close($ch);- אינו מוגבל בהיקף. קורא וכותב בכל טבלה, כולל
_User,_Timelineו‑Config, והכתיבות מתועדות בזהותMaster. ההבדל היחיד מ‑Master Key:Revokeנקודתי. - תקף רק תחת שם הכותרת שלו. אותו ערך ב‑
X-Parse-Master-Keyמוחזר ב‑{"code":119,"error":"Permission denied for action find on class …"}. - שדה ה‑
Nameנשמר. תנו שם משמעותי בהפקה; זה מה שיאפשרRevokeנקודתי בעוד חצי שנה.
3 · Session Token — הרשאות של משתמש אמיתי
Section titled “3 · Session Token — הרשאות של משתמש אמיתי”curl -sS -X POST "https://api.mbapps.co.il/parse/login" \ -H "X-Parse-Application-Id: {appId}" \ -H "Content-Type: application/json" \ -d '{ "username": "user@company.co.il", "password": "********" }'const APP_ID = "{appId}";
const res = await fetch("https://api.mbapps.co.il/parse/login", { method: "POST", headers: { "X-Parse-Application-Id": APP_ID, "Content-Type": "application/json", }, body: JSON.stringify({ username: "user@company.co.il", password: "********", }),});const data = await res.json();import requests
APP_ID = "{appId}"
res = requests.post( "https://api.mbapps.co.il/parse/login", headers={ "X-Parse-Application-Id": APP_ID, "Content-Type": "application/json", }, json={ "username": "user@company.co.il", "password": "********", },)data = res.json()$appId = "{appId}";
$payload = json_encode([ "username" => "user@company.co.il", "password" => "********",]);$ch = curl_init();curl_setopt_array($ch, [ CURLOPT_URL => "https://api.mbapps.co.il/parse/login", CURLOPT_POST => true, CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => [ "X-Parse-Application-Id: $appId", "Content-Type: application/json", ], CURLOPT_POSTFIELDS => $payload,]);$response = curl_exec($ch);curl_close($ch);{ "objectId": "g7y9tkhB7O", "username": "user@company.co.il", "email": "user@company.co.il", "name": "ישראל ישראלי", "createdAt": "2022-01-01T12:23:45.678Z", "updatedAt": "2022-01-01T12:23:45.678Z", "_failed_login_count": 0, "last_success_login": { "__type": "Date", "iso": "2026-08-23T09:01:59.000Z" }, "ACL": { "g7y9tkhB7O": { "read": true, "write": true } }, "sessionToken": "r:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"}createdBy / updatedBy חוזרים גם הם. הטוקן: 34 תווים, מתחיל ב‑r:. שם משתמש או סיסמה שגויים → HTTP 404, {"code":101,"error":"Invalid username/password."}.
מכאן והלאה בכל קריאה:
הגישה מוגבלת לתפקידים של המשתמש ולהרשאות הטבלה. ניתוק: POST /parse/logout עם X-Parse-Application-Id + X-Parse-Session-Token.
מדיניות סיסמאות: (?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,} — מינימום 8 תווים, אות קטנה, אות גדולה וספרה. הפרה → {"code":142,"error":"Password does not meet the Password Policy requirements."}.
ה‑username אמור להיות אימייל — מוסכמת מוצר שכל זרימות ההתחברות והשחזור מניחות — אבל השרת אינו אוכף, ו‑username שאינו אימייל מתקבל.
4 · Master Key — גישה מלאה, עוקפת כל הרשאה
Section titled “4 · Master Key — גישה מלאה, עוקפת כל הרשאה”X-Parse-Application-Id: {appId}X-Parse-Master-Key: {masterKey}עוקף הרשאות ברמת הטבלה וברמת הרשומה. פעולות שדורשות אותו:
| הפעולה | למה |
|---|---|
מחיקת קובץ (DELETE /parse/files/<name>) |
אנונימי מקבל unauthorized: master key is required |
כתיבה ל‑_Timeline |
אפשרית עם Master Key בלבד — וזו מגבלת ביקורת, ראו יומנים |
skipTriggers / skipTimeline בכלי Create-Many |
הדגלים מכובדים רק באימות Master Key |
קריאת סכימות של _Role / _Session |
בשכבת ה‑MCP Get-Schema מחזיר עליהן {} |
מה שלא דורש אותו: Config נקראת גם עם API Key וגם עם Session Token של משתמש מורשה (אנונימי ומשתמש בלי תפקיד מקבלים 119); בשכבת ה‑MCP היא נגישה בחיבור Master Key. גם GET /parse/classes-aggregate/<Table> עובדת עם API Key ועם Session Token של משתמש מורשה, ואנונימי מקבל 119. הנתיב הגנרי /parse/aggregate/ אינו קיים בפריסה — 404, ראו אגרגציות.
אותו מפתח, שכבה אחרת — MCP
Section titled “אותו מפתח, שכבה אחרת — MCP”בחיבור OAuth הסוכן פועל בהרשאות המשתמש המחובר, בכפוף לתפקיד ולהרשאות הטבלאות. בממשק האדמין פתחו User Settings → MCP Permissions, אפשרו Read / Create / Update לפי הצורך ולחצו Apply. ההרשאות כפופות גם לחבילת המנוי.
כלים מתקדמים אינם פתוחים כברירת מחדל ב-OAuth. בקשו מ-MyBusiness לפתוח אותם לאדמין. לאחר הפתיחה נדרשים תפקיד Admin והרשאת Edit pages and schema. בחיבור App ID וטוקן API יש גישה מלאה למערכת המחוברת, ואין צורך בשלב הפתיחה הנוסף של OAuth.
מדריך התקנה מצולם ב-Codex · מדריך התקנה מצולם ב-Claude Code בדסקטופ
אותו API Key נשלח בשכבת ה‑MCP, באותו שם כותרת.
| מצב | מה הלקוח שולח | הזהות בשרת | מודל ההרשאות |
|---|---|---|---|
| Application Id + API Key | X-Parse-Application-Id + X-Parse-API-Key |
משתמש הדמה Master |
ללא — עוקף כל הרשאת טבלה |
| התחברות משתמש (OAuth 2.1) | Authorization: Bearer <token> |
משתמש ה‑CRM שנכנס | התפקיד שלו בתוספת הרשאות ה‑MCP שלו; לעולם לא מעבר לתפקיד הבסיס |
- אותו ערך ב‑
X-Parse-Master-Key= פרטי גישה שגויים, גם כאן. - למשתמשים אין גישת MCP כברירת מחדל, גם לא ל‑owner. נותנים אותה בלשונית MCP Permissions של כרטיס המשתמש (סביבת הפיתוח ← Databases ← המערכת ← Users ← המשתמש):
mcp:view,mcp:create,mcp:update,mcp:edit-page-and-schema— כולן כבויות במערכת חדשה. המסך מציין שההרשאות כפופות להרשאות הטבלה של המשתמש ושהשימוש ב‑MCP תלוי בתוכנית המנוי. - חיבור אחד = מערכת אחת. הניתוב בהגדרת החיבור, לא בקריאה.
להתקנת פלאגין ולבדיקת זמינות OAuth בלקוח שלכם, עברו למדריכי הדסקטופ. כשל לפני פתיחת הדפדפן או כפתור Connect שאינו פעיל דורשים בדיקת החיבור מול התמיכה.
איך נראה כשל אימות
Section titled “איך נראה כשל אימות”| מה קרה | מה תראו |
|---|---|
| כותרת אימות חסרה לגמרי (MCP) | Authorization header is required |
| פרטי גישה שגויים (MCP) | HTTP 200 ותשובת הכלי Permission denied for action find on class … |
| Session Token פג/לא תקין (REST) | {"code":209,"error":"invalid session token"} — HTTP 400 |
שם משתמש או סיסמה שגויים ב‑POST /parse/login |
{"code":101,"error":"Invalid username/password."} — HTTP 404 |
| API Key / Master Key מבוטל או שגוי (REST) | {"code":119,"error":"Permission denied for action find on class …"} — זהה לקריאה בלי הרשאה |
| כתיבה אנונימית ל‑REST | {"code":119,"error":"This action is not allowed without a valid CAPTCHA"} |
| קריאה בלי הרשאה (REST) | {"code":119,"error":"Permission denied for action find on class Accounts."} — אותו קוד, הודעה אחרת |
| שם שדה לא חוקי | {"code":105,"error":"Invalid field name: bl!ng."} |
| רשומה לא נמצאה — או שההרשאות מסתירות אותה | {"code":101,"error":"Object not found."} |
| סיסמה שאינה עומדת במדיניות | {"code":142,"error":"Password does not meet the Password Policy requirements."} |
המשך מכאן
Section titled “המשך מכאן”- סביבות וגישה — מאיפה מוציאים את הפרטים
- משתמשים וסשנים — התחברות, 209, ומדיניות הסיסמאות
- שגיאות ופתרון תקלות — כל קוד ומה עושים איתו
- getlead — הדלת הציבורית, בפירוט