Получить файлы на основе идентификатора электронной почты пользователя - PullRequest
0 голосов
/ 04 июля 2018

Я пытаюсь получить файлы приостановленного пользователя, используя его / ее идентификатор электронной почты в скрипте приложений Google, я создал учетную запись службы и реализовал API сценария приложения с аутентификацией учетной записи службы, для которой я использовал oauth2 api , хотя я пытаюсь «выдать себя» за пользователей, совершая вызовы API, я могу получить доступ только к общедоступным файлам пользователя, я пытаюсь получить доступ ко всем файлам (включая личные и общедоступные), могу я узнать, что я делаю не так?

/**
 * Entrypoint
 */

var PRIVATE_KEY  = 'PPRIVATE_KEY goes in here';
var CLIENT_EMAIL = 'CLIENT_EMAIL goes in here';


function test() {
  fetchUser();
}




/**
 * Fetches the suspended user details from the AdminDirectory.
 */
function fetchUser() {
  // Set the constant options only once.
  const options = {
    domain: 'xyz.com',
    orderBy: 'email',
    query: 'isSuspended=true',
    maxResults: 500,
    fields: "nextPageToken,users"
  };
  // Could log the options here to ensure they are valid and in the right format.

  const results = [];
  do {
    var search = AdminDirectory.Users.list(options);
    // Update the page token in case we have more than 1 page of results.
    options.pageToken = search.nextPageToken;
    // Append this page of results to our collected results.
    if(search.users && search.users.length)
      Array.prototype.push.apply(results, search.users);
  } while (options.pageToken);
  //Logger.log(results);

  for(var k = 0; k < results.length; k++){
     var fullEmail = results[k].primaryEmail;
     //Logger.log(fullEmail);
     fetchAllFilesOwnedByEmail(fullEmail);
  }
}


/**
 * Fetch all files based on the user email id
 */

function fetchAllFilesOwnedByEmail(email) {
  var service = getService(email);
    if (service.hasAccess()) {
        var url = 'https://www.googleapis.com/drive/v2/files?pageSize=1';
        var response = UrlFetchApp.fetch(url, {
            headers: {
                Authorization: 'Bearer ' + service.getAccessToken()
            }
        });
        var result = JSON.parse(response.getContentText());
        console.log("gs test1");
        Logger.log(JSON.stringify(result, null, 2));
    } else {
        console.log("gs test1");
        Logger.log(service.getLastError());
    }

  const searchParams = {
    corpora: 'domain',
    orderBy: 'createdDate',
    q: "'" + email + "' in owners",
    fields: 'nextPageToken,items(id,title,mimeType,userPermission)'
  };
  Logger.log('searchParams:' +searchParams);

  const results = [];
  do {
    var search = Drive.Files.list(searchParams);
    if (search.items)
      Array.prototype.push.apply(results, search.items);
    searchParams.pageToken = search.nextPageToken;
  } while (searchParams.pageToken);
  //return results;
  Logger.log('Files:' +results);
}


/**
 * Reset the authorization state, so that it can be re-tested.
 */
function reset() {
  var service = getService();
  service.reset();
}


/**
 * Configures the service.
 */
function getService(userEmail) {
  return OAuth2.createService('GoogleDrive:' + userEmail)
      // Set the endpoint URL.
      .setTokenUrl('https://accounts.google.com/o/oauth2/token')

      // Set the private key and issuer.
      .setPrivateKey('PRIVATE_KEY goes in here')
      .setIssuer('CLIENT_EMAIL goes in here')

      // Set the name of the user to impersonate. This will only work for
      // Google Apps for Work/EDU accounts whose admin has setup domain-wide
      // delegation:
      // https://developers.google.com/identity/protocols/OAuth2ServiceAccount#delegatingauthority
      .setSubject(userEmail)

      // Set the property store where authorized tokens should be persisted.
      .setPropertyStore(PropertiesService.getScriptProperties())

      // Set the scope. This must match one of the scopes configured during the
      // setup of domain-wide delegation.
      .setScope('https://www.googleapis.com/auth/drive');
}
...