Partager des fichiers, des dossiers et des Drive

Restez organisé à l'aide des collections Enregistrez et classez les contenus selon vos préférences.

Chaque fichier, dossier et Drive partagé Google Drive est associé à des autorisations. Chaque ressource identifie l'autorisation pour un type (utilisateur, groupe, domaine, utilisateur) et role spécifiques, tels que "commentateur" ou "lecteur". Par exemple, un fichier peut disposer d'une autorisation accordant à un utilisateur spécifique (type=user) un accès en lecture seule (role=reader), tandis qu'une autre autorisation permet aux membres d'un groupe spécifique (type=group) d'ajouter des commentaires à un fichier (role=commenter).

Pour obtenir la liste complète des rôles et des opérations autorisés par chacun, consultez la section Rôles.

Scénarios de partage des ressources Drive

Il existe cinq types de scénarios de partage:

  1. Pour partager un fichier dans Mon Drive, l'utilisateur doit disposer au minimum de role=writer.

    • Si la valeur booléenne writersCanShare est définie sur False pour le fichier, l'utilisateur doit disposer de role=owner.

    • Si l'utilisateur avec role=writer dispose d'un accès temporaire régi par une date et une heure d'expiration, il ne peut pas partager le fichier.

    Pour en savoir plus, consultez Ajouter une date d'expiration.

  2. Pour partager un dossier dans Mon Drive, l'utilisateur doit disposer de role=writer ou d'une version ultérieure.

    • Si la valeur booléenne writersCanShare est définie sur False pour le fichier, l'utilisateur doit disposer de la valeur role=owner la plus permissive.

    • L'accès temporaire (soumis à une date et une heure d'expiration) n'est pas autorisé sur les dossiers Mon Drive associés à role=writer.

  3. Pour partager un fichier dans un Drive partagé, l'utilisateur doit disposer au minimum de role=writer.

    • Le paramètre writersCanShare ne s'applique pas aux éléments des Drive partagés. Il est traité comme s'il était toujours défini sur True.

    • L'accès temporaire (soumis à une date et une heure d'expiration) n'est pas autorisé dans les Drive partagés.

  4. Pour partager un dossier dans un Drive partagé, l'utilisateur doit disposer de role=organizer.

    • Si la restriction sharingFoldersRequiresOrganizerPermission d'un Drive partagé est définie sur False, les utilisateurs disposant de role=fileOrganizer peuvent partager des dossiers dans ce Drive partagé.
  5. Pour gérer l'appartenance à un Drive partagé, l'utilisateur doit disposer de role=organizer. Seuls les utilisateurs et les groupes peuvent être membres de Drive partagés.

Propagation des autorisations

Les listes d'autorisations pour un dossier se propagent vers le bas. Tous les fichiers et dossiers enfants héritent des autorisations du parent. Chaque fois que les autorisations ou la hiérarchie sont modifiées, la propagation se produit de manière récursive dans tous les dossiers imbriqués. Par exemple, si un fichier existe dans un dossier et que ce dernier est ensuite déplacé dans un autre dossier, les autorisations du nouveau dossier se propagent dans le fichier. Si le nouveau dossier accorde à l'utilisateur du fichier un nouveau rôle, par exemple "rédacteur", il remplace son ancien rôle.

À l'inverse, si un fichier hérite de role=writer d'un dossier et qu'il est déplacé vers un autre dossier fournissant un rôle de "lecteur", le fichier hérite désormais de role=reader.

Les autorisations héritées ne peuvent pas être supprimées d'un fichier ou d'un dossier dans un Drive partagé. À la place, ces autorisations doivent être ajustées sur le parent direct ou indirect dont elles ont hérité. Les autorisations héritées peuvent être supprimées des éléments sous "Mon Drive" ou "Partagés avec moi".

À l'inverse, les autorisations héritées peuvent être remplacées sur un fichier ou un dossier de Mon Drive. Ainsi, si un fichier hérite de role=writer à partir d'un dossier Mon Drive, vous pouvez définir role=reader sur le fichier afin de réduire son niveau d'autorisation.

Fonctionnalités

La ressource Autorisations ne détermine pas la capacité de l'utilisateur actuel à effectuer des actions sur un fichier ou un dossier. À la place, une ressource Files contient un ensemble de champs booléens capabilities qui indiquent si une action peut être effectuée sur un fichier ou un dossier. L'API Google Drive définit ces champs en fonction de la ressource d'autorisations de l'utilisateur actuel associée au fichier ou au dossier.

Par exemple, lorsqu'Alex se connecte à votre application et tente de partager un fichier, son rôle est vérifié en termes d'autorisations sur le fichier. Si le rôle leur permet de partager un fichier, les capabilities associées au fichier, telles que canShare, sont renseignées par rapport au rôle. Si Alex souhaite partager le fichier, votre application vérifie que capabilitiescanShare est défini sur true.

Créer une autorisation

Les deux champs suivants sont nécessaires lors de la création d'une autorisation:

  • type : type identifie le champ d'application de l'autorisation (user, group, domain ou anyone). Une autorisation avec type=user s'applique à un utilisateur spécifique, tandis qu'une autorisation avec type=domain s'applique à tous les utilisateurs d'un domaine spécifique.

  • role : le champ role identifie les opérations que type peut effectuer. Par exemple, une autorisation avec type=user et role=reader accorde à un utilisateur spécifique un accès en lecture seule au fichier ou au dossier. Une autorisation avec type=domain et role=commenter permet également à tous les membres du domaine d'ajouter des commentaires à un fichier. Pour obtenir la liste complète des rôles et des opérations autorisés par chacun, consultez la section Rôles.

Lorsque vous créez une autorisation où type=user ou type=group, vous devez également fournir un emailAddress pour lier l'utilisateur ou le groupe spécifique à l'autorisation.

Lorsque vous créez une autorisation où type=domain, vous devez également fournir un domain pour lier un domaine spécifique à l'autorisation.

Pour créer une autorisation:

  1. Utilisez la méthode permissions.create avec fileId pour le fichier ou le dossier associé.
  2. Dans le corps de la requête, identifiez type et role.
  3. Si type=user ou type=group, fournissez un emailAddress. Si la valeur est type=domain, fournissez un domain.

Utiliser des audiences cibles

Les audiences cibles sont des groupes de personnes, tels que des services ou des équipes, avec lesquelles vous pouvez recommander aux utilisateurs de partager leurs éléments. Vous pouvez encourager les utilisateurs à partager des éléments avec une audience plus spécifique ou limitée plutôt que l'ensemble de votre organisation. Les audiences cibles peuvent vous aider à améliorer la sécurité et la confidentialité de vos données, et à faciliter le partage approprié pour les utilisateurs. Pour en savoir plus, consultez la page À propos des audiences cibles.

Pour utiliser les audiences cibles:

  1. Connectez-vous à la console d'administration Google.

    Pour cette tâche, vous devez être connecté à un compte disposant de droits de super-administrateur.

  2. Accédez à Menu > Annuaire > Audiences cibles.

  3. Dans la liste des audiences cibles, cliquez sur le nom de l'audience cible. Pour créer une audience cible, consultez Créer une audience cible.

  4. Copiez l'ID unique de l'URL d'audience cible: https://admin.google.com/ac/targetaudiences/ID.

  5. Créez une autorisation avec type=domain, puis définissez le champ domain sur ID.audience.googledomains.com.

Pour découvrir comment les utilisateurs interagissent avec les audiences cibles, consultez Expérience utilisateur pour le partage par lien.

Récupérer toutes les autorisations pour un fichier, un dossier ou un Drive partagé

Utilisez la méthode permissions.list pour récupérer toutes les autorisations pour un fichier, un dossier ou un Drive partagé.

Vérifier les autorisations des utilisateurs

Lorsque votre application ouvre un fichier, elle doit vérifier ses fonctionnalités et afficher l'UI pour refléter les autorisations de l'utilisateur actuel. Par exemple, si l'utilisateur ne dispose pas de la capacité canComment sur le fichier, la fonctionnalité de commentaire doit être désactivée dans l'UI.

Pour vérifier les capacités, appelez files.get avec fileId et le paramètre fields défini sur le champ capabilities.

Pour en savoir plus sur le renvoi de champs à l'aide du paramètre fields, consultez la section Renvoyer des champs spécifiques pour un fichier.

Déterminer la source du rôle pour les fichiers et les dossiers des Drive partagés

Pour modifier le rôle d'un fichier ou d'un dossier, vous devez connaître la source du rôle. Pour les Drive partagés, la source d'un rôle peut être basée sur l'appartenance à un Drive partagé, sur le rôle d'un dossier ou sur un fichier.

Pour déterminer la source du rôle pour un Drive partagé ou des éléments de ce Drive, appelez permissions.get avec les paramètres fileId, permissionId et fields définis dans le champ permissionDetails. Pour trouver permissionId, utilisez permissions.list avec fileId.

Ce champ répertorie toutes les autorisations héritées et directes sur les fichiers pour l'utilisateur, le groupe ou le domaine.

Modifier les autorisations

Pour modifier les autorisations sur un fichier ou un dossier, vous pouvez modifier le rôle attribué:

  1. Appelez permissions.update avec les autorisations permissionId à modifier et fileId pour le fichier, le dossier ou le Drive partagé associé. Pour trouver permissionId, utilisez permissions.list avec fileId.

  2. Dans la requête, identifiez le nouveau role.

Vous pouvez accorder des autorisations sur des fichiers ou des dossiers individuels d'un Drive partagé, même si l'utilisateur ou le groupe en est déjà membre. Par exemple, Alex dispose de role=commenter dans le cadre de son adhésion à un Drive partagé. Toutefois, votre application peut accorder des autorisations à Alex role=writer pour un fichier dans un Drive partagé. Dans ce cas, comme le nouveau rôle est plus permissif que celui attribué via son appartenance, le nouveau rôle devient le rôle effectif pour le fichier ou le dossier.

Révoquer l'accès à un fichier ou un dossier

Pour révoquer l'accès à un fichier ou un dossier, appelez delete avec fileId et permissionId pour supprimer l'autorisation.

Pour les éléments présents dans "Mon Drive", il est possible de supprimer une autorisation héritée. La suppression d'une autorisation héritée révoque l'accès à l'élément et aux éléments enfants, le cas échéant.

Les autorisations héritées des éléments d'un Drive partagé ne peuvent pas être révoquées. Mettez à jour ou révoquez plutôt l'autorisation sur le fichier ou le dossier parent.

L'opération delete permet également de supprimer les autorisations directement appliquées à un fichier ou dossier Drive partagé.

Transférer la propriété d'un fichier vers un autre compte Google Workspace de la même organisation

La propriété des fichiers de "Mon Drive" peut être transférée d'un compte Google Workspace à un autre compte de la même organisation. Une organisation qui possède un Drive partagé est propriétaire des fichiers qu'elle contient. Par conséquent, les transferts de propriété ne sont pas compatibles avec les fichiers et dossiers des Drive partagés. Les organisateurs d'un Drive partagé peuvent déplacer des éléments de ce Drive vers leur propre dossier "Mon Drive", qui leur en transfère la propriété.

Pour transférer la propriété d'un fichier dans "Mon Drive", effectuez l'une des opérations suivantes:

  • Créez une autorisation de fichier accordant l'accès à un utilisateur spécifique (type=user) (role=owner).

  • Mettez à jour l'autorisation d'un fichier existant avec role=owner et transférez la propriété à l'utilisateur spécifié (transferOwnership=true).

Transférer la propriété d'un fichier d'un compte personnel à un autre

La propriété des fichiers peut être transférée d'un compte personnel à un autre. Toutefois, Drive ne transfère la propriété d'un fichier entre deux comptes personnels que lorsque le nouveau propriétaire potentiel accepte explicitement le transfert. Pour transférer la propriété d'un fichier d'un compte personnel à un autre:

  1. Le propriétaire actuel effectue un transfert de propriété en créant ou en mettant à jour l'autorisation d'accès au fichier du nouveau propriétaire potentiel. L'autorisation doit inclure les paramètres suivants: role=writer, type=user et pendingOwner=true. Si le nouveau propriétaire crée une autorisation pour le propriétaire potentiel, une notification par e-mail lui est envoyée, indiquant qu'il lui est demandé de devenir propriétaire du fichier.

  2. Le nouveau propriétaire accepte la demande de transfert de propriété en créant ou en mettant à jour son autorisation de fichier. L'autorisation doit inclure les paramètres suivants : role=owner et transferOwnership=true. Si le nouveau propriétaire crée une autorisation, une notification par e-mail lui est envoyée, indiquant que la propriété a été transférée.

Lorsqu'un fichier est transféré, le rôle du propriétaire précédent passe à writer.

Modifier plusieurs autorisations avec des requêtes par lot

Nous vous recommandons vivement d'utiliser des requêtes par lot pour modifier plusieurs autorisations.

Voici un exemple de modification d'autorisations par lot avec une bibliothèque cliente.

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
from __future__ import print_function

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