Google Drive API - Предоставление доступа к файлам в папке для учетной записи службы - PullRequest
1 голос
/ 20 сентября 2019

Я использую служебную учетную запись для подключения к Google Диску G Suite.Я понимаю, что с доступным доступом (область действия: https://www.googleapis.com/auth/drive.file) я могу видеть только файлы, созданные учетной записью службы, а использование области / auth / drive (которая обеспечивает полную видимость) требует специального одобрения Google.

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

Кто-нибудь знает, как это сделать?

Изменить, чтобы включить код (написанный на Apex, который похож на Java). Все еще довольно грубо, я еще не очистил его, но:

private static String buildAuthBody(Google_Drive_Integration__mdt mdt) {

    //Builds and encodes the JWT header
    String bodyHeader = '{"alg":"RS256","typ":"JWT"}';
    String encodedHeader = encode(bodyHeader);

    //Builds and encodes the JWT Claim Set. See googleAuth body
    googleAuth ga = new googleAuth(mdt);
    String claimSetString = JSON.serialize(ga);
    String encodedClaimSet = encode(claimSetString);

    //Builds out necessary pieces for Crypt.sign(algorithmName, input, privateKey). Input = body
    String signatureBody = encodedHeader + '.' + encodedClaimSet;
    signatureBody = signatureBody.replaceAll('=','');
    String encodedSignatureBody = EncodingUtil.urlEncode(signatureBody,'UTF-8');
    Blob signatureBodyBlob = Blob.valueOf(encodedSignatureBody);

    Blob key = EncodingUtil.base64Decode(mdt.Service_Account_Private_Key__c); //Must be decoded to pass into method w/o error

    //Builds the signature
    Blob signatureBlob = Crypto.sign('RSA-SHA256', signatureBodyBlob , key);
    String encodedSignature = encodeBlob(signatureBlob);

    //Sets grant type
    String grantType = EncodingUtil.urlEncode('urn:ietf:params:oauth:grant-type:jwt-bearer', 'UTF-8');

    //Sets body and debugs to rebuild body
    System.debug('grant type: grant_type=' + grantType);
    System.debug('&assertion=');
    System.debug('encoded header: '+encodedHeader);
    System.debug('encoded claim set: '+encodedClaimSet);
    System.debug('encoded signature: '+encodedSignature);



    //Build and return the body
    String body = 'grant_type=' + grantType;
    body += '&assertion=';
    body += signatureBody;
    body += '.' + encodedSignature;
    return body;
}

class googleAuth {
    public String iss; //'test-google-drive@sapient-flare-252622.iam.gserviceaccount.com';
    public String scope = 'https://www.googleapis.com/auth/drive';
    public String aud = 'https://www.googleapis.com/oauth2/v4/token';
    public Long exp;
    public Long iat;

    googleAuth(Google_Drive_Integration__mdt mdt) {
        DateTime dt = DateTime.now();
        iat = dt.getTime() / 1000;
        exp = iat + 3600; 
        iss = mdt.Service_Account_User_Email__c;
    }
}

private static String encode(String str) {
    Blob b = Blob.valueOf(str);
    String ret = EncodingUtil.base64Encode(b);
    ret = EncodingUtil.urlEncode(ret, 'UTF-8');
    return ret;
}

private static String encodeBlob(Blob b) {
    String ret = EncodingUtil.base64Encode(b);
    ret = EncodingUtil.urlEncode(ret, 'UTF-8');
    return ret;
}

1 Ответ

0 голосов
/ 20 сентября 2019

Я думаю, вы неправильно понимаете, что такое учетные записи служб и области.

enter image description here

Области определяют объем доступа, который пользователь предоставил вашему приложению.,В этом случае пользователь является служебной учетной записью.Использование области действия: https://www.googleapis.com/auth/drive.file с учетной записью службы на самом деле не имеет особого смысла, поскольку вы, разработчик, владеете учетной записью службы, а там - своей учетной записью диска.так что на самом деле просто предоставьте ему полный доступ, используя область действия: https://www.googleapis.com/auth/drive нет никаких реальных причин для его ограничения.Если бы у вас было обычное приложение, использующее Oauth2, вы бы запрашивали только необходимый вам доступ к учетной записи диска пользователей.

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

Я не уверен, что понимаю это.Предполагая, что когда вы говорите «пользователь», вы имеете в виду учетную запись службы.Я предполагаю, что эта папка является частью вашей системы gsuite.В этом случае вам просто нужно настроить администратора Gsuite делегирование по всему домену на учетную запись службы, и он получит доступ.Это способ предоставления разрешения учетной записи службы для доступа к данным в вашей учетной записи gsuite, например, добавление нового пользователя в систему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...