فایل ها، پوشه ها و درایوها را به اشتراک بگذارید

هر فایل، پوشه و درایو مشترک Google Drive دارای منابع permissions مرتبط است. هر منبع مجوز یک type خاص ( user ، group ، domain ، anyone ) و role ( owner ، organizer ، سازمان‌دهنده fileOrganizer ، writer ، commenter ، reader ) را مشخص می‌کند. به عنوان مثال، یک فایل ممکن است مجوزی داشته باشد که به یک کاربر خاص ( type=user ) دسترسی فقط خواندنی ( role=reader ) می دهد در حالی که مجوز دیگری به اعضای یک گروه خاص ( type=group ) امکان اضافه کردن نظر به یک فایل را می دهد. role=commenter ).

برای فهرست کامل نقش‌ها و عملیات‌های مجاز هر کدام، به نقش‌ها و مجوزها مراجعه کنید.

سناریوهایی برای به اشتراک گذاری منابع Drive

پنج نوع مختلف سناریوهای اشتراک‌گذاری وجود دارد:

  1. برای اشتراک‌گذاری فایل در My Drive، کاربر باید role=writer یا role=owner داشته باشد.

  2. برای اشتراک‌گذاری یک پوشه در My Drive، کاربر باید role=writer یا role=owner داشته باشد.

  3. برای اشتراک‌گذاری فایل در درایو مشترک، کاربر باید role=writer ، role=fileOrganizer یا role=organizer داشته باشد.

    • تنظیم writersCanShare برای موارد موجود در درایوهای مشترک اعمال نمی شود. طوری رفتار می شود که انگار همیشه روی true تنظیم شده است.
  4. برای اشتراک گذاری یک پوشه در درایو مشترک، کاربر باید role=organizer داشته باشد.

    • اگر محدودیت sharingFoldersRequiresOrganizerPermission در درایو مشترک روی false تنظیم شود، کاربران با role=fileOrganizer می توانند پوشه ها را در آن درایو مشترک به اشتراک بگذارند.
  5. برای مدیریت عضویت درایو مشترک، کاربر باید role=organizer داشته باشد. فقط کاربران و گروه ها می توانند عضو درایوهای مشترک باشند.

برای محدود کردن دسترسی به فایل، تاریخ انقضا تعیین کنید

وقتی با افراد روی پروژه‌ای حساس کار می‌کنید، ممکن است بخواهید پس از مدتی دسترسی آنها را به فایل‌های خاصی در Drive محدود کنید. برای فایل‌های My Drive، می‌توانید تاریخ انقضا را برای محدود کردن یا حذف دسترسی به آن فایل تعیین کنید.

برای تنظیم تاریخ انقضا:

  • از متد create() در منبع permissions استفاده کنید و فیلد expirationTime (همراه با سایر فیلدهای مورد نیاز) را تنظیم کنید. برای اطلاعات بیشتر، به ایجاد مجوز مراجعه کنید.

  • از متد update() در منبع permissions استفاده کنید و قسمت expirationTime (همراه با سایر فیلدهای مورد نیاز) را تنظیم کنید. برای اطلاعات بیشتر، به تغییر مجوزها مراجعه کنید.

فیلد expirationTime زمانی را نشان می دهد که مجوز با استفاده از RFC 3339 date-time منقضی می شود. زمان انقضا دارای محدودیت های زیر است:

  • آنها را فقط می توان روی مجوزهای کاربر و گروه تنظیم کرد.
  • زمان باید در آینده باشد.
  • زمان در آینده نمی تواند بیش از یک سال باشد.

برای اطلاعات بیشتر در مورد تاریخ انقضا، به مقالات زیر مراجعه کنید:

انتشار مجوز

لیست های مجوز برای یک پوشه به سمت پایین منتشر می شود و همه فایل ها و پوشه های فرزند مجوزها را از والدین به ارث می برند. هر زمان که مجوزها یا سلسله مراتب تغییر می کند، انتشار به صورت بازگشتی در تمام پوشه های تودرتو انجام می شود. به عنوان مثال، اگر یک فایل در یک پوشه وجود داشته باشد و سپس آن پوشه به پوشه دیگری منتقل شود، مجوزهای موجود در پوشه جدید به فایل منتشر می شود. اگر پوشه جدید به کاربر فایل نقش جدیدی مانند "نویسنده" بدهد، نقش قبلی آنها را لغو می کند.

برعکس، اگر یک فایل role=writer از یک پوشه به ارث ببرد، و به پوشه دیگری منتقل شود که نقش "خواننده" را ارائه می دهد، فایل اکنون role=reader را به ارث می برد.

مجوزهای ارثی را نمی توان از یک فایل یا پوشه در درایو مشترک حذف کرد. در عوض این مجوزها باید بر روی والد مستقیم یا غیرمستقیم که از آن به ارث رسیده اند تنظیم شوند. مجوزهای موروثی را می توان از موارد زیر "My Drive" یا "Shared with me" حذف کرد.

برعکس، مجوزهای ارثی را می توان روی یک فایل یا پوشه در My Drive لغو کرد. بنابراین، اگر یک فایل role=writer از پوشه My Drive به ارث می برد، می توانید role=reader روی فایل تنظیم کنید تا سطح مجوز آن را کاهش دهید.

قابلیت ها

منبع permissions در نهایت توانایی کاربر فعلی برای انجام اقدامات روی یک فایل یا پوشه را تعیین نمی کند. در عوض، منبع files شامل مجموعه‌ای از فیلدهای capabilities بولی است که برای نشان دادن اینکه آیا می‌توان یک عمل را روی یک فایل یا پوشه انجام داد یا خیر. Google Drive API این فیلدها را بر اساس منبع مجوزهای کاربر فعلی مرتبط با فایل یا پوشه تنظیم می کند.

به عنوان مثال، هنگامی که الکس به برنامه شما وارد می شود و سعی می کند یک فایل را به اشتراک بگذارد، نقش الکس برای مجوزهای فایل بررسی می شود. اگر نقش به آنها اجازه می دهد تا یک فایل را به اشتراک بگذارند، capabilities مربوط به فایل، مانند canShare ، نسبت به نقش پر می شود. اگر الکس بخواهد فایل را به اشتراک بگذارد، برنامه شما capabilities را بررسی می کند تا مطمئن شود canShare روی true تنظیم شده است.

برای مثالی از capabilities بازیابی فایل، به تأیید مجوزهای کاربر مراجعه کنید.

یک مجوز ایجاد کنید

هنگام ایجاد مجوز، دو فیلد زیر ضروری است:

  • type : type محدوده مجوز ( 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. از متد 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 تنظیم کنید.

برای مشاهده نحوه تعامل کاربران با مخاطبان هدف، به تجربه کاربری برای اشتراک‌گذاری پیوند مراجعه کنید.

تمام مجوزهای یک فایل، پوشه یا درایو مشترک را بازیابی کنید

از متد list() در منبع permissions برای بازیابی همه مجوزهای یک فایل، پوشه یا درایو مشترک استفاده کنید.

یک مثال نشان دهید

نمونه کد زیر نحوه دریافت همه مجوزها را نشان می دهد. پاسخ لیستی از مجوزها را برمی گرداند.

درخواست کنید

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 روی فایل نداشته باشد، قابلیت نظر دادن باید در UI غیرفعال شود.

برای اطلاعات بیشتر در مورد capabilities ، به بخش قابلیت ها مراجعه کنید.

برای بررسی قابلیت ها، متد get() را در منبع files با پارامتر مسیر 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
  }
}

منبع نقش را برای فایل‌ها و پوشه‌های درایو مشترک تعیین کنید

برای تغییر نقش در یک فایل یا پوشه، باید منبع نقش را بدانید. برای درایوهای مشترک، منبع یک نقش می تواند بر اساس عضویت در درایو مشترک، نقش روی یک پوشه یا نقش روی یک فایل باشد.

برای تعیین منبع نقش برای یک درایو مشترک، یا موارد درون آن درایو، متد get() را در منبع permissions با پارامترهای مسیر fileId و permissionId و پارامتر fields را روی قسمت permissionDetails تنظیم کنید.

برای پیدا کردن permissionId ، از متد list() در منبع permissions با پارامتر مسیر fileId استفاده کنید. برای واکشی فیلد permissionDetails در درخواست list ، پارامتر fields را روی permissions/permissionDetails تنظیم کنید.

این فیلد تمام مجوزهای فایل ارثی و مستقیم برای کاربر، گروه یا دامنه را برمی‌شمارد.

یک مثال نشان دهید

نمونه کد زیر نحوه تعیین منبع نقش را نشان می دهد. پاسخ permissionDetails یک منبع permissions را برمی‌گرداند. فیلد 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. متد update() را در منبع permissions با پارامتر مسیر permissionId روی مجوز تغییر و پارامتر مسیر fileId روی فایل، پوشه یا درایو مشترک مربوطه فراخوانی کنید. برای پیدا کردن permissionId ، از متد list() در منبع permissions با پارامتر مسیر fileId استفاده کنید.

  2. در درخواست، role جدید را مشخص کنید.

شما می‌توانید به فایل‌ها یا پوشه‌های جداگانه در درایو مشترک مجوز بدهید، حتی اگر کاربر یا گروه قبلاً عضو آن باشد. به عنوان مثال، Alex دارای role=commenter به عنوان بخشی از عضویت خود در یک درایو مشترک است. با این حال، برنامه شما می‌تواند به Alex role=writer برای فایلی در درایو مشترک اعطا کند. در این حالت، چون نقش جدید مجازتر از نقشی است که از طریق عضویت آنها اعطا شده است، مجوز جدید به نقش مؤثر پرونده یا پوشه تبدیل می شود.

یک مثال نشان دهید

نمونه کد زیر نحوه تغییر مجوزهای یک فایل یا پوشه از نظر دهنده به نویسنده را نشان می دهد. پاسخ نمونه ای از یک منبع permissions را برمی گرداند.

درخواست کنید

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"
}

پیشنهادهای دسترسی معلق را فهرست و حل کنید

پیشنهاد دسترسی ، پیشنهادی است از سوی درخواست‌کننده به تأییدکننده برای اعطای دسترسی گیرنده به یک مورد Drive.

یک تأییدکننده می‌تواند همه پیشنهادات دسترسی حل‌نشده در فایل‌های Drive را بررسی کرده و روی آنها عمل کند. این بدان معناست که شما می توانید با پرس و جوی برنامه نویسی برای پیشنهادهای دسترسی و سپس حل آنها، روند تأیید را سرعت بخشید. همچنین اجازه می دهد تا پیشنهادات را به صورت مجموع توسط یک تایید کننده مشاهده کند.

Drive API منبع accessproposals فراهم می کند تا بتوانید پیشنهادات دسترسی معلق را مشاهده و حل کنید. روش‌های منبع accessproposals روی فایل‌ها، پوشه‌ها، فایل‌های موجود در درایو مشترک کار می‌کنند اما روی درایو مشترک کار نمی‌کنند .

شرایط زیر برای دسترسی به پیشنهادات خاص است:

  • درخواست کننده : کاربری که پیشنهاد دسترسی به یک مورد Drive را آغاز می کند.
  • گیرنده : کاربری که در صورت اعطای پیشنهاد دسترسی، مجوزهای اضافی روی یک فایل دریافت می کند. اغلب اوقات گیرنده همان درخواست کننده است اما نه همیشه.
  • تایید کننده : کاربری که مسئول تایید (یا رد) پیشنهاد دسترسی است. این معمولاً به این دلیل است که آنها مالک سند هستند یا توانایی اشتراک گذاری سند را دارند.

فهرست پیشنهادهای دسترسی در انتظار

برای فهرست کردن همه پیشنهادات دسترسی معلق روی یک آیتم Drive، متد list() را در منبع accessproposals فراخوانی کنید و پارامتر مسیر fileId را وارد کنید.

فقط تأییدکنندگان یک فایل می‌توانند پیشنهادهای معلق را در یک فایل فهرست کنند. تایید کننده کاربری با قابلیت can_approve_access_proposals در فایل است. اگر درخواست کننده تایید کننده نباشد، یک لیست خالی برگردانده می شود. برای اطلاعات بیشتر در مورد capabilities ، به بخش قابلیت ها مراجعه کنید.

بدنه پاسخ متشکل از یک شی AccessProposal است که فهرستی از پیشنهادات دسترسی حل نشده در فایل را نشان می دهد.

شی AccessProposal شامل اطلاعات مربوط به هر پیشنهاد مانند درخواست کننده، گیرنده و پیامی است که درخواست کننده اضافه کرده است. همچنین شامل یک شی AccessProposalRoleAndView است که role پیشنهادی درخواست کننده را با یک view گروه بندی می کند. از آنجایی که role یک فیلد تکراری است، ممکن است چندین مورد برای هر پیشنهاد وجود داشته باشد. برای مثال، یک پروپوزال ممکن است یک شی AccessProposalRoleAndView از role=reader و view=published ، به علاوه یک شی AccessProposalRoleAndView اضافی با فقط مقدار role=writer داشته باشد. برای اطلاعات بیشتر، مشاهده ها را ببینید.

برای سفارشی کردن صفحه بندی یا فیلتر کردن پیشنهادهای دسترسی، پارامترهای پرس و جو زیر را ارسال کنید:

  • pageToken : یک نشانه صفحه، دریافت شده از یک تماس فهرست قبلی. این نشانه را برای بازیابی صفحه بعدی ارائه دهید.

  • pageSize : حداکثر تعداد پیشنهادهای دسترسی برای بازگشت در هر صفحه.

پیشنهادات دسترسی معلق را حل کنید

برای حل و فصل همه پیشنهادات دسترسی معلق روی یک آیتم Drive، متد resolve() را در منبع accessproposals فراخوانی کنید و پارامترهای مسیر fileId و proposalId را بگنجانید.

متد resolve() شامل یک پارامتر پرس و جوی action است که نشان دهنده اقدامی است که باید روی پیشنهاد انجام شود. شی Action تغییر حالت پیشنهاد را ردیابی می کند تا بدانیم آیا پذیرفته یا رد شده است.

متد resolve() همچنین شامل پارامترهای پرس و جو اختیاری role و view است. تنها نقش های پشتیبانی شده writer ، commenter و reader هستند. اگر نقش مشخص نشده باشد، به طور پیش‌فرض روی reader قرار می‌گیرد. یک پارامتر پرس و جو اختیاری اضافی send_notification به شما امکان می دهد در صورت قبول یا رد پیشنهاد، یک اعلان ایمیلی برای درخواست کننده ارسال کنید.

درست مانند متد list() ، کاربرانی که پروپوزال را حل می کنند باید قابلیت can_approve_access_proposals را در فایل داشته باشند. برای اطلاعات بیشتر در مورد capabilities ، به بخش قابلیت ها مراجعه کنید.

پیشنهادها با استفاده از همان الگوهای فهرست شده در زیر سناریوها برای اشتراک منابع Drive حل می شوند. اگر چندین پیشنهاد برای یک کاربر وجود داشته باشد، اما با نقش های متفاوت، موارد زیر اعمال می شود:

  • اگر یک پیشنهاد پذیرفته شود و یکی رد شود، نقش پذیرفته شده برای مورد Drive اعمال می شود.
  • اگر هر دو پیشنهاد به طور همزمان پذیرفته شوند، پروپوزال با مجوز بالاتر (به عنوان مثال، role=writer در مقابل role=reader ) اعمال می شود. پیشنهاد دسترسی دیگر از مورد حذف می شود.

پس از ارسال پروپوزال به متد resolve() ، عمل اشتراک گذاری کامل می شود. AccessProposal دیگر از طریق متد list() بازگردانده نمی شود. پس از پذیرش پیشنهاد، کاربر باید از مجموعه permissions برای به روز رسانی مجوزها در یک فایل یا پوشه استفاده کند. برای اطلاعات بیشتر، به بخش تغییر مجوزها مراجعه کنید.

دسترسی به یک فایل یا پوشه را لغو کنید

برای لغو دسترسی به یک فایل یا پوشه، متد delete() را در منبع permissions با fileId و پارامترهای مسیر permissionId که برای حذف مجوز تنظیم شده است، فراخوانی کنید.

برای موارد موجود در «درایو من»، امکان حذف یک مجوز ارثی وجود دارد. حذف یک مجوز ارثی دسترسی به مورد و موارد فرزند را در صورت وجود لغو می کند.

برای موارد موجود در درایو مشترک، مجوزهای موروثی قابل لغو نیستند. در عوض مجوز فایل یا پوشه والد را به‌روزرسانی یا لغو کنید.

متد delete() همچنین برای حذف مجوزهایی که مستقیماً به فایل یا پوشه درایو مشترک اعمال می شود استفاده می شود.

یک مثال نشان دهید

نمونه کد زیر نحوه لغو دسترسی با حذف permissionId را نشان می دهد. در صورت موفقیت آمیز بودن، بدنه پاسخ خالی است. برای تایید حذف مجوز، از متد list() در منبع permissions با پارامتر مسیر fileId استفاده کنید.

درخواست کنید

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

مالکیت فایل را به حساب Google Workspace دیگری در همان سازمان منتقل کنید

مالکیت فایل‌های موجود در «My Drive» را می‌توان از یک حساب Google Workspace به حساب دیگری در همان سازمان منتقل کرد. سازمانی که دارای یک درایو مشترک است، مالک فایل‌های درون آن است. بنابراین، انتقال مالکیت برای فایل‌ها و پوشه‌ها در درایوهای مشترک پشتیبانی نمی‌شود. سازمان‌دهندگان یک درایو مشترک می‌توانند موارد را از آن درایو مشترک به «درایو من» خود منتقل کنند که مالکیت را به آن‌ها منتقل می‌کند.

برای انتقال مالکیت یک فایل در My Drive، یکی از موارد زیر را انجام دهید:

  • یک مجوز فایل ایجاد کنید که به یک کاربر خاص ( type=user ) دسترسی مالک ( role=owner ) را بدهد.

  • مجوز یک فایل موجود را با role=owner به روز کنید و مالکیت را به کاربر مشخص شده منتقل کنید ( transferOwnership=true ).

انتقال مالکیت فایل از یک حساب مصرف کننده به حساب دیگر

مالکیت فایل ها را می توان بین یک حساب مصرف کننده به حساب دیگر منتقل کرد. با این حال، Drive مالکیت یک فایل را بین دو حساب مصرف‌کننده منتقل نمی‌کند تا زمانی که مالک احتمالی صریحاً با انتقال موافقت کند. برای انتقال مالکیت فایل از یک حساب مصرف کننده به حساب دیگر:

  1. مالک فعلی با ایجاد یا به‌روزرسانی مجوز فایل مالک احتمالی، انتقال مالکیت را آغاز می‌کند. مجوز باید شامل این تنظیمات باشد: role=writer ، type=user و pendingOwner=true . اگر مالک فعلی مجوزی برای مالک احتمالی ایجاد کند، یک اعلان ایمیلی برای مالک احتمالی ارسال می‌شود که نشان می‌دهد از آنها خواسته می‌شود مالکیت فایل را به عهده بگیرند.

  2. مالک بالقوه با ایجاد یا به‌روزرسانی مجوز فایل خود، درخواست انتقال مالکیت را می‌پذیرد. مجوز باید شامل این تنظیمات باشد: role=owner و transferOwnership=true . اگر مالک احتمالی در حال ایجاد مجوز جدید باشد، یک اعلان ایمیلی به مالک قبلی ارسال می‌شود که نشان می‌دهد مالکیت منتقل شده است.

هنگامی که یک فایل منتقل می شود، نقش مالک قبلی به writer کاهش می یابد.

چندین مجوز را با درخواست های دسته ای تغییر دهید

ما قویاً توصیه می کنیم از درخواست های دسته ای برای تغییر چندین مجوز استفاده کنید.

در زیر نمونه ای از انجام اصلاح دسته ای مجوز با کتابخانه سرویس گیرنده است.

جاوا

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;
    }
  }
}

پایتون

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;
    }

}

دات نت

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;
        }
    }
}
،

هر فایل، پوشه و درایو مشترک Google Drive دارای منابع permissions مرتبط است. هر منبع مجوز یک type خاص ( user ، group ، domain ، anyone ) و role ( owner ، organizer ، سازمان‌دهنده fileOrganizer ، writer ، commenter ، reader ) را مشخص می‌کند. به عنوان مثال، یک فایل ممکن است مجوزی داشته باشد که به یک کاربر خاص ( type=user ) دسترسی فقط خواندنی ( role=reader ) می دهد در حالی که مجوز دیگری به اعضای یک گروه خاص ( type=group ) امکان اضافه کردن نظر به یک فایل را می دهد. role=commenter ).

برای فهرست کامل نقش‌ها و عملیات‌های مجاز هر کدام، به نقش‌ها و مجوزها مراجعه کنید.

سناریوهایی برای به اشتراک گذاری منابع Drive

پنج نوع مختلف سناریوهای اشتراک‌گذاری وجود دارد:

  1. برای اشتراک‌گذاری فایل در My Drive، کاربر باید role=writer یا role=owner داشته باشد.

  2. برای اشتراک‌گذاری یک پوشه در My Drive، کاربر باید role=writer یا role=owner داشته باشد.

  3. برای اشتراک‌گذاری فایل در درایو مشترک، کاربر باید role=writer ، role=fileOrganizer یا role=organizer داشته باشد.

    • تنظیم writersCanShare برای موارد موجود در درایوهای مشترک اعمال نمی شود. طوری رفتار می شود که انگار همیشه روی true تنظیم شده است.
  4. برای اشتراک گذاری یک پوشه در درایو مشترک، کاربر باید role=organizer داشته باشد.

    • اگر محدودیت sharingFoldersRequiresOrganizerPermission در درایو مشترک روی false تنظیم شود، کاربران با role=fileOrganizer می توانند پوشه ها را در آن درایو مشترک به اشتراک بگذارند.
  5. برای مدیریت عضویت درایو مشترک، کاربر باید role=organizer داشته باشد. فقط کاربران و گروه ها می توانند عضو درایوهای مشترک باشند.

برای محدود کردن دسترسی به فایل، تاریخ انقضا تعیین کنید

وقتی با افراد روی پروژه‌ای حساس کار می‌کنید، ممکن است بخواهید پس از مدتی دسترسی آنها را به فایل‌های خاصی در Drive محدود کنید. برای فایل‌های My Drive، می‌توانید تاریخ انقضا را برای محدود کردن یا حذف دسترسی به آن فایل تعیین کنید.

برای تنظیم تاریخ انقضا:

  • از متد create() در منبع permissions استفاده کنید و فیلد expirationTime (همراه با سایر فیلدهای مورد نیاز) را تنظیم کنید. برای اطلاعات بیشتر، به ایجاد مجوز مراجعه کنید.

  • از متد update() در منبع permissions استفاده کنید و قسمت expirationTime (همراه با سایر فیلدهای مورد نیاز) را تنظیم کنید. برای اطلاعات بیشتر، به تغییر مجوزها مراجعه کنید.

فیلد expirationTime زمانی را نشان می دهد که مجوز با استفاده از RFC 3339 date-time منقضی می شود. زمان انقضا دارای محدودیت های زیر است:

  • آنها را فقط می توان روی مجوزهای کاربر و گروه تنظیم کرد.
  • زمان باید در آینده باشد.
  • زمان در آینده نمی تواند بیش از یک سال باشد.

برای اطلاعات بیشتر در مورد تاریخ انقضا، به مقالات زیر مراجعه کنید:

انتشار مجوز

لیست های مجوز برای یک پوشه به سمت پایین منتشر می شود و همه فایل ها و پوشه های فرزند مجوزها را از والدین به ارث می برند. هر زمان که مجوزها یا سلسله مراتب تغییر می کند، انتشار به صورت بازگشتی در تمام پوشه های تودرتو انجام می شود. به عنوان مثال، اگر یک فایل در یک پوشه وجود داشته باشد و سپس آن پوشه به پوشه دیگری منتقل شود، مجوزهای موجود در پوشه جدید به فایل منتشر می شود. اگر پوشه جدید به کاربر فایل نقش جدیدی مانند "نویسنده" بدهد، نقش قبلی آنها را لغو می کند.

برعکس، اگر یک فایل role=writer از یک پوشه به ارث ببرد، و به پوشه دیگری منتقل شود که نقش "خواننده" را ارائه می دهد، فایل اکنون role=reader را به ارث می برد.

مجوزهای ارثی را نمی توان از یک فایل یا پوشه در درایو مشترک حذف کرد. در عوض این مجوزها باید بر روی والد مستقیم یا غیرمستقیم که از آن به ارث رسیده اند تنظیم شوند. مجوزهای موروثی را می توان از موارد زیر "My Drive" یا "Shared with me" حذف کرد.

برعکس، مجوزهای ارثی را می توان روی یک فایل یا پوشه در My Drive لغو کرد. بنابراین، اگر یک فایل role=writer از پوشه My Drive به ارث می برد، می توانید role=reader روی فایل تنظیم کنید تا سطح مجوز آن را کاهش دهید.

قابلیت ها

منبع permissions در نهایت توانایی کاربر فعلی برای انجام اقدامات روی یک فایل یا پوشه را تعیین نمی کند. در عوض، منبع files شامل مجموعه‌ای از فیلدهای capabilities بولی است که برای نشان دادن اینکه آیا می‌توان یک عمل را روی یک فایل یا پوشه انجام داد یا خیر. Google Drive API این فیلدها را بر اساس منبع مجوزهای کاربر فعلی مرتبط با فایل یا پوشه تنظیم می کند.

به عنوان مثال، هنگامی که الکس به برنامه شما وارد می شود و سعی می کند یک فایل را به اشتراک بگذارد، نقش الکس برای مجوزهای فایل بررسی می شود. اگر نقش به آنها اجازه می دهد تا یک فایل را به اشتراک بگذارند، capabilities مربوط به فایل، مانند canShare ، نسبت به نقش پر می شود. اگر الکس بخواهد فایل را به اشتراک بگذارد، برنامه شما capabilities را بررسی می کند تا مطمئن شود canShare روی true تنظیم شده است.

برای مثالی از capabilities بازیابی فایل، به تأیید مجوزهای کاربر مراجعه کنید.

یک مجوز ایجاد کنید

هنگام ایجاد مجوز، دو فیلد زیر ضروری است:

  • type : type محدوده مجوز ( 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. از متد 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 تنظیم کنید.

برای مشاهده نحوه تعامل کاربران با مخاطبان هدف، به تجربه کاربری برای اشتراک‌گذاری پیوند مراجعه کنید.

تمام مجوزهای یک فایل، پوشه یا درایو مشترک را بازیابی کنید

از متد list() در منبع permissions برای بازیابی همه مجوزهای یک فایل، پوشه یا درایو مشترک استفاده کنید.

یک مثال نشان دهید

نمونه کد زیر نحوه دریافت همه مجوزها را نشان می دهد. پاسخ لیستی از مجوزها را برمی گرداند.

درخواست کنید

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 روی فایل نداشته باشد، قابلیت نظر دادن باید در UI غیرفعال شود.

برای اطلاعات بیشتر در مورد capabilities ، به بخش قابلیت ها مراجعه کنید.

برای بررسی قابلیت ها، متد get() را در منبع files با پارامتر مسیر 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
  }
}

منبع نقش را برای فایل‌ها و پوشه‌های درایو مشترک تعیین کنید

برای تغییر نقش در یک فایل یا پوشه، باید منبع نقش را بدانید. برای درایوهای مشترک، منبع یک نقش می تواند بر اساس عضویت در درایو مشترک، نقش روی یک پوشه یا نقش روی یک فایل باشد.

برای تعیین منبع نقش برای یک درایو مشترک، یا موارد درون آن درایو، متد get() را در منبع permissions با پارامترهای مسیر fileId و permissionId و پارامتر fields را روی قسمت permissionDetails تنظیم کنید.

برای پیدا کردن permissionId ، از متد list() در منبع permissions با پارامتر مسیر fileId استفاده کنید. برای واکشی فیلد permissionDetails در درخواست list ، پارامتر fields را روی permissions/permissionDetails تنظیم کنید.

این فیلد تمام مجوزهای فایل ارثی و مستقیم برای کاربر، گروه یا دامنه را برمی‌شمارد.

یک مثال نشان دهید

نمونه کد زیر نحوه تعیین منبع نقش را نشان می دهد. پاسخ permissionDetails یک منبع permissions را برمی‌گرداند. فیلد 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. متد update() را در منبع permissions با پارامتر مسیر permissionId روی مجوز تغییر و پارامتر مسیر fileId روی فایل، پوشه یا درایو مشترک مربوطه فراخوانی کنید. برای پیدا کردن permissionId ، از متد list() در منبع permissions با پارامتر مسیر fileId استفاده کنید.

  2. در درخواست، role جدید را مشخص کنید.

شما می‌توانید به فایل‌ها یا پوشه‌های جداگانه در درایو مشترک مجوز بدهید، حتی اگر کاربر یا گروه قبلاً عضو آن باشد. به عنوان مثال، Alex دارای role=commenter به عنوان بخشی از عضویت خود در یک درایو مشترک است. با این حال، برنامه شما می‌تواند به Alex role=writer برای فایلی در درایو مشترک اعطا کند. در این حالت، چون نقش جدید مجازتر از نقشی است که از طریق عضویت آنها اعطا شده است، مجوز جدید به نقش مؤثر پرونده یا پوشه تبدیل می شود.

یک مثال نشان دهید

نمونه کد زیر نحوه تغییر مجوزهای یک فایل یا پوشه از نظر دهنده به نویسنده را نشان می دهد. پاسخ نمونه ای از یک منبع permissions را برمی گرداند.

درخواست کنید

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"
}

پیشنهادهای دسترسی معلق را فهرست و حل کنید

پیشنهاد دسترسی ، پیشنهادی است از سوی درخواست‌کننده به تأییدکننده برای اعطای دسترسی گیرنده به یک مورد Drive.

یک تأییدکننده می‌تواند همه پیشنهادات دسترسی حل‌نشده در فایل‌های Drive را بررسی کرده و روی آنها عمل کند. این بدان معناست که شما می توانید با پرس و جوی برنامه نویسی برای پیشنهادهای دسترسی و سپس حل آنها، روند تأیید را سرعت بخشید. همچنین اجازه می دهد تا پیشنهادات را به صورت مجموع توسط یک تایید کننده مشاهده کند.

Drive API منبع accessproposals فراهم می کند تا بتوانید پیشنهادات دسترسی معلق را مشاهده و حل کنید. روش‌های منبع accessproposals روی فایل‌ها، پوشه‌ها، فایل‌های موجود در درایو مشترک کار می‌کنند اما روی درایو مشترک کار نمی‌کنند .

شرایط زیر برای دسترسی به پیشنهادات خاص است:

  • درخواست کننده : کاربری که پیشنهاد دسترسی به یک مورد Drive را آغاز می کند.
  • گیرنده : کاربری که در صورت اعطای پیشنهاد دسترسی، مجوزهای اضافی روی یک فایل دریافت می کند. اغلب اوقات گیرنده همان درخواست کننده است اما نه همیشه.
  • تایید کننده : کاربری که مسئول تایید (یا رد) پیشنهاد دسترسی است. این معمولاً به این دلیل است که آنها مالک سند هستند یا توانایی اشتراک گذاری سند را دارند.

فهرست پیشنهادهای دسترسی در انتظار

برای فهرست کردن همه پیشنهادات دسترسی معلق روی یک آیتم Drive، متد list() را در منبع accessproposals فراخوانی کنید و پارامتر مسیر fileId را وارد کنید.

فقط تأییدکنندگان یک فایل می‌توانند پیشنهادهای معلق را در یک فایل فهرست کنند. تایید کننده کاربری با قابلیت can_approve_access_proposals در فایل است. اگر درخواست کننده تایید کننده نباشد، یک لیست خالی برگردانده می شود. برای اطلاعات بیشتر در مورد capabilities ، به بخش قابلیت ها مراجعه کنید.

بدنه پاسخ متشکل از یک شی AccessProposal است که فهرستی از پیشنهادات دسترسی حل نشده در فایل را نشان می دهد.

شی AccessProposal شامل اطلاعات مربوط به هر پیشنهاد مانند درخواست کننده، گیرنده و پیامی است که درخواست کننده اضافه کرده است. همچنین شامل یک شی AccessProposalRoleAndView است که role پیشنهادی درخواست کننده را با یک view گروه بندی می کند. از آنجایی که role یک فیلد تکراری است، ممکن است چندین مورد برای هر پیشنهاد وجود داشته باشد. برای مثال، یک پروپوزال ممکن است یک شی AccessProposalRoleAndView از role=reader و view=published ، به علاوه یک شی AccessProposalRoleAndView اضافی با فقط مقدار role=writer داشته باشد. برای اطلاعات بیشتر، مشاهده ها را ببینید.

برای سفارشی کردن صفحه بندی یا فیلتر کردن پیشنهادهای دسترسی، پارامترهای پرس و جو زیر را ارسال کنید:

  • pageToken : یک نشانه صفحه، دریافت شده از یک تماس فهرست قبلی. این نشانه را برای بازیابی صفحه بعدی ارائه دهید.

  • pageSize : حداکثر تعداد پیشنهادهای دسترسی برای بازگشت در هر صفحه.

پیشنهادات دسترسی معلق را حل کنید

برای حل و فصل همه پیشنهادات دسترسی معلق روی یک آیتم Drive، متد resolve() را در منبع accessproposals فراخوانی کنید و پارامترهای مسیر fileId و proposalId را بگنجانید.

متد resolve() شامل یک پارامتر پرس و جوی action است که نشان دهنده اقدامی است که باید روی پیشنهاد انجام شود. شی Action تغییر حالت پیشنهاد را ردیابی می کند تا بدانیم آیا پذیرفته یا رد شده است.

متد resolve() همچنین شامل پارامترهای پرس و جو اختیاری role و view است. تنها نقش های پشتیبانی شده writer ، commenter و reader هستند. اگر نقش مشخص نشده باشد، به طور پیش‌فرض روی reader قرار می‌گیرد. یک پارامتر پرس و جو اختیاری اضافی send_notification به شما امکان می دهد در صورت قبول یا رد پیشنهاد، یک اعلان ایمیلی برای درخواست کننده ارسال کنید.

درست مانند متد list() ، کاربرانی که پروپوزال را حل می کنند باید قابلیت can_approve_access_proposals را در فایل داشته باشند. برای اطلاعات بیشتر در مورد capabilities ، به بخش قابلیت ها مراجعه کنید.

پیشنهادها با استفاده از همان الگوهای فهرست شده در زیر سناریوها برای اشتراک منابع Drive حل می شوند. اگر چندین پیشنهاد برای یک کاربر وجود داشته باشد، اما با نقش های متفاوت، موارد زیر اعمال می شود:

  • اگر یک پیشنهاد پذیرفته شود و یکی رد شود، نقش پذیرفته شده برای مورد Drive اعمال می شود.
  • اگر هر دو پیشنهاد به طور همزمان پذیرفته شوند، پروپوزال با مجوز بالاتر (به عنوان مثال، role=writer در مقابل role=reader ) اعمال می شود. پیشنهاد دسترسی دیگر از مورد حذف می شود.

پس از ارسال پروپوزال به متد resolve() ، عمل اشتراک گذاری کامل می شود. AccessProposal دیگر از طریق متد list() بازگردانده نمی شود. پس از پذیرش پیشنهاد، کاربر باید از مجموعه permissions برای به روز رسانی مجوزها در یک فایل یا پوشه استفاده کند. برای اطلاعات بیشتر، به بخش تغییر مجوزها مراجعه کنید.

دسترسی به یک فایل یا پوشه را لغو کنید

برای لغو دسترسی به یک فایل یا پوشه، متد delete() را در منبع permissions با fileId و پارامترهای مسیر permissionId که برای حذف مجوز تنظیم شده است، فراخوانی کنید.

برای موارد موجود در «درایو من»، امکان حذف یک مجوز ارثی وجود دارد. حذف یک مجوز ارثی دسترسی به مورد و موارد فرزند را در صورت وجود لغو می کند.

برای موارد موجود در درایو مشترک، مجوزهای موروثی قابل لغو نیستند. در عوض مجوز فایل یا پوشه والد را به‌روزرسانی یا لغو کنید.

متد delete() همچنین برای حذف مجوزهایی که مستقیماً به فایل یا پوشه درایو مشترک اعمال می شود استفاده می شود.

یک مثال نشان دهید

نمونه کد زیر نحوه لغو دسترسی با حذف permissionId را نشان می دهد. در صورت موفقیت آمیز بودن، بدنه پاسخ خالی است. برای تایید حذف مجوز، از متد list() در منبع permissions با پارامتر مسیر fileId استفاده کنید.

درخواست کنید

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

مالکیت فایل را به حساب Google Workspace دیگری در همان سازمان منتقل کنید

مالکیت فایل‌های موجود در «My Drive» را می‌توان از یک حساب Google Workspace به حساب دیگری در همان سازمان منتقل کرد. سازمانی که دارای یک درایو مشترک است، مالک فایل‌های درون آن است. بنابراین، انتقال مالکیت برای فایل‌ها و پوشه‌ها در درایوهای مشترک پشتیبانی نمی‌شود. سازمان‌دهندگان یک درایو مشترک می‌توانند موارد را از آن درایو مشترک به «درایو من» خود منتقل کنند که مالکیت را به آن‌ها منتقل می‌کند.

برای انتقال مالکیت یک فایل در My Drive، یکی از موارد زیر را انجام دهید:

  • یک مجوز فایل ایجاد کنید که به یک کاربر خاص ( type=user ) دسترسی مالک ( role=owner ) را بدهد.

  • مجوز یک فایل موجود را با role=owner به روز کنید و مالکیت را به کاربر مشخص شده منتقل کنید ( transferOwnership=true ).

انتقال مالکیت فایل از یک حساب مصرف کننده به حساب دیگر

مالکیت فایل ها را می توان بین یک حساب مصرف کننده به حساب دیگر منتقل کرد. با این حال، Drive مالکیت یک فایل را بین دو حساب مصرف‌کننده منتقل نمی‌کند تا زمانی که مالک احتمالی صریحاً با انتقال موافقت کند. برای انتقال مالکیت فایل از یک حساب مصرف کننده به حساب دیگر:

  1. مالک فعلی با ایجاد یا به‌روزرسانی مجوز فایل مالک احتمالی، انتقال مالکیت را آغاز می‌کند. مجوز باید شامل این تنظیمات باشد: role=writer ، type=user و pendingOwner=true . اگر مالک فعلی مجوزی برای مالک احتمالی ایجاد کند، یک اعلان ایمیلی برای مالک احتمالی ارسال می‌شود که نشان می‌دهد از آنها خواسته می‌شود مالکیت فایل را به عهده بگیرند.

  2. مالک بالقوه با ایجاد یا به‌روزرسانی مجوز فایل خود، درخواست انتقال مالکیت را می‌پذیرد. مجوز باید شامل این تنظیمات باشد: role=owner و transferOwnership=true . اگر مالک احتمالی در حال ایجاد مجوز جدید باشد، یک اعلان ایمیلی به مالک قبلی ارسال می‌شود که نشان می‌دهد مالکیت منتقل شده است.

هنگامی که یک فایل منتقل می شود، نقش مالک قبلی به writer کاهش می یابد.

چندین مجوز را با درخواست های دسته ای تغییر دهید

ما قویاً توصیه می کنیم از درخواست های دسته ای برای تغییر چندین مجوز استفاده کنید.

در زیر نمونه ای از انجام اصلاح دسته ای مجوز با کتابخانه سرویس گیرنده است.

جاوا

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;
    }
  }
}

پایتون

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;
    }

}

دات نت

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;
        }
    }
}