Google云端硬盘API-授予访问服务帐户文件夹中文件的权限

时间:2019-09-20 04:12:13

标签: google-drive-api google-oauth gsuite

我正在使用服务帐户连接到G Suite的Google云端硬盘。我了解到,有了可用的访问权限(范围: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 :(得分:0)

我认为您对服务帐户和范围有误解。

enter image description here

范围定义了用户授予您的应用程序的访问量。在这种情况下,用户是服务帐户。在服务帐户中使用范围https://www.googleapis.com/auth/drive.file并没有多大意义,因为开发人员拥有服务帐户,并在那里拥有其驱动器帐户。因此,实际上只使用范围https://www.googleapis.com/auth/drive授予它完全访问权限,没有任何真正的理由限制您。如果您有使用Oauth2的普通应用程序,则只会请求访问用户驱动器帐户所需的访问权限。

  

我需要能够扩展服务帐户的可见性,以将文件包含在用户尚未创建的至少1个文件夹中。据我所知,我无法通过普通的文件夹共享来做到这一点。

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

相关问题