Создание файла на Google Диске (G Suite) с Java с учетной записью службы: 403 недостаточно разрешений

#java #spring-boot #google-drive-api #google-workspace

#java #spring-boot #google-drive-api #google-workspace

Вопрос:

Я пытаюсь создать файл в папке Google Drive.

Чтение из папки работает. Я уже читаю файлы в разных приложениях с разными учетными записями служб.

Я поделился своей папкой на диске G Suite с сгенерированной электронной почтой учетной записи службы и предоставил ей доступ к редактору (чтение, запись, редактирование).

Я попытался скопировать существующий файл (но также создать пустой с нуля) из моего приложения Java Springboot.

 public class TemplateDocumentManager {

    @Value("${printing.template.id}")
    private String baseTemplateFileId;

    @Autowired
    private Drive driveService;

    public void createNewContractFromEmptyTemplate() throws IOException {
        File templateFile = getDriveFiles().get(baseTemplateFileId).execute();

        File newFileInstance = getDriveFiles()
                .copy(baseTemplateFileId, templateFile)
                .setSupportsAllDrives(true)
                .execute();
        log.error("Id of newly created file is: {}", newFileInstance.getId());
    }

    protected Drive.Files getDriveFiles() {
        return driveService.files();
    }
}
  

Служба Google Drive, введенная с @Autowired аннотацией, работает правильно. Он создается следующим образом:

 @Configuration
public class DriveService {

    public static final String APPLICATION_NAME = "appname";

    @Autowired
    GoogleCredential googleCredential;

    @Bean("driveService")
    public Drive createDriveService() throws GeneralSecurityException, IOException {
        return new Drive.Builder(GoogleNetHttpTransport.newTrustedTransport(), JacksonFactory.getDefaultInstance(), googleCredential)
                .setApplicationName(APPLICATION_NAME)
                .build();
    }

    ...
}
  

Есть идеи о том, что учетная запись службы должна иметь возможность записывать в папку диска G Suite?

Комментарии:

1. Включен ли Drive API для проекта и учетной записи службы?

2. @Антенны да! Я могу легко читать из него.

Ответ №1:

Вы должны предоставить необходимые разрешения объекту GoogleCredentials, т. е.

 GoogleCredential.fromStream(source).createScoped(scopes)
  

Области могут быть найдены, например, в SheetsScopes или DriveScopes (в зависимости от ваших зависимостей от Google)

Комментарии:

1. Да, это верно. Я дважды назначал области. Во второй раз замена их только read разрешениями.