Невозможно передать право собственности в Google Drive v3 API в моем проекте узла

Я пытался следовать документации, но они не содержат рабочего примера использования этой функции.

Это моя реализация:

async function transferOwner( ){
  const authClient = await authorize();
  const realFileId = '***fileId***';
  const newOwnerEmail = '@gmail.com';
  try{


    const drive = google.drive({version: 'v3', auth: authClient});

    const res = await drive.permissions.update({
      fileId: realFileId,
      permissionId: '***permission id that i found somehow***',
      transferOwnership: true,
      sendNotificationEmail: true,
      email: newOwnerEmail,
      "resource": {
        "role": "owner"
      }
    });


    console.info(result);
    console.info(`transfered ownership to ${newOwnerEmail}`);
    return result;
  } catch (err){
    console.info(`could not transfer ownership to ${newOwnerEmail}`);
    console.info(err);
      throw err
  }
}

Когда я выполняю этот код, я получаю код состояния 200, но я не вижу, чтобы на моем диске менялся какой-либо владелец.

Что я делаю не так?

Это разрешение, если оно необходимо. Хотя мне пришлось удалить часть ответа, поскольку stackoverflow не позволял легко публиковать такой большой контент.

{ заголовки: {заголовки}, статус: 200, statusText: 'ОК', запрос: { URL-адрес ответа: 'https://www.googleapis.com/drive/v3/files/RrBv4BK1yby5D/permissions/253029680?transferOwnership=true&sendNotificationEmail=true&email=%40gmail.com' }` передал право собственности @gmail.com

Добавил * в места, где пытался скрыть какую-либо информацию.

Я пробовал много способов сменить владельца с помощью моего кода, но ничего не помогло.

Каждый раз я получаю сообщение об успехе и код состояния 200, но на диске ничего не отображается.

попробуйте использовать опцию requestBody вместо resource, вот так requestBody: { emailAddress: newOwnerEmail, role: 'owner' }

bogdanoff 11.04.2024 09:21

Проверьте свою электронную почту, я думаю, новый владелец должен ее принять.

Linda Lawton - DaImTo 11.04.2024 09:26

Я проверил, никто не получил никаких писем. Я попробую этот формат, хотя думаю, что, возможно, уже пробовал его раньше, когда пробовал все возможные комбинации, но давайте посмотрим

user24220708 11.04.2024 10:50

Я попробовал упомянутый формат и вот что получил код: 403, ошибки: [{ сообщение: «Тело ресурса включает поля, которые не доступны для прямой записи.», домен: «глобальный», причина: «fieldNotWritable» }], но когда я удаляю адрес электронной почты из тела запроса, я получаю успех, но, как и в прошлый раз, файл не передается

user24220708 11.04.2024 11:45

По поводу вашей ситуации у меня 3 вопроса. 1. Какой mimeType целевого файла? 2. Кто является владельцем текущего целевого файла? 3. От чего появляется authClient? Он извлекается из OAuth2 текущей учетной записи владельца? Или он извлекается из учетной записи службы?

Tanaike 11.04.2024 12:58

mimeType, я не уверен, но файлы в формате JSON. Учетная запись, которую я использую для передачи файла, и из той же учетной записи создается служба API. authclient передается из функции авторизации. Используя тот же механизм аутентификации, я могу загружать, удалять и скачивать файлы, так что это определенно не проблема с авторизацией или, конечно, не проблема с mimetype.

user24220708 11.04.2024 13:12

@Tanaike, смог ли я объяснить тебе свою проблему?

user24220708 12.04.2024 06:35

Спасибо за ответ. Что касается @Tanaike was I able to explain you my issue?, я должен извиниться за поздний ответ. Теперь я заметил из вашего ответа. Когда вы отвечаете на комментарий и ставите @username, пользователь может заметить ваш ответ. Теперь я заметил, что ваш вопрос решен. Я рад этому.

Tanaike 12.04.2024 07:23

@Tanaike, я вижу, просмотрю отчет об ошибке, чтобы лучше понять, но я полагаю, что это должно помочь. спасибо и за вашу помощь

user24220708 12.04.2024 07:34

@Tanaike Редактировать 1: - нет, это не совсем решает мою проблему. Мой ответ приходит как 200, но ничего не происходит, хотя в ответе конкретно указана ошибка 403.

user24220708 12.04.2024 07:41

@Никхил Чоудхари Спасибо за ответ. Судя по вашему ответу, когда я снова увидел ваш ответ, я подумал, что смогу предложить обходной путь. Итак, я разместил это как ответ. Пожалуйста, подтвердите это. Если это не помогло в вашей ситуации, прошу прощения.

Tanaike 12.04.2024 08:45

@Tanaike да, твой обходной путь мне очень помог. Это просто последняя проблема с уведомлением, которая мешает мне реализовать ее. Хотя не стоит извиняться.

user24220708 12.04.2024 09:42
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
12
71
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

После долгих поисков нашел это в Google bugtracker.

В настоящее время Диск не поддерживает изменение владельца элементов, принадлежащих учетным записям gmail.com; он поддерживается для учетных записей Workspace. - 12 апреля 2022 г., 12:44 здесь

это хороший прогресс, но моя проблема все еще немного другая. Если бы я мог получить тот же ответ, например: «403: {код: 403, сообщение: «Требуется согласие для передачи права собственности на файл другому....» Я бы посчитал это таковым, но мой ответ другой

user24220708 12.04.2024 07:39

@Nikhilchoudhary, это потому, что вы ничего не обновляете и получаете 200 ответов от Google. Причина в том, что sendNotificationEmail, email и resource не являются допустимыми параметрами и полностью игнорируются библиотекой, поэтому фактически ничего не делают.

bogdanoff 12.04.2024 07:52
Ответ принят как подходящий

Проблема и обходной путь:

На текущем этапе, когда передается владелец файла потребительской учетной записи (gmai.com), необходимо выполнить 2 шага. Ссылка Когда я раньше тестировал это с помощью следующего скрипта, целевая учетная запись получила электронное письмо для передачи владельца.

const newOwnerEmail = "###@gmail.com";
const fileId = "###";
const drive = google.drive({version: 'v3', auth: authClient});

const res = await drive.permissions.create({
  fileId: fileId,
  sendNotificationEmail: true,
  supportsAllDrives: true,
  requestBody: {
    role: "writer",
    type: "user",
    pendingOwner: true,
    emailAddress: newOwnerEmail,
  },
});

Теперь, когда я это проверил, к сожалению, электронное письмо не отправляется, а также значение pendingOwner не меняется на true. Держится false. Из-за этого я заметил, что передать владельца с помощью приведенного выше скрипта невозможно. Я не уверен, является ли это текущей спецификацией или ошибкой.

К счастью, я заметил, что при обновлении существующего разрешения значение pendingOwner можно изменить на true. Таким образом, целевой пользователь может принять передачу владельца. В этом ответе в качестве текущего обходного пути я хотел бы предложить пример сценария для достижения этого потока.

Пример сценария:

Пример сценария выглядит следующим образом.

const newOwnerEmail = "###@gmail.com";
const fileId = "###";
const drive = google.drive({version: 'v3', auth: authClient});

const res1 = await drive.permissions.list({
  fileId,
  supportsAllDrives: true,
  pageSize: 100,
  fields: "*",
});
const permission = res1.data.permissions.find(
  ({ emailAddress }) => emailAddress == newOwnerEmail
);
let permissionId = "";
if (permission) {
  permissionId = permission.id;
} else {
  const { data: { id } } = await drive.permissions.create({
    fileId: fileId,
    sendNotificationEmail: true,
    supportsAllDrives: true,
    requestBody: {
      role: "writer",
      type: "user",
      pendingOwner: true, // It seems that this cannot be used. This might be a bug.
      emailAddress: newOwnerEmail,
    },
  });
  permissionId = id;
}
const res2 = await drive.permissions.update({
  fileId,
  permissionId,
  supportsAllDrives: true,
  requestBody: {
    role: "writer",
    pendingOwner: true,
  },
});
console.info(res2.data);
  • В этом сценарии сначала извлекаются разрешения и выполняется поиск идентификатора разрешения целевой учетной записи. Если разрешение не найдено, создается новое разрешение и извлекается идентификатор разрешения. Затем pendingOwner обновляется путем обновления разрешения с помощью идентификатора разрешения. В этом потоке, когда целевой пользователь подтверждает разрешение файла, пользователь может подтвердить «Принять владение?» следующее. Когда пользователь принимает это, владелец файла передается пользователю.

Примечание:

  • Важным моментом этого обходного пути является то, что при обновлении разрешения файла кажется, что уведомление по электронной почте не отправляется. Итак, когда вы используете этот обходной путь и хотите сообщить об этом пользователю, необходимо отправить электронное письмо и заставить пользователя принять передачу владельца. Пожалуйста, будьте осторожны с этим.

Использованная литература:

Итак, это работает, и в учетной записи старого владельца я вижу, что есть ожидающий владелец, но для учетной записи нового владельца я не могу найти папку. Как принять это право собственности в качестве нового владельца?

user24220708 12.04.2024 09:36

@Nikhil choudhary Спасибо за ответ и тестирование. Я рад, что этот обходной путь полезен. И тебе спасибо. Кстати, к будущему обновлению верхний скрипт в моем ответе, возможно, можно будет использовать снова, потому что верхний скрипт можно было использовать раньше.

Tanaike 12.04.2024 12:53

Другие вопросы по теме