Chia sẻ tệp, thư mục và ổ đĩa

Mỗi tệp, thư mục và bộ nhớ dùng chung trên Google Drive đều có tài nguyên permissions được liên kết. Mỗi tài nguyên xác định quyền của một type cụ thể (user, group, domain, anyone) và role (owner, organizer, fileOrganizer, writer, commenter, reader). Ví dụ: tệp có thể có quyền cấp cho một người dùng cụ thể (type=user) quyền chỉ đọc (role=reader) trong khi một quyền khác cấp cho các thành viên của một nhóm cụ thể (type=group) quyền thêm nhận xét (1 nhận xét).role=commenter

Để biết danh sách đầy đủ các vai trò và thao tác mà mỗi vai trò cho phép, hãy tham khảo bài viết Vai trò và quyền.

Các trường hợp chia sẻ tài nguyên trên Drive

Có 5 loại tình huống chia sẻ:

  1. Để chia sẻ tệp trong Drive của tôi, người dùng phải có role=writer hoặc role=owner.

  2. Để chia sẻ thư mục trong Drive của tôi, người dùng phải có role=writer hoặc role=owner.

    • Nếu giá trị boolean writersCanShare được đặt thành false cho tệp, thì người dùng phải có role=owner có nhiều quyền hơn.

    • Không cho phép quyền truy cập tạm thời (do ngày và giờ hết hạn quy định) trên các thư mục trong Drive của tôi bằng role=writer. Để biết thêm thông tin, hãy xem bài viết Đặt ngày hết hạn để giới hạn quyền truy cập vào tệp.

  3. Để chia sẻ tệp trong bộ nhớ dùng chung, người dùng phải có role=writer, role=fileOrganizer hoặc role=organizer.

    • Chế độ cài đặt writersCanShare không áp dụng cho các mục trong bộ nhớ dùng chung. Thuộc tính này được coi như luôn được đặt thành true.
  4. Để chia sẻ thư mục trong bộ nhớ dùng chung, người dùng phải có role=organizer.

    • Nếu bạn đặt giới hạn sharingFoldersRequiresOrganizerPermission trên bộ nhớ dùng chung thành false, thì người dùng có role=fileOrganizer có thể chia sẻ thư mục trong bộ nhớ dùng chung đó.
  5. Để quản lý tư cách thành viên trong bộ nhớ dùng chung, người dùng phải có role=organizer. Chỉ người dùng và nhóm mới có thể là thành viên của bộ nhớ dùng chung.

Đặt ngày hết hạn để giới hạn quyền truy cập vào tệp

Khi làm việc với mọi người trong một dự án nhạy cảm, bạn nên hạn chế quyền truy cập của họ vào một số tệp nhất định trong Drive sau một khoảng thời gian. Đối với các tệp trong Drive của tôi, bạn có thể đặt ngày hết hạn để giới hạn hoặc xoá quyền truy cập vào tệp đó.

Cách đặt ngày hết hạn:

  • Sử dụng phương thức create() trên tài nguyên permissions và đặt trường expirationTime (cùng với các trường bắt buộc khác). Để biết thêm thông tin, hãy xem phần Tạo quyền.

  • Sử dụng phương thức update() trên tài nguyên permissions và đặt trường expirationTime (cùng với các trường bắt buộc khác). Để biết thêm thông tin, hãy xem phần Thay đổi quyền.

Trường expirationTime cho biết thời điểm quyền hết hạn bằng cách sử dụng RFC 3339 ngày-giờ. Thời gian hết hạn có các hạn chế sau:

  • Bạn chỉ có thể đặt các quyền này cho quyền của người dùng và nhóm.
  • Thời gian phải là thời gian trong tương lai.
  • Thời gian này không được vượt quá một năm trong tương lai.

Để biết thêm thông tin về ngày hết hạn, hãy xem các bài viết sau:

Truyền quyền

Danh sách quyền cho một thư mục sẽ truyền xuống dưới và tất cả tệp con và thư mục con sẽ kế thừa quyền từ thư mục mẹ. Bất cứ khi nào quyền hoặc hệ phân cấp thay đổi, quá trình truyền tải sẽ xảy ra đệ quy thông qua tất cả thư mục lồng nhau. Ví dụ: nếu một tệp tồn tại trong một thư mục và sau đó thư mục đó được di chuyển trong một thư mục khác, thì các quyền trên thư mục mới sẽ được truyền đến tệp. Nếu thư mục mới cấp cho người dùng tệp một vai trò mới, chẳng hạn như "người viết", thì thư mục đó sẽ ghi đè vai trò cũ của họ.

Ngược lại, nếu một tệp kế thừa role=writer từ một thư mục và được di chuyển sang một thư mục khác cung cấp vai trò "người đọc", thì tệp đó hiện sẽ kế thừa role=reader.

Bạn không thể xoá các quyền được kế thừa khỏi một tệp hoặc thư mục trong bộ nhớ dùng chung. Thay vào đó, bạn phải điều chỉnh các quyền này trên mục mẹ trực tiếp hoặc gián tiếp mà các quyền này được kế thừa. Bạn có thể xoá các quyền được kế thừa khỏi các mục trong "Drive của tôi" hoặc "Được chia sẻ với tôi".

Ngược lại, bạn có thể ghi đè các quyền kế thừa trên một tệp hoặc thư mục trong Drive của tôi. Vì vậy, nếu một tệp kế thừa role=writer từ thư mục My Drive, bạn có thể đặt role=reader trên tệp đó để giảm cấp độ quyền.

Tính năng

Tài nguyên permissions không xác định cuối cùng khả năng thực hiện thao tác trên tệp hoặc thư mục của người dùng hiện tại. Thay vào đó, tài nguyên files chứa một tập hợp các trường capabilities boolean dùng để cho biết liệu có thể thực hiện một thao tác trên tệp hoặc thư mục hay không. API Google Drive đặt các trường này dựa trên tài nguyên quyền của người dùng hiện tại được liên kết với tệp hoặc thư mục.

Ví dụ: khi Alex đăng nhập vào ứng dụng của bạn và cố gắng chia sẻ một tệp, vai trò của Alex sẽ được kiểm tra để xem có quyền đối với tệp đó hay không. Nếu vai trò cho phép họ chia sẻ tệp, thì capabilities liên quan đến tệp, chẳng hạn như canShare, sẽ được điền theo vai trò. Nếu Alex muốn chia sẻ tệp, ứng dụng của bạn sẽ kiểm tra capabilities để đảm bảo rằng canShare được đặt thành true.

Để biết ví dụ về cách truy xuất tệp capabilities, hãy xem phần Xác minh quyền của người dùng.

Tạo quyền

Bạn cần có hai trường sau đây khi tạo quyền:

  • type: type xác định phạm vi của quyền (user, group, domain hoặc anyone). Quyền có type=user áp dụng cho một người dùng cụ thể, trong khi quyền có type=domain áp dụng cho mọi người trong một miền cụ thể.

  • role: Trường role xác định các thao tác mà type có thể thực hiện. Ví dụ: quyền có type=userrole=reader sẽ cấp cho một người dùng cụ thể quyền chỉ có thể đọc đối với tệp hoặc thư mục đó. Hoặc, quyền có type=domainrole=commenter cho phép mọi người trong miền thêm nhận xét vào tệp. Để xem danh sách đầy đủ các vai trò và thao tác mà mỗi vai trò cho phép, hãy tham khảo phần Vai trò và quyền.

Khi tạo một quyền trong đó type=user hoặc type=group, bạn cũng phải cung cấp emailAddress để liên kết người dùng hoặc nhóm cụ thể với quyền đó.

Khi tạo một quyền trong đó type=domain, bạn cũng phải cung cấp một domain để liên kết một miền cụ thể với quyền đó.

Cách tạo quyền:

  1. Sử dụng phương thức create() với tham số đường dẫn fileId cho tệp hoặc thư mục được liên kết.
  2. Trong phần nội dung yêu cầu, hãy chỉ định typerole.
  3. Nếu là type=user hoặc type=group, hãy cung cấp emailAddress. Nếu là type=domain, hãy cung cấp domain.

Hiển thị ví dụ

Mã mẫu sau đây cho biết cách tạo quyền. Phản hồi trả về một thực thể của tài nguyên Permission, bao gồm cả permissionId được chỉ định.

Yêu cầu

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

Đáp

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

Sử dụng đối tượng mục tiêu

Đối tượng mục tiêu là các nhóm người (chẳng hạn như phòng ban hoặc nhóm) mà bạn có thể đề xuất cho người dùng để chia sẻ các mục của họ. Bạn có thể khuyến khích người dùng chia sẻ các mục với một đối tượng cụ thể hoặc hạn chế hơn thay vì toàn bộ tổ chức. Đối tượng mục tiêu có thể giúp bạn cải thiện tính bảo mật và quyền riêng tư cho dữ liệu của mình, đồng thời giúp người dùng dễ dàng chia sẻ một cách phù hợp hơn. Để biết thêm thông tin, hãy xem bài viết Giới thiệu về đối tượng mục tiêu.

Cách sử dụng đối tượng mục tiêu:

  1. Trong Bảng điều khiển dành cho quản trị viên của Google, hãy chuyển đến Trình đơn > Thư mục > Đối tượng mục tiêu.

    Chuyển đến mục Đối tượng mục tiêu

    Bạn phải đăng nhập bằng tài khoản có các đặc quyền của quản trị viên cấp cao để thực hiện việc này.

  2. Trong Danh sách đối tượng mục tiêu, hãy nhấp vào tên của đối tượng mục tiêu. Để tạo đối tượng mục tiêu, hãy xem bài viết Tạo đối tượng mục tiêu

  3. Sao chép mã nhận dạng duy nhất từ URL của đối tượng mục tiêu: https://admin.google.com/ac/targetaudiences/ID.

  4. Tạo quyền bằng type=domain và đặt trường domain thành ID.audience.googledomains.com.

Để xem cách người dùng tương tác với đối tượng mục tiêu, hãy xem bài viết Trải nghiệm người dùng khi chia sẻ đường liên kết.

Truy xuất tất cả quyền đối với một tệp, thư mục hoặc bộ nhớ dùng chung

Sử dụng phương thức list() trên tài nguyên permissions để truy xuất tất cả quyền đối với một tệp, thư mục hoặc bộ nhớ dùng chung.

Hiển thị ví dụ

Mã mẫu sau đây cho biết cách lấy tất cả quyền. Phản hồi trả về danh sách các quyền.

Yêu cầu

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

Đáp

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

Xác minh quyền của người dùng

Khi mở một tệp, ứng dụng của bạn sẽ kiểm tra các chức năng của tệp và hiển thị giao diện người dùng để phản ánh các quyền của người dùng hiện tại. Ví dụ: nếu người dùng không có chức năng canComment trên tệp, thì chức năng nhận xét sẽ bị tắt trong giao diện người dùng.

Để biết thêm thông tin về capabilities, hãy xem phần Tính năng.

Để kiểm tra các chức năng, hãy gọi phương thức get() trên tài nguyên files bằng tham số đường dẫn fileId và tham số fields được đặt thành trường capabilities. Để biết thêm thông tin về cách trả về các trường bằng tham số fields, hãy xem phần Trả về các trường cụ thể cho một tệp.

Hiển thị ví dụ

Mã mẫu sau đây cho biết cách xác minh quyền của người dùng. Phản hồi sẽ trả về danh sách các quyền mà người dùng có trên tệp. Mỗi chức năng tương ứng với một hành động chi tiết mà người dùng có thể thực hiện. Một số trường chỉ được điền sẵn cho các mục trong bộ nhớ dùng chung.

Yêu cầu

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

Đáp

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

Xác định nguồn vai trò cho các tệp và thư mục trong bộ nhớ dùng chung

Để thay đổi vai trò trên tệp hoặc thư mục, bạn phải biết nguồn của vai trò. Đối với bộ nhớ dùng chung, nguồn của vai trò có thể dựa trên tư cách thành viên của bộ nhớ dùng chung, vai trò trên thư mục hoặc vai trò trên tệp.

Để xác định nguồn vai trò cho một bộ nhớ dùng chung hoặc các mục trong bộ nhớ đó, hãy gọi phương thức get() trên tài nguyên permissions với tham số đường dẫn fileIdpermissionId, đồng thời đặt tham số fields thành trường permissionDetails.

Để tìm permissionId, hãy sử dụng phương thức list() trên tài nguyên permissions với tham số đường dẫn fileId. Để tìm nạp trường permissionDetails trên yêu cầu list, hãy đặt tham số fields thành permissions/permissionDetails.

Trường này liệt kê tất cả các quyền đối với tệp được kế thừa và trực tiếp cho người dùng, nhóm hoặc miền.

Hiển thị ví dụ

Mã mẫu sau đây cho biết cách xác định nguồn vai trò. Phản hồi trả về permissionDetails của tài nguyên permissions. Trường inheritedFrom cung cấp mã nhận dạng của mục mà quyền được kế thừa từ đó.

Yêu cầu

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

Đáp

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

Thay đổi quyền

Để thay đổi quyền đối với một tệp hoặc thư mục, bạn có thể thay đổi vai trò được chỉ định:

  1. Gọi phương thức update() trên tài nguyên permissions với tham số đường dẫn permissionId được đặt thành quyền thay đổi và tham số đường dẫn fileId được đặt thành tệp, thư mục hoặc bộ nhớ dùng chung được liên kết. Để tìm permissionId, hãy sử dụng phương thức list() trên tài nguyên permissions với tham số đường dẫn fileId.

  2. Trong yêu cầu, hãy xác định role mới.

Bạn có thể cấp quyền trên từng tệp hoặc thư mục trong bộ nhớ dùng chung ngay cả khi người dùng hoặc nhóm đó đã là thành viên. Ví dụ: Alex có role=commenter trong gói thành viên của họ đối với một bộ nhớ dùng chung. Tuy nhiên, ứng dụng của bạn có thể cấp cho Alex role=writer đối với một tệp trong bộ nhớ dùng chung. Trong trường hợp này, vì vai trò mới thoải mái hơn so với vai trò được cấp thông qua gói thành viên, nên quyền mới sẽ trở thành vai trò có hiệu lực cho tệp hoặc thư mục.

Hiển thị ví dụ

Mã mẫu sau đây cho biết cách thay đổi các quyền đối với một tệp hoặc thư mục từ người nhận xét sang người ghi. Phản hồi trả về một thực thể của tài nguyên permissions.

Yêu cầu

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

Đáp

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

Liệt kê và giải quyết các đề xuất truy cập đang chờ xử lý

Đề xuất quyền truy cập là đề xuất của người yêu cầu gửi tới người phê duyệt để cấp cho người nhận quyền truy cập vào một mục trên Drive.

Người phê duyệt có thể xem xét và hành động trên tất cả các đề xuất về quyền truy cập chưa được giải quyết trên các tệp Drive. Điều này có nghĩa là bạn có thể đẩy nhanh quá trình phê duyệt bằng cách truy vấn các đề xuất truy cập theo phương thức lập trình, sau đó giải quyết các đề xuất đó. Việc này cũng cho phép người phê duyệt xem tổng hợp các đề xuất.

API Drive cung cấp tài nguyên accessproposals để bạn có thể xem và giải quyết các đề xuất truy cập đang chờ xử lý. Các phương thức của tài nguyên accessproposals hoạt động trên các tệp, thư mục, tệp trong một bộ nhớ dùng chung nhưng không hoạt động trên bộ nhớ dùng chung.

Các thuật ngữ sau dành riêng cho việc truy cập vào đề xuất:

  • Người yêu cầu: Người dùng bắt đầu đề xuất quyền truy cập vào một mục trên Drive.
  • Người nhận: Người dùng nhận được các quyền bổ sung đối với một tệp nếu đề xuất truy cập được cấp. Nhiều khi người nhận giống với người yêu cầu, nhưng không phải lúc nào cũng vậy.
  • Người phê duyệt: Người dùng chịu trách nhiệm phê duyệt (hoặc từ chối) đề xuất truy cập. Nguyên nhân thường là vì họ là chủ sở hữu của tài liệu hoặc họ có thể chia sẻ tài liệu.

Liệt kê các đề xuất truy cập đang chờ xử lý

Để liệt kê tất cả các đề xuất cấp quyền truy cập đang chờ xử lý trên một mục trên Drive, hãy gọi phương thức list() trên tài nguyên accessproposals và thêm tham số đường dẫn fileId.

Chỉ những người phê duyệt trên một tệp mới có thể liệt kê các đề xuất đang chờ xử lý trên một tệp. Người phê duyệt là người dùng có chức năng can_approve_access_proposals trên tệp. Nếu người yêu cầu không phải là người phê duyệt, hệ thống sẽ trả về một danh sách trống. Để biết thêm thông tin về capabilities, hãy xem phần Chức năng.

Nội dung phản hồi bao gồm một đối tượng AccessProposal đại diện cho danh sách các đề xuất truy cập chưa được giải quyết trên tệp.

Đối tượng AccessProposal bao gồm thông tin về từng đề xuất, chẳng hạn như người yêu cầu, người nhận và thông báo mà người yêu cầu đã thêm. Lớp này cũng bao gồm một đối tượng AccessProposalRoleAndView nhóm role được đề xuất của người yêu cầu với một view. Vì role là một trường lặp lại, nên có thể có nhiều giá trị cho mỗi đề xuất. Ví dụ: một đề xuất có thể có đối tượng AccessProposalRoleAndView của role=readerview=published, cùng với một đối tượng AccessProposalRoleAndView bổ sung chỉ có giá trị role=writer. Để biết thêm thông tin, hãy xem bài viết Khung hiển thị.

Truyền các thông số truy vấn sau để tuỳ chỉnh tính năng phân trang hoặc lọc các đề xuất quyền truy cập:

  • pageToken: Mã thông báo trang, nhận được từ một lệnh gọi danh sách trước đó. Cung cấp mã thông báo này để truy xuất trang tiếp theo.

  • pageSize: Số lượng đề xuất truy cập tối đa được trả về trên mỗi trang.

Giải quyết các đề xuất cấp quyền truy cập đang chờ xử lý

Để phân giải tất cả các đề xuất cấp quyền truy cập đang chờ xử lý trên một mục trên Drive, hãy gọi phương thức resolve() trên tài nguyên accessproposals và đưa vào các tham số đường dẫn fileIdproposalId.

Phương thức resolve() bao gồm tham số truy vấn action biểu thị hành động cần thực hiện đối với đề xuất. Đối tượng Action theo dõi sự thay đổi trạng thái của đề xuất để chúng ta biết liệu đề xuất đó có được chấp nhận hay bị từ chối.

Phương thức resolve() cũng bao gồm các tham số truy vấn không bắt buộc của roleview. Các vai trò duy nhất được hỗ trợ là writer, commenterreader. Nếu bạn không chỉ định vai trò, thì vai trò mặc định sẽ là reader. Một tham số truy vấn không bắt buộc khác của send_notification cho phép bạn gửi thông báo qua email cho người yêu cầu khi đề xuất được chấp nhận hoặc bị từ chối.

Cũng giống như với phương thức list(), người dùng phân giải đề xuất phải có khả năng can_approve_access_proposals trên tệp. Để biết thêm thông tin về capabilities, hãy xem phần Chức năng.

Các đề xuất được giải quyết bằng cách sử dụng cùng một mẫu được liệt kê trong phần Các tình huống chia sẻ tài nguyên trên Drive. Nếu có nhiều đề xuất cho cùng một người dùng, nhưng với vai trò khác nhau, thì những điều sau sẽ áp dụng:

  • Nếu một đề xuất được chấp nhận và một đề xuất bị từ chối, thì vai trò được chấp nhận sẽ áp dụng cho mục trên Drive.
  • Nếu cả hai đề xuất được chấp nhận cùng lúc, thì đề xuất có quyền cao hơn (ví dụ: role=writer so với role=reader) sẽ được áp dụng. Đề xuất quyền truy cập khác sẽ bị xoá khỏi mặt hàng.

Sau khi gửi đề xuất đến phương thức resolve(), thao tác chia sẻ sẽ hoàn tất. AccessProposal không còn được trả về thông qua phương thức list(). Sau khi đề xuất được chấp nhận, người dùng phải sử dụng bộ sưu tập permissions để cập nhật quyền trên một tệp hoặc thư mục. Để biết thêm thông tin, hãy xem phần Thay đổi quyền.

Thu hồi quyền truy cập vào tệp hoặc thư mục

Để thu hồi quyền truy cập vào một tệp hoặc thư mục, hãy gọi phương thức delete() trên tài nguyên permissions với fileId và các tham số đường dẫn permissionId được đặt để xoá quyền.

Đối với các mục trong "Drive của tôi", bạn có thể xoá quyền kế thừa. Việc xoá quyền kế thừa sẽ thu hồi quyền truy cập vào mục và các mục con, nếu có.

Đối với các mục trong bộ nhớ dùng chung, bạn không thể thu hồi các quyền được kế thừa. Thay vào đó, hãy cập nhật hoặc thu hồi quyền trên tệp hoặc thư mục mẹ.

Phương thức delete() cũng được dùng để xoá các quyền áp dụng trực tiếp cho một tệp hoặc thư mục trong bộ nhớ dùng chung.

Hiển thị ví dụ

Mã mẫu sau đây cho biết cách thu hồi quyền truy cập bằng cách xoá một permissionId. Nếu thành công, nội dung phản hồi sẽ trống. Để xác nhận quyền đã bị xoá, hãy sử dụng phương thức list() trên tài nguyên permissions có tham số đường dẫn fileId.

Yêu cầu

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

Chuyển quyền sở hữu tệp sang một tài khoản Google Workspace khác trong cùng một tổ chức

Bạn có thể chuyển quyền sở hữu các tệp hiện có trong "Drive của tôi" từ một tài khoản Google Workspace sang một tài khoản khác trong cùng một tổ chức. Tổ chức sở hữu bộ nhớ dùng chung sẽ sở hữu các tệp trong bộ nhớ đó. Do đó, tính năng chuyển quyền sở hữu không được hỗ trợ đối với các tệp và thư mục trong bộ nhớ dùng chung. Người tổ chức bộ nhớ dùng chung có thể di chuyển các mục từ bộ nhớ dùng chung đó sang "Drive của tôi" của riêng họ. Thao tác này sẽ chuyển quyền sở hữu cho họ.

Để chuyển quyền sở hữu của một tệp trong "Drive của tôi", hãy làm theo một trong những cách sau:

  • Tạo quyền tệp cấp quyền truy cập cho chủ sở hữu (role=owner) của một người dùng cụ thể (type=user).

  • Cập nhật quyền của một tệp hiện có bằng role=owner và chuyển quyền sở hữu cho người dùng được chỉ định (transferOwnership=true).

Chuyển quyền sở hữu tệp từ một tài khoản người dùng sang một tài khoản người dùng khác

Bạn có thể chuyển quyền sở hữu tệp giữa một tài khoản người dùng sang một tài khoản khác. Tuy nhiên, Drive sẽ không chuyển quyền sở hữu tệp giữa hai tài khoản người dùng cá nhân cho đến khi chủ sở hữu tương lai đồng ý rõ ràng với việc chuyển quyền sở hữu. Để chuyển quyền sở hữu tệp từ tài khoản người dùng cá nhân này sang tài khoản người dùng thông thường khác, hãy làm như sau:

  1. Chủ sở hữu hiện tại bắt đầu quá trình chuyển quyền sở hữu bằng cách tạo hoặc cập nhật quyền của chủ sở hữu tiềm năng đối với tệp. Quyền này phải bao gồm các chế độ cài đặt sau: role=writer, type=userpendingOwner=true. Nếu chủ sở hữu hiện tại tạo quyền cho chủ sở hữu tiềm năng, thì hệ thống sẽ gửi thông báo qua email cho chủ sở hữu tiềm năng cho biết rằng họ sẽ được yêu cầu tiếp nhận quyền sở hữu tệp.

  2. Chủ sở hữu tiềm năng chấp nhận yêu cầu chuyển quyền sở hữu bằng cách tạo hoặc cập nhật quyền đối với tệp của họ. Quyền này phải bao gồm các chế độ cài đặt sau: role=ownertransferOwnership=true. Nếu chủ sở hữu tiềm năng đang tạo một quyền mới, thì một thông báo qua email sẽ được gửi đến chủ sở hữu trước đó cho biết quyền sở hữu đã được chuyển.

Khi một tệp được chuyển, vai trò của chủ sở hữu trước đó sẽ bị hạ cấp xuống writer.

Thay đổi nhiều quyền bằng yêu cầu hàng loạt

Bạn nên sử dụng yêu cầu hàng loạt để sửa đổi nhiều quyền.

Sau đây là ví dụ về cách sửa đổi quyền hàng loạt bằng một thư viện ứng dụng.

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