שיתוף קבצים, תיקיות ואחסון

לכל קובץ, תיקייה ואחסון שיתופי ב-Google Drive משויכים משאבי הרשאות. כל משאב מזהה את ההרשאה ל-type (משתמש, קבוצה, דומיין, כל אחד) ול-role, למשל 'תגובה' או 'קורא'. לדוגמה, יכול להיות שלקובץ יש הרשאה שמעניקה למשתמש מסוים (type=user) הרשאת קריאה בלבד (role=reader), בעוד שהרשאה אחרת מעניקה לחברים בקבוצה ספציפית (type=group) את היכולת להוסיף תגובות לקובץ (role=commenter).

כאן תוכלו למצוא רשימה מלאה של התפקידים והפעולות שכל אחד מהם מאפשר.

תרחישים לשיתוף משאבים ב-Drive

יש חמישה סוגים שונים של תרחישי שיתוף:

  1. כדי לשתף קובץ מ'האחסון שלי', למשתמש צריך להיות role=writer או role=owner.

  2. כדי לשתף תיקייה מ'האחסון שלי', למשתמש צריך להיות role=writer או role=owner.

    • אם הערך הבוליאני writersCanShare מוגדר ל-False עבור הקובץ, למשתמש צריכה להיות role=owner הפחות מגבילה.

    • גישה זמנית (שנקבעת לפי תאריך ושעת תפוגה) אסורה בתיקיות 'האחסון שלי' עם role=writer. מידע נוסף זמין במאמר הגדרת תאריך תפוגה להגבלת הגישה לקבצים.

  3. כדי לשתף קובץ מהאחסון השיתופי, למשתמש צריך להיות role=writer, role=fileOrganizer או role=organizer.

    • ההגדרה writersCanShare לא חלה על פריטים בתיקיות אחסון שיתופי. הפונקציה מתנהגת כאילו היא תמיד מוגדרת לערך True.
  4. כדי לשתף תיקייה באחסון שיתופי, למשתמש צריך להיות role=organizer.

    • אם המגבלה sharingFoldersRequiresOrganizerPermission על אחסון שיתופי מוגדרת ל-False, משתמשים שיש להם role=fileOrganizer יכולים לשתף תיקיות באחסון השיתופי הזה.
  5. כדי לנהל את החברות באחסון השיתופי, צריך לוודא שיש לו role=organizer. רק משתמשים וקבוצות יכולים להיות חברים בתיקיות אחסון שיתופי.

הגדרת תאריך תפוגה כדי להגביל את הגישה לקבצים

כשאתם עובדים עם אנשים בפרויקט רגיש, כדאי לכם להגביל את הגישה שלהם לקבצים מסוימים ב-Drive אחרי פרק זמן מסוים. אפשר להגדיר תאריך תפוגה לקבצים ב'אחסון שלי' כדי להגביל או להסיר את הגישה אליהם.

כדי להגדיר את תאריך התפוגה:

השדה expirationTime מציין מתי תוקף ההרשאה יפוג באמצעות RFC 3339 date-time. בין מועדי התפוגה חלות המגבלות הבאות:

  • ניתן להגדיר אותן רק בהרשאות של משתמשים וקבוצות.
  • השעה חייבת להיות בעתיד.
  • התאריך לא יכול לחול יותר משנה אחרי התאריך הנוכחי.

למידע נוסף על תאריך תפוגה, אפשר לעיין במאמרים הבאים:

הפצת הרשאות

רשימות ההרשאות לתיקיות עוברות למטה, וכל התיקיות והקבצים הצאצאים יורשים את ההרשאות מההורה. בכל פעם שההרשאות או ההיררכיה משתנות, ההפצה מתרחשת באופן רקורסיבי בכל התיקיות המוצבות. לדוגמה, אם קובץ קיים בתיקייה והתיקייה הזו מועברת לתיקייה אחרת, ההרשאות בתיקייה החדשה יתעדכנו גם בקובץ. אם התיקייה החדשה תקצה למשתמש בקובץ תפקיד חדש, כמו 'writer', הוא יחליף את התפקיד הישן.

לעומת זאת, אם קובץ יורש את role=writer מתיקייה ותועבר לתיקייה אחרת עם תפקיד 'קורא', הקובץ יורש עכשיו את role=reader.

אי אפשר להסיר הרשאות שעברו בירושה מקובץ או מתיקייה באחסון שיתופי. במקום זאת, צריך להתאים את ההרשאות בהורה הישיר או העקיף שממנו הן עברו בירושה. אפשר להסיר את ההרשאות שעברו בירושה מפריטים שנמצאים בקטע 'האחסון שלי' או 'קבצים ששותפו איתי'.

לעומת זאת, אפשר לבטל הרשאות שעברו בירושה בקובץ או בתיקייה ב'אחסון שלי'. לכן, אם קובץ יורש את role=writer מתיקיית 'האחסון שלי', אפשר להגדיר את role=reader בקובץ כדי להוריד את רמת ההרשאה שלו.

יכולות

המשאב Permissions לא קובע בסופו של דבר את היכולת של המשתמש הנוכחי לבצע פעולות בקובץ או בתיקייה. במקום זאת, המשאב Files מכיל אוסף של שדות capabilities בוליאניים שמאפשרים לציין אם אפשר לבצע פעולה בקובץ או בתיקייה. ה-Google Drive API מגדיר את השדות האלה על סמך משאב ההרשאות של המשתמש הנוכחי שמשויך לקובץ או לתיקייה.

לדוגמה, כאשר אלכס מתחבר לאפליקציה ומנסה לשתף קובץ, התפקיד של אלכס נבדק לגבי הרשאות בקובץ. אם התפקיד מאפשר לשתף קובץ, השדות capabilities שקשורים לקובץ (כמו canShare) ימולאו ביחס לתפקיד. אם אלכס רוצה לשתף את הקובץ, האפליקציה תבדוק את השדה capabilities כדי לוודא שהערך של canShare מוגדר ל-true.

דוגמה לאחזור קובץ capabilities זמינה במאמר אימות הרשאות משתמש.

יצירת הרשאה

כשיוצרים הרשאה, צריך למלא את שני השדות הבאים:

  • typetype מזהה את היקף ההרשאה (user, group, domain או anyone). הרשאה עם type=user חלה על משתמש ספציפי, ואילו הרשאה עם type=domain חלה על כל המשתמשים בדומיין ספציפי.

  • role – השדה role מזהה את הפעולות שה-type יכול לבצע. לדוגמה, הרשאה באמצעות type=user ו-role=reader מעניקה למשתמש מסוים הרשאת קריאה בלבד לקובץ או לתיקייה. לחלופין, הרשאה ל-type=domain ול-role=commenter מאפשרת לכל מי שבדומיין להוסיף תגובות לקובץ. כאן תוכלו למצוא רשימה מלאה של התפקידים והפעולות שכל אחד מהם מורשה.

כשיוצרים הרשאה עם type=user או type=group, צריך גם לספק emailAddress כדי לקשר את המשתמש או הקבוצה הספציפיים להרשאה.

כשיוצרים הרשאה, צריך לציין גם domain כדי לקשר דומיין ספציפי להרשאה.type=domain

כדי ליצור הרשאה:

  1. משתמשים ב-method permissions.create בשילוב עם fileId לקובץ או לתיקייה המשויכים.
  2. בגוף הבקשה, מציינים את type ואת role.
  3. אם הערך הוא type=user או type=group, יש לציין emailAddress. אם הערך הוא type=domain, צריך לציין domain.

הצג דוגמה

בקטע הקוד הבא מוסבר איך ליצור הרשאה. התגובה תחזיר מופע של משאב Permission, כולל ה-permissionId שהוקצה.

שליחת בקשה

POST https://www.googleapis.com/drive/v3/files/FILE_ID/permissions
{
  "requests": [
    {
        "type": "user",
        "role": "commenter",
        "emailAddress": "alex@altostrat.com"
    }
  ]
}

תשובה

{
    "kind": "drive#permission",
    "id": "PERMISSION_ID",
    "type": "user",
    "role": "commenter"
}

שימוש בקהלי יעד

קהלי יעד הם קבוצות של אנשים – כמו מחלקות או צוותים – שאפשר להמליץ עליהם למשתמשים לשתף איתם את הפריטים שלהם. תוכלו לעודד את המשתמשים לשתף פריטים עם קהל ספציפי או מוגבל יותר, במקום עם הארגון כולו. משתמשי היעד יכולים לעזור לך לשפר את האבטחה והפרטיות של הנתונים, ולהקל על המשתמשים לשתף מידע בהתאם. למידע נוסף: מידע על משתמשי יעד.

כדי להשתמש בקהלי יעד:

  1. במסוף Google Admin, נכנסים לתפריט > ספרייה > קהלי יעד.

    כניסה לדף 'משתמשי היעד'

    צריך להיכנס באמצעות חשבון עם הרשאות סופר-אדמין כדי לבצע את המשימה הזו.

  2. ברשימת משתמשי היעד, לוחצים על שם קהל היעד. איך יוצרים קהל יעד?

  3. מעתיקים את המזהה הייחודי מכתובת ה-URL של קהל היעד: https://admin.google.com/ac/targetaudiences/ID.

  4. יוצרים הרשאה עם type=domain ומגדירים את השדה domain לערך ID.audience.googledomains.com.

כדי לראות את האינטראקציה של משתמשים עם משתמשי היעד, ראו חוויית משתמש לשיתוף באמצעות קישור.

אחזור כל ההרשאות לקובץ, לתיקייה או לאחסון שיתופי

משתמשים בשיטה permissions.list כדי לאחזר את כל ההרשאות לקובץ, לתיקייה או לאחסון שיתופי.

הצג דוגמה

דוגמת הקוד הבאה מראה איך לקבל את כל ההרשאות. התשובה תחזיר רשימה של הרשאות.

שליחת בקשה

GET https://www.googleapis.com/drive/v3/files/FILE_ID/permissions

תשובה

{
  "kind": "drive#permissionList",
  "permissions": [
    {
      "id": "PERMISSION_ID",
      "type": "user",
      "kind": "drive#permission",
      "role": "commenter"
    }
  ]
}

אימות הרשאות המשתמשים

כשפותחים קובץ באפליקציה, צריך לבדוק את היכולות שלו ולעבד את ממשק המשתמש כך שישקף את ההרשאות של המשתמש הנוכחי. לדוגמה, אם למשתמש אין יכולת canComment בקובץ, צריך להשבית את האפשרות להוסיף תגובות בממשק המשתמש.

כדי לקבל מידע נוסף על capabilities, עיינו בקטע יכולות שלמעלה.

כדי לבדוק את היכולות, צריך להפעיל את files.get באמצעות הפרמטר fileId ועם הפרמטר fields שמוגדר לשדה capabilities. למידע נוסף על החזרת שדות באמצעות הפרמטר fields, קראו את המאמר החזרת שדות ספציפיים לקובץ.

הצג דוגמה

דוגמת הקוד הבאה מראה איך לאמת הרשאות של משתמשים. התגובה תחזיר רשימה של יכולות שיש למשתמש בקובץ. כל יכולת מתאימה לפעולה פרטנית שמשתמש יכול לבצע. חלק מהשדות מאוכלסים רק בפריטים שנמצאים בתיקיות אחסון שיתופי.

שליחת בקשה

GET https://www.googleapis.com/drive/v3/files/FILE_ID?fields=capabilities

תשובה

{
  "capabilities": {
    "canAcceptOwnership": false,
    "canAddChildren": false,
    "canAddMyDriveParent": false,
    "canChangeCopyRequiresWriterPermission": true,
    "canChangeSecurityUpdateEnabled": false,
    "canComment": true,
    "canCopy": true,
    "canDelete": true,
    "canDownload": true,
    "canEdit": true,
    "canListChildren": false,
    "canModifyContent": true,
    "canModifyContentRestriction": true,
    "canModifyLabels": true,
    "canMoveChildrenWithinDrive": false,
    "canMoveItemOutOfDrive": true,
    "canMoveItemWithinDrive": true,
    "canReadLabels": true,
    "canReadRevisions": true,
    "canRemoveChildren": false,
    "canRemoveMyDriveParent": true,
    "canRename": true,
    "canShare": true,
    "canTrash": true,
    "canUntrash": true
  }
}

קביעת מקור התפקיד של קבצים ותיקיות באחסון שיתופי

כדי לשנות את התפקיד בקובץ או בתיקייה, צריך לדעת מהו מקור התפקיד. המקור של התפקיד בתיקיות אחסון שיתופי יכול להתבסס על חברות באחסון השיתופי, על התפקיד בתיקייה או על התפקיד בקובץ.

כדי לבדוק מה מקור התפקיד של אחסון שיתופי או פריטים באחסון השיתופי הזה, צריך להפעיל את השיטה permissions.get ולציין את הפרמטר fileId, את permissionId ואת הפרמטר fields בשדה permissionDetails. כדי למצוא את permissionId, משתמשים ב-permissions.list עם fileId. כדי לאחזר את השדה permissionDetails בבקשה permissions.list, צריך להגדיר את הפרמטר fields כ-permissions/permissionDetails.

בשדה הזה מפורטים כל ההרשאות הישירות וההרשאות שעברו בירושה למשתמש, לקבוצה או לדומיין.

הצג דוגמה

דוגמת הקוד הבאה מראה איך לקבוע את מקור התפקיד. התגובה מחזירה את ה-permissionDetails של משאב Permission. השדה inheritedFrom מציין את המזהה של הפריט שממנו בוצעה ההרשאה.

שליחת בקשה

GET https://www.googleapis.com/drive/v3/files/FILE_ID/permissions/PERMISSION_ID?fields=permissionDetails&supportsAllDrives=true

תשובה

{
  "permissionDetails": [
    {
      "permissionType": "member",
      "role": "commenter",
      "inheritedFrom": "INHERITED_FROM_ID",
      "inherited": true
    },
    {
      "permissionType": "file",
      "role": "writer",
      "inherited": false
    }
  ]
}

שינוי ההרשאות

כדי לשנות את ההרשאות בקובץ או בתיקייה מסוימים, אפשר לשנות את התפקיד שהוקצה:

  1. מפעילים את permissions.update עם permissionId של הרשאת השינוי, ועם fileId של הקובץ, התיקייה או האחסון השיתופי המשויכים. כדי למצוא את permissionId, משתמשים ב-permissions.list עם fileId.

  2. בבקשה, יש לציין את role החדש.

אפשר לתת הרשאות לקבצים או לתיקיות ספציפיים באחסון השיתופי, גם אם המשתמש או הקבוצה כבר חברים באחסון השיתופי. לדוגמה, לאלכס יש את role=commenter בחברות באחסון שיתופי. עם זאת, האפליקציה יכולה להעניק לאלכס role=writer קובץ באחסון שיתופי. במקרה כזה, מכיוון שהתפקיד החדש מתירני יותר מהתפקיד שהוענק דרך החברות שלהם, ההרשאה החדשה הופכת לתפקיד בפועל של הקובץ או התיקייה.

הצג דוגמה

דוגמת הקוד הבאה מראה איך לשנות הרשאות בקובץ או בתיקייה מהרשאת תגובה להרשאת כתיבה. התגובה מחזירה מופע של משאב Permission.

שליחת בקשה

PATCH https://www.googleapis.com/drive/v3/files/FILE_ID/permissions/PERMISSION_ID
{
  "requests": [
    {
        "role": "writer"
    }
  ]
}

תשובה

{
  "kind": "drive#permission",
  "id": "PERMISSION_ID",
  "type": "user",
  "role": "writer"
}

ביטול הגישה לקובץ או לתיקייה

כדי לבטל את הגישה לקובץ או לתיקייה, צריך להפעיל את delete באמצעות המספר fileId ו-permissionId כדי למחוק את ההרשאה.

בפריטים בתיקייה 'האחסון שלי' אפשר למחוק הרשאה שעברה בירושה. מחיקה של הרשאה שעברה בירושה מבטלת את הגישה לפריט ולפריטי הצאצא, אם קיימים.

בפריטים באחסון שיתופי, לא ניתן לבטל הרשאות שעברו בירושה. במקום זאת, עליכם לעדכן או לבטל את ההרשאה בקובץ או בתיקייה ברמה העליונה.

הפעולה delete משמשת גם למחיקת הרשאות שהוחלו ישירות על קובץ או תיקייה באחסון שיתופי.

הצג דוגמה

דוגמת הקוד הבאה מראה איך לבטל גישה על ידי מחיקת permissionId. אם הביצוע יהיה תקין, גוף התגובה יהיה ריק. כדי לוודא שההרשאה הוסרה, יש להשתמש ב-permissions.list עם fileId.

שליחת בקשה

DELETE https://www.googleapis.com/drive/v3/files/FILE_ID/permissions/PERMISSION_ID

העברת בעלות על קובץ לחשבון Google Workspace אחר באותו ארגון

אפשר להעביר את הבעלות על קבצים שקיימים בתיקייה 'האחסון שלי' מחשבון Google Workspace אחד לחשבון אחר באותו ארגון. הקבצים שבתוכו הם בבעלות ארגון שבבעלותו אחסון שיתופי. לכן, אין תמיכה בהעברת בעלות על קבצים ותיקיות בתיקיות אחסון שיתופי. מארגנים של אחסון שיתופי יכולים להעביר פריטים מהאחסון השיתופי הזה ל'אחסון שלי' משלהם, שמעביר את הבעלות אליהם.

כדי להעביר בעלות על קובץ שנמצא בתיקייה 'האחסון שלי':

  • יוצרים הרשאת קובץ שמעניקה למשתמש מסוים (type=user) גישת בעלים (role=owner).

  • מעדכנים את ההרשאה של קובץ קיים באמצעות role=owner ומעבירים את הבעלות למשתמש שצוין (transferOwnership=true).

העברת בעלות על קובץ מחשבון צרכן אחד לאחר

ניתן להעביר את הבעלות על קבצים בין חשבונות פרטיים. עם זאת, מערכת Drive לא מעבירה את הבעלות על קובץ בין שני חשבונות לצרכנים עד שהבעלים החדש הפוטנציאלי מביע הסכמה מפורשת להעברה. כדי להעביר בעלות על קובץ מחשבון צרכן אחד לאחר:

  1. הבעלים הנוכחי מתחיל את העברת הבעלות על ידי יצירה או עדכון של הרשאה לקובץ של הבעלים החדש הפוטנציאלי. ההרשאה צריכה לכלול את ההגדרות הבאות: role=writer, type=user ו-pendingOwner=true. אם הבעלים החדשים יאשרו את הבעלות שלהם, תישלח הודעה באימייל לבעלים הפוטנציאלי. בהודעה יצוין שהם יתבקשו לקבל בעלות על הקובץ.

  2. הבעלים החדשים יאשרו את הבקשה להעברת בעלות על ידי יצירה או עדכון של ההרשאה שלהם לקובץ. ההרשאה צריכה לכלול את ההגדרות הבאות: role=owner ו-transferOwnership=true. אם הבעלים החדשים יוצרים הרשאה חדשה, נשלחת התראה באימייל לבעלים הקודמים כדי לציין שהבעלות הועברה.

לאחר העברת קובץ, התפקיד של הבעלים הקודם ישודרג לאחור לתפקיד writer.

שינוי הרשאות מרובות באמצעות בקשות באצווה

מומלץ מאוד להשתמש בבקשות לאצוות כדי לשנות מספר הרשאות.

לפניכם דוגמה לביצוע שינוי של הרשאות באצווה באמצעות ספריית לקוח.

Java

drive/snippets/drive_v3/src/main/java/ShareFile.java
import com.google.api.client.googleapis.batch.BatchRequest;
import com.google.api.client.googleapis.batch.json.JsonBatchCallback;
import com.google.api.client.googleapis.json.GoogleJsonError;
import com.google.api.client.googleapis.json.GoogleJsonResponseException;
import com.google.api.client.http.HttpHeaders;
import com.google.api.client.http.HttpRequestInitializer;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.gson.GsonFactory;
import com.google.api.services.drive.Drive;
import com.google.api.services.drive.DriveScopes;
import com.google.api.services.drive.model.Permission;
import com.google.auth.http.HttpCredentialsAdapter;
import com.google.auth.oauth2.GoogleCredentials;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/* Class to demonstrate use-case of modify permissions. */
public class ShareFile {

  /**
   * Batch permission modification.
   * realFileId file Id.
   * realUser User Id.
   * realDomain Domain of the user ID.
   *
   * @return list of modified permissions if successful, {@code null} otherwise.
   * @throws IOException if service account credentials file not found.
   */
  public static List<String> shareFile(String realFileId, String realUser, String realDomain)
      throws IOException {
        /* Load pre-authorized user credentials from the environment.
         TODO(developer) - See https://developers.google.com/identity for
         guides on implementing OAuth2 for your application.application*/
    GoogleCredentials credentials = GoogleCredentials.getApplicationDefault()
        .createScoped(Arrays.asList(DriveScopes.DRIVE_FILE));
    HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(
        credentials);

    // Build a new authorized API client service.
    Drive service = new Drive.Builder(new NetHttpTransport(),
        GsonFactory.getDefaultInstance(),
        requestInitializer)
        .setApplicationName("Drive samples")
        .build();

    final List<String> ids = new ArrayList<String>();


    JsonBatchCallback<Permission> callback = new JsonBatchCallback<Permission>() {
      @Override
      public void onFailure(GoogleJsonError e,
                            HttpHeaders responseHeaders)
          throws IOException {
        // Handle error
        System.err.println(e.getMessage());
      }

      @Override
      public void onSuccess(Permission permission,
                            HttpHeaders responseHeaders)
          throws IOException {
        System.out.println("Permission ID: " + permission.getId());

        ids.add(permission.getId());

      }
    };
    BatchRequest batch = service.batch();
    Permission userPermission = new Permission()
        .setType("user")
        .setRole("writer");

    userPermission.setEmailAddress(realUser);
    try {
      service.permissions().create(realFileId, userPermission)
          .setFields("id")
          .queue(batch, callback);

      Permission domainPermission = new Permission()
          .setType("domain")
          .setRole("reader");

      domainPermission.setDomain(realDomain);

      service.permissions().create(realFileId, domainPermission)
          .setFields("id")
          .queue(batch, callback);

      batch.execute();

      return ids;
    } catch (GoogleJsonResponseException e) {
      // TODO(developer) - handle error appropriately
      System.err.println("Unable to modify permission: " + e.getDetails());
      throw e;
    }
  }
}

Python

drive/snippets/drive-v3/file_snippet/share_file.py
import google.auth
from googleapiclient.discovery import build
from googleapiclient.errors import HttpError


def share_file(real_file_id, real_user, real_domain):
  """Batch permission modification.
  Args:
      real_file_id: file Id
      real_user: User ID
      real_domain: Domain of the user ID
  Prints modified permissions

  Load pre-authorized user credentials from the environment.
  TODO(developer) - See https://developers.google.com/identity
  for guides on implementing OAuth2 for the application.
  """
  creds, _ = google.auth.default()

  try:
    # create drive api client
    service = build("drive", "v3", credentials=creds)
    ids = []
    file_id = real_file_id

    def callback(request_id, response, exception):
      if exception:
        # Handle error
        print(exception)
      else:
        print(f"Request_Id: {request_id}")
        print(f'Permission Id: {response.get("id")}')
        ids.append(response.get("id"))

    # pylint: disable=maybe-no-member
    batch = service.new_batch_http_request(callback=callback)
    user_permission = {
        "type": "user",
        "role": "writer",
        "emailAddress": "user@example.com",
    }
    batch.add(
        service.permissions().create(
            fileId=file_id,
            body=user_permission,
            fields="id",
        )
    )
    domain_permission = {
        "type": "domain",
        "role": "reader",
        "domain": "example.com",
    }
    domain_permission["domain"] = real_domain
    batch.add(
        service.permissions().create(
            fileId=file_id,
            body=domain_permission,
            fields="id",
        )
    )
    batch.execute()

  except HttpError as error:
    print(f"An error occurred: {error}")
    ids = None

  return ids


if __name__ == "__main__":
  share_file(
      real_file_id="1dUiRSoAQKkM3a4nTPeNQWgiuau1KdQ_l",
      real_user="gduser1@workspacesamples.dev",
      real_domain="workspacesamples.dev",
  )

Node.js

drive/snippets/drive_v3/file_snippets/share_file.js
/**
 * Batch permission modification
 * @param{string} fileId file ID
 * @param{string} targetUserEmail username
 * @param{string} targetDomainName domain
 * @return{list} permission id
 * */
async function shareFile(fileId, targetUserEmail, targetDomainName) {
  const {GoogleAuth} = require('google-auth-library');
  const {google} = require('googleapis');

  // Get credentials and build service
  // TODO (developer) - Use appropriate auth mechanism for your app
  const auth = new GoogleAuth({
    scopes: 'https://www.googleapis.com/auth/drive',
  });
  const service = google.drive({version: 'v3', auth});
  const permissionIds = [];

  const permissions = [
    {
      type: 'user',
      role: 'writer',
      emailAddress: targetUserEmail, // 'user@partner.com',
    },
    {
      type: 'domain',
      role: 'writer',
      domain: targetDomainName, // 'example.com',
    },
  ];
  // Note: Client library does not currently support HTTP batch
  // requests. When possible, use batched requests when inserting
  // multiple permissions on the same item. For this sample,
  // permissions are inserted serially.
  for (const permission of permissions) {
    try {
      const result = await service.permissions.create({
        resource: permission,
        fileId: fileId,
        fields: 'id',
      });
      permissionIds.push(result.data.id);
      console.log(`Inserted permission id: ${result.data.id}`);
    } catch (err) {
      // TODO(developer): Handle failed permissions
      console.error(err);
    }
  }
  return permissionIds;
}

PHP

drive/snippets/drive_v3/src/DriveShareFile.php
use Google\Client;
use Google\Service\Drive;
function shareFile()
{
    try {
        $client = new Client();
        $client->useApplicationDefaultCredentials();
        $client->addScope(Drive::DRIVE);
        $driveService = new Drive($client);
        $realFileId = readline("Enter File Id: ");
        $realUser = readline("Enter user email address: ");
        $realDomain = readline("Enter domain name: ");
        $ids = array();
            $fileId = '1sTWaJ_j7PkjzaBWtNc3IzovK5hQf21FbOw9yLeeLPNQ';
            $fileId = $realFileId;
            $driveService->getClient()->setUseBatch(true);
            try {
                $batch = $driveService->createBatch();

                $userPermission = new Drive\Permission(array(
                    'type' => 'user',
                    'role' => 'writer',
                    'emailAddress' => 'user@example.com'
                ));
                $userPermission['emailAddress'] = $realUser;
                $request = $driveService->permissions->create(
                    $fileId, $userPermission, array('fields' => 'id'));
                $batch->add($request, 'user');
                $domainPermission = new Drive\Permission(array(
                    'type' => 'domain',
                    'role' => 'reader',
                    'domain' => 'example.com'
                ));
                $userPermission['domain'] = $realDomain;
                $request = $driveService->permissions->create(
                    $fileId, $domainPermission, array('fields' => 'id'));
                $batch->add($request, 'domain');
                $results = $batch->execute();

                foreach ($results as $result) {
                    if ($result instanceof Google_Service_Exception) {
                        // Handle error
                        printf($result);
                    } else {
                        printf("Permission ID: %s\n", $result->id);
                        array_push($ids, $result->id);
                    }
                }
            } finally {
                $driveService->getClient()->setUseBatch(false);
            }
            return $ids;
    } catch(Exception $e) {
        echo "Error Message: ".$e;
    }

}

‎.NET

drive/snippets/drive_v3/DriveV3Snippets/ShareFile.cs
using Google.Apis.Auth.OAuth2;
using Google.Apis.Drive.v3;
using Google.Apis.Drive.v3.Data;
using Google.Apis.Requests;
using Google.Apis.Services;

namespace DriveV3Snippets
{
    // Class to demonstrate use-case of Drive modify permissions.
    public class ShareFile
    {
        /// <summary>
        /// Batch permission modification.
        /// </summary>
        /// <param name="realFileId">File id.</param>
        /// <param name="realUser">User id.</param>
        /// <param name="realDomain">Domain id.</param>
        /// <returns>list of modified permissions, null otherwise.</returns>
        public static IList<String> DriveShareFile(string realFileId, string realUser, string realDomain)
        {
            try
            {
                /* Load pre-authorized user credentials from the environment.
                 TODO(developer) - See https://developers.google.com/identity for
                 guides on implementing OAuth2 for your application. */
                GoogleCredential credential = GoogleCredential.GetApplicationDefault()
                    .CreateScoped(DriveService.Scope.Drive);

                // Create Drive API service.
                var service = new DriveService(new BaseClientService.Initializer
                {
                    HttpClientInitializer = credential,
                    ApplicationName = "Drive API Snippets"
                });

                var ids = new List<String>();
                var batch = new BatchRequest(service);
                BatchRequest.OnResponse<Permission> callback = delegate(
                    Permission permission,
                    RequestError error,
                    int index,
                    HttpResponseMessage message)
                {
                    if (error != null)
                    {
                        // Handle error
                        Console.WriteLine(error.Message);
                    }
                    else
                    {
                        Console.WriteLine("Permission ID: " + permission.Id);
                    }
                };
                Permission userPermission = new Permission()
                {
                    Type = "user",
                    Role = "writer",
                    EmailAddress = realUser
                };

                var request = service.Permissions.Create(userPermission, realFileId);
                request.Fields = "id";
                batch.Queue(request, callback);

                Permission domainPermission = new Permission()
                {
                    Type = "domain",
                    Role = "reader",
                    Domain = realDomain
                };
                request = service.Permissions.Create(domainPermission, realFileId);
                request.Fields = "id";
                batch.Queue(request, callback);
                var task = batch.ExecuteAsync();
                task.Wait();
                return ids;
            }
            catch (Exception e)
            {
                // TODO(developer) - handle error appropriately
                if (e is AggregateException)
                {
                    Console.WriteLine("Credential Not found");
                }
                else
                {
                    throw;
                }
            }
            return null;
        }
    }
}