2
votes

Participating Components:

(all in the same project)

Android App

Web App

Service Account

The users have authorized the app on their Android devices with Cross Client Identity: oauth2:server:client_id:[web_app_id].apps.googleusercontent.com scopes ...

Flow:

  1. Several users request the creation of the same file through the Android app ( a file for every user is not desired, see "Known workaround" )
  2. A service account then creates that file ( service account is owner )
  3. Service account shares that file (by link and explicit with users)
  4. User authorized drive service / or service account that impersonates a user tries to copy that file to the user's Google Drive ( User has to be the owner of that copy in the end)

Error:

This fails with scope drive.file ( and also drive.readonly ): Error Message: The authenticated user has not granted the app [project_id] write access to the file [file_id]

(btw: why write access is needed with copy()? giving users write access to the file does not change this error)

Known workaround:

It works with full drive scope ( but: my app does not need to see files it has not created - so i want to avoid it)

Same result can also be achieved by re-inserting the file instead of copying it (this overhead is important for my app though, cause same file might be requested by multiple users)

An explicit interaction with a file from a UI Picker or so will propably not work as the file will have to be created after requesting it. also i can't think of a way how to do that without decreasing usability of the Android app.

Expected result:

www.googleapis.com/auth/drive.file: Per-file access to files created or opened by the app

It seems to me this should be enough. As the file is created/owned/shared by my app's service account. and copied by my app on behalf of the user.

www.googleapis.com/auth/drive.readonly Allows read-only access to file metadata and file content

At least this one should work as it should give read access to all files which should be enough to copy a "shared with user" file created by an "authorized by user" app.

Question:

the Web Application and the Service Account are in the same project. Can the Web Application act like a Service Account on behalf of a user? if so - i don't know how. Would that make a difference anyway?

This seems like a Bug to me in this special use case, as the same result can be achieved with a workaround. At least scope drive.readonly should allow my app to copy app owned files to the user's drive. Making a copy through the plain Service Account and then changing the owner of that copy to the User would be another workaround, but that fails too.

I must be missing something simple.

Please guide me.

Thank you.

1

1 Answers

0
votes

I had the same problem and resolved it using the drive.metadata in combination with the drive.file scopes. Related question