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

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

רשימה מלאה של התפקידים והפעולות המותרות על ידי כל אחד מהם זמינה בקישור הבא: תפקידים הרשאות.

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

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

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

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

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

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

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

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

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

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

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

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

השדה expirationTime מציין מתי יפוג תוקף ההרשאה באמצעות RFC 3339 תאריך-שעה הקצר הזה. התשובות שלך יעזרו לנו להשתפר. זמני התפוגה כפופים למגבלות הבאות:

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

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

הפצת הרשאות

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

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

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

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

יכולות

משאב ההרשאות לא בסופו של דבר קובעת את היכולת של המשתמש הנוכחי לבצע פעולות בקובץ או בתיקייה. במקום זאת, משאב 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 כדי להתקשר המשתמש או הקבוצה הספציפיים שקיבלו את ההרשאה.

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

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

  1. משתמשים בשיטה 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
  }
}

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

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

לזהות את מקור התפקיד של אחסון שיתופי או של פריטים באחסון השיתופי נהיגה, להתקשר אל 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 אחד לחשבון אחר באותו ארגון. ארגון שבבעלותו שותף Drive הוא הבעלים של הקבצים שבו. לכן, אין תמיכה בהעברת בעלות לקבצים ולתיקיות שבתיקיות האחסון השיתופי. מארגנים של אחסון שיתופי יכולים להעביר אותו פריטים מהאחסון השיתופי הזה אל 'האחסון שלי' משלהם איזה מעביר את הבעלות אליהם.

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

  • יצירה של הרשאת גישה לקובץ שמעניקה למשתמש ספציפי (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;
        }
    }
}