我是网站开发人员,我想从我的商业软件访问Google API,我创建了一个云端硬盘帐户 我将通过代码(VB.NET)创建一个文件夹和文件。我正在关注文档,我创建了一个JWT(Json Web Token),我使用了一个服务帐户 我已经获得了一个访问令牌。
现在我想访问Google API。 使用控制台应用程序,我创建了一些文件夹,我可以通过代码获取创建的文件夹列表。 但我无法在Google云端硬盘帐户中看到这些文件夹。这怎么可能?
以下是我发送给服务器的请求,以显示文件夹和文件列表: https://www.googleapis.com/files/ {FILE_ID}?键= {} API_KEY
我获取了一个JSON字符串作为响应,其中包含与FILE_ID元素相关的信息。 e.g:
{ “种”:“驱动器#文件”, “ID”: “FILE_ID” “mimeType”:“application / vnd.google-apps.folder”(如果是文件夹)/“FILE_MIMETYPE”(如果是文件), “title”:“FOLDER_NAME”/“FILE_NAME”, ... }
以下是我用来访问Google API的代码:(VB.NET)
...
Public Function browseFile(ByVal fId As String) As List (Of FileSourceElement)
Dim webclient As New WebClient()
webclient.Headers.Add("Authorization", " Bearer " & _accessToken)
webclient.Headers.Add("X-JavaScript-User-Agent", "Google APIs Explorer")
Dim res As String = webclient.DownloadString("https://www.googleapis.com/drive/v2/files?key=" & _apiKey).Trim()
'res contains the JSON with the informations of the file/folder
...
End Function
Public Sub createContainer(ByVal path As String)
Dim webclient As New WebClient()
webclient.Headers.Add("Authorization", " Bearer " & _accessToken)
webclient.Headers.Add("X-JavaScript-User-Agent", "Google APIs Explorer")
webclient.Headers.Add("Content-Type", "application/json")
webclient.UploadString("https://www.googleapis.com/drive/v2/files", _
"POST", _
"{""title"":""daEliminare2"", ""parents"":[{""id"":""" & path & """}], ""mimeType"":""application/vnd.google-apps.folder""}")
End Sub
...
在我的Google云端硬盘中,我没有手动创建文件夹而且我没有手动上传文件,我必须通过代码完成所有操作。
正如我对你说的,我已经成功创建了一个文件夹并且我成功打印了文件列表(通过代码),但是在我的GDrive中创建了由UI创建的元素 不要出现。为什么呢?
我已经在服务帐户中看到,为了获得访问令牌,需要一个特殊的JSON字符串,称为Json Web Token(JWT),由标题组成, 声明集和签名(base64字符串)。 字符串是:
{base64格式化JWT标头}。{base64格式化JWT claimSet}。{base64格式化JWT签名}
我的JWT是:
标题
{
"alg": "RS256",
"typ": "JWT"
}
索赔集 { “iss”:“0123456789@developer.gserviceaccount.com”,//其中'0123456789'是CLIENT_ID。 “范围”:“https://www.googleapis.com/auth/drive”, “aud”:“https://accounts.google.com/o/oauth2/token”, “exp”:timeStamp + 3600,//其中'timeStamp'是自1970-01-01T00:00:00以来的秒数。 “iat”:timeStamp }
要写签名,我已按照本页描述的步骤进行操作:
https://developers.google.com/accounts/docs/OAuth2ServiceAccount#computingsignature
一旦我编写了JWT,我就将它发送到服务器,并在此模式下获得一个JSON字符串作为响应:
{
"access_token": "ACCESS_TOKEN", // (e.g.: 1/8xbJqaOZXS...)
"type_token": "Bearer",
"expire_in": 3600
}
当我获得访问令牌(AT)时,我用它来访问Google API;例如:如果我要显示所有文件和文件夹列表, 我发送的请求有这样的标题:
授权:持票人AT X-JavaScript-User-Agent:Google API Explorer
url:https://www.googleapis.com/drive/v2/files?key= {MY_API_KEY}
但我强调在列表中有一些项目(使用VB.NET控制台应用程序),而我的Google云端硬盘中没有任何项目。
所以我获得了访问令牌,但我没有成功访问Google API。
PS:我需要在不使用任何浏览器的情况下访问Google API。
第二部分:
我已经在服务帐户中看到,为了获得Acces Token,它需要一个特殊的JSON字符串,称为Json Web Token(JWT),由一个头部组成, 声明集和签名(base64字符串)。 字符串是:
{base64格式化JWT标头}。{base64格式化JWT claimSet}。{base64格式化JWT签名}
我的JWT是:
标题
{
"alg": "RS256",
"typ": "JWT"
}
索赔集 { “iss”:“0123456789@developer.gserviceaccount.com”,//其中'0123456789'是CLIENT_ID。 “范围”:“https://www.googleapis.com/auth/drive”, “aud”:“https://accounts.google.com/o/oauth2/token”, “exp”:timeStamp + 3600,//其中'timeStamp'是自1970-01-01T00:00:00以来的秒数。 “iat”:timeStamp }
要写签名,我已按照本页描述的步骤进行操作:
https://developers.google.com/accounts/docs/OAuth2ServiceAccount#computingsignature
一旦我编写了JWT,我就把它发送到服务器,并在此模式下获得一个JSON字符串作为respoonse:
{
"access_token": "ACCESS_TOKEN", // (e.g.: 1/8xbJqaOZXS...)
"type_token": "Bearer",
"expire_in": 3600
}
当我获得访问令牌(AT)时,我用它来访问Google API;例如:如果我要显示所有文件和文件夹列表, 我发送的请求有这样的标题:
授权:持票人AT X-JavaScript-User-Agent:Google API Explorer
url:https://www.googleapis.com/drive/v2/files?key= {MY_API_KEY}
但我强调在列表中有一些项目(使用VB.NET控制台应用程序),而我的Google云端硬盘中没有任何项目。
所以我获得了访问令牌,但我没有成功访问Google API。
PS:我需要在不使用任何浏览器的情况下访问Google API。
非常感谢和最好的问候
MP
答案 0 :(得分:5)
由于您使用的是服务帐户,因此将在此服务帐户的驱动器中创建所有文件夹和文件,这些文件夹和文件无法通过Web UI访问,并且将仅限于默认配额。
要在用户的云端硬盘中添加内容,您需要通过常规OAuth 2.0流程来检索此用户的凭据。您可以在此页面上找到有关OAuth 2.0的更多信息:
答案 1 :(得分:2)
如果您希望在不使用OAuth 2.0的情况下查看用户帐户下的文件,则可以为用户帐户下的文件夹授予服务帐户编辑权限。
然后,使用服务帐户上传文件时,请确保将父参考ID设置为使用该文件夹ID
文件夹ID在地址栏中确定
希望这有帮助。
答案 2 :(得分:0)
不知道给定的解决方案。添加文件后,添加文件权限(NodeJS代码。在用户使用经典fileUpload后调用insertFile),我做了不同的做法:
insertPermission = function(fileId, value, type, role,authClient,cb) {
var body = {
'value': value,
'type': type,
'role': role
};
var request = drive.permissions.insert({
'fileId': fileId,
'resource': body,
'auth': authClient
}, function (err,response) {
cb(err,response);
});
}
exports.insertFile = function(file,customer,callback) {
exports.authorize(function (err,authClient) {
drive.files.insert({
resource: {
title: file.name,
mimeType: file.mimeType,
parents: [{id:customer.googleDriveFolder}]
},
media: {
mimeType: file.mimeType,
body: file.buffer
},
auth: authClient
}, function(err, response) {
debug('error:', err, 'inserted:', response.id);
if (!err) {
insertPermission(response.id,customer.email,"user","writer",authClient,function (err,resp){
callback(null, resp);
});
}
});
});
};
请注意,我使用JWT进行私钥式身份验证,并使用服务帐户:
exports.authorize = function(callback) {
if (_tokens && ((_tokens.expiry_date - (new Date()).getTime())>100 )) callback(null, _authClient);
else {
var scope = ['https://www.googleapis.com/auth/drive', 'https://www.googleapis.com/auth/drive.appdata', 'https://www.googleapis.com/auth/drive.apps.readonly',
'https://www.googleapis.com/auth/drive.file','https://www.googleapis.com/auth/drive.metadata',
'https://www.googleapis.com/auth/drive.metadata.readonly',
'https://www.googleapis.com/auth/drive.readonly',
'https://www.googleapis.com/auth/drive.scripts'];
var authClient = new google.auth.JWT(
'<myServiceAccountClientId - xxx@developer.gserviceaccount.com>',
'<path to key>.pem',
''); //seems we could use an user to impersonate requests, i need to test that..
authClient.authorize(function(err, tokens) {
if (err) {
callback(err);
return;
}
callback(null,authClient);
});
}
};
答案 3 :(得分:0)
您可以使用API查看上传的文件。使用以下URL查看所有文件。
https://drive.google.com/folderview?id=XXX
其中XXX =使用API创建的文件夹ID。调试代码以获取文件夹ID,
但是要在上面的链接上工作,你必须在创建任何文件夹或文件后提供权限,如下所示:
Permission newPermission = new Permission();
newPermission.Value = "youremail@gmail.com";
newPermission.Type = "anyone";
newPermission.Role = "reader";
_service.Permissions.Insert(newPermission, NewDirectory.Id).Execute();
查看用户界面的替代链接:https://drive.google.com/drive/folders/XXX