Google drive api Google Drive API-授予服务帐户对文件夹中文件的访问权限

Google drive api Google Drive API-授予服务帐户对文件夹中文件的访问权限,google-drive-api,google-oauth,google-workspace,Google Drive Api,Google Oauth,Google Workspace,我正在使用服务帐户连接到G套件的Google驱动器。我理解,使用可用访问权限(范围:),我只能查看服务帐户创建的文件,并且使用/auth/drive范围(提供完全可见性)需要谷歌的特别批准 我需要能够扩展服务帐户的可见性,以包括至少1个用户尚未创建的文件夹中的文件。我不能通过正常的文件夹共享得到这个 有人知道怎么做吗 编辑以包含代码(用Apex编写,类似于Java)。仍然很粗糙,我还没有清理干净,但是: private static String buildAuthBody(Google_Dri

我正在使用服务帐户连接到G套件的Google驱动器。我理解,使用可用访问权限(范围:),我只能查看服务帐户创建的文件,并且使用/auth/drive范围(提供完全可见性)需要谷歌的特别批准

我需要能够扩展服务帐户的可见性,以包括至少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;
}

我认为您对服务帐户和范围存在误解

作用域定义用户授予应用程序的访问权限。在这种情况下,用户就是服务帐户。使用作用域:使用服务帐户实际上没有多大意义,因为您是开发人员,拥有服务帐户,并且拥有其驱动器帐户。所以,只需使用作用域为它提供完全访问权限:您没有真正的理由限制它。如果您有一个使用Oauth2的普通应用程序,那么您只需要请求用户驱动器帐户所需的访问权限

我需要能够扩展服务帐户的可见性,以包括至少1个用户尚未创建的文件夹中的文件。我不能通过正常的文件夹共享得到这个


我不确定我是否理解这一点。假设你说的“用户”是指服务帐户。我将假定此文件夹是gsuite系统的一部分。在这种情况下,您只需将Gsuite管理员设置为服务帐户,它就可以访问。这是授予服务帐户访问gsuite帐户上数据的权限的一种方式,有点像向系统中添加新用户。

谢谢DalmTo,但这不是一种限制范围吗?将auth调用切换到此会抛出无效的\u grant error无效的grant表示客户端有问题。请编辑您的问题,并将您的代码包括在我添加的代码中。这需要更长的时间才能成为有效的注释,因此现在它是有效的:)@DaImTo我知道这个问题很老,但也许你可以澄清一下:如果我有一个用户通过OAuth2进行身份验证,允许通过我的应用程序在
drive.file
范围内创建驱动器文件,然后,我是否可以使用我的服务帐户在更广泛的
驱动器
范围内通过我的应用程序访问和更新这些文件?整个“限制范围”的事情我都不清楚。如果我不通过“受限范围安全验证”就开始访问API,谷歌会关闭我的API吗?或者我甚至可以使用它,除非他们以某种方式为我“解锁”它?服务帐户和Oauth2是两个不同的东西。服务帐户只允许您控制由开发人员控制的帐户。Oauth2将授予您访问用户Google drive帐户的权限。谷歌将把你的Oauth2证书限制在100个用户IIR左右,直到你得到验证。服务帐户不需要验证,因为它们没有oauth屏幕。