我正在使用服务帐户连接到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;
}
答案 0 :(得分:0)
我认为您对服务帐户和范围有误解。
范围定义了用户授予您的应用程序的访问量。在这种情况下,用户是服务帐户。在服务帐户中使用范围https://www.googleapis.com/auth/drive.file并没有多大意义,因为开发人员拥有服务帐户,并在那里拥有其驱动器帐户。因此,实际上只使用范围https://www.googleapis.com/auth/drive授予它完全访问权限,没有任何真正的理由限制您。如果您有使用Oauth2的普通应用程序,则只会请求访问用户驱动器帐户所需的访问权限。
我需要能够扩展服务帐户的可见性,以将文件包含在用户尚未创建的至少1个文件夹中。据我所知,我无法通过普通的文件夹共享来做到这一点。
我不确定我是否理解这一点。假设您说“用户”是指服务帐户。我将假定此文件夹是您的gsuite系统的一部分。在这种情况下,您只需要让Gsuite管理员为服务帐户设置domain wide delegation即可访问该帐户。这是授予服务帐户访问gsuite帐户上的数据的权限的一种方式,就像向系统中添加新用户一样。