1. ホーム
  2. google-drive-api

[解決済み] サービスアカウントからgoogleドライブユーザーへファイルの所有権を移行できない

2022-02-08 21:39:40

質問

所有権を移管しようとすると、以下のエラーが発生します。

"domain": "global",
"reason": "invalidSharingRequest",
"message": "Bad Request. User message: \"You can't change the owner of this item.\""

以下は私のコードです。

use Google_Client; 
use Google_Service_Drive;
use Google_Service_Drive_DriveFile;
use Google_Service_Drive_Permission;

public function uploadDocument() {

 $FOLDER_ID = 'my_folder_ID_string';

 $client = new Google_Client();
 $client->setAuthConfig(base_path('service_account_credentials.json'));
 $client->setScopes(array('https://www.googleapis.com/auth/drive'));

 $service = new Google_Service_Drive($client);

 $fileMetadata = new Google_Service_Drive_DriveFile(array(
                                                     'name' => 'Test.pdf',
                                                     'parents' => [$FOLDER_ID]
                                                    ));

 $content = file_get_contents(public_path('tmp/Test.pdf'));

 $file = $service->files->create($fileMetadata, array(
                                                    'data' => $content,
                                                    'mimeType' => 'application/pdf',
                                                    'uploadType' => 'multipart',
                                                    'fields' => 'id'
                                                     ));

  // Transfer Ownership
  $newPermission = new Google_Service_Drive_Permission();
  $newPermission->setRole('owner');
  $newPermission->setType('user');
  $newPermission->setEmailAddress('[email protected]');
  $optParams = array('transferOwnership' => 'true');

  $service->permissions->create($file->id, $newPermission, $optParams);

}

共有フォルダのGoogle Driveへのアップロードは成功しました(所有者は'[email protected]'、サービスアカウントは'editor')が、アップロードされたファイルの所有者はサービスアカウント、編集者は'[email protected]'となっています。

解決方法は?

共有ドライブにあるファイルの所有者を変更することはできません。

の通りです。 ドキュメント :

共有ドライブ内のファイルは、個々のユーザーではなく、共有ドライブが所有します。

そのため、サービスアカウントから所有権を剥奪する必要はありません。

ユーザーを他の任意の 役割 のようなものです。 organizer これにより、ユーザーはファイルを共有ドライブから移動することができ、ファイルの所有者になることができます。

アップデイト

サービスアカウントによって、ファイルが共有ドライブではなく、ユーザーのドライブ上の共有フォルダーにアップロードされる場合は、状況が異なります。

具体的には

  • GSuiteユーザーの場合、ドメイン外への所有権移転は許可されておらず、エラーになります。 Ownership can only be transferred to another user in the same organization as the current owner. .
  • サービスアカウントはドメインユーザーとみなされないため、同じ制限を受けます。
  • コンシューマーユーザーの場合、サービスアカウントからユーザーへの所有権の移譲は許可されていますが、制限されています。 Google mimeTypeのドキュメントのみ、所有者を変更することができます。
  • 上記のように、サービスアカウントからユーザーへの所有権移譲に制約があるため、この問題を回避するために インパーソネーション .
  • なりすましとは、サービスアカウントがユーザー(お客様など)の代わりに行動することで、サービスアカウントがお客様のドライブにファイルをアップロードする場合、お客様自身がファイルをアップロードする場合と同じです。所有権の移転は必要なく、サービスアカウントとのフォルダの共有も明示的に必要ありません。
  • なりすましの設定には、以下のものが必要です。
    • GCPコンソールで、特定のサービスアカウントに対してドメイン全体のデリゲーションを有効にする。

    • 管理者コンソールで、サービスアカウントが必要とするすべてのスコープを認証するには、次のようにします。 Security > API Controls > Domain wide delegation .

    • 行を追加して、コードを修正します。

      $client->setSubject($EmailOfUserToImpersonate);

  • ドメイン単位の委任は、残念ながらドメインに対してのみ可能であることに注意してください - つまり、GSuiteアカウントです。
  • コンシューマー (gmail) アカウントの場合、Google 以外の MIMEType の所有権をサービス アカウントからユーザーに移すことはできません。
  • 回避策として、ユーザーはサービスアカウントによってアップロードされたファイルのコピーを作成し、その後、サービスアカウントは元のファイルを削除することができます。