我正在开发一个需要将文件发送到Google云端存储的应用程序。
webapp将有一个HTML页面,用户可以选择要上传的文件。
用户没有Google帐户。
要发送的金额为5或更少。
我不想将文件发送到GAE和GAE发送给GCS。我希望我的用户直接上传到GCS。
我为上传做了这段代码:
function sentStorage() {
var file = document.getElementById("myFile").files[0];
url = 'https://www.googleapis.com/upload/storage/v1/b/XXX/o?uploadType=resumable&name=' + file.name;
xhr = new XMLHttpRequest();
var token = 'ya29.XXXXXXXXXXXXXXX';
xhr.open('POST', url);
xhr.setRequestHeader('Content-Type', file.type);
// resumable
//url = 'https://www.googleapis.com/upload/storage/v1/b/XXXXXX/o?uploadType=resumable&name=' + file.name;
//xhr.setRequestHeader('Content-Type', 'application/json; charset=UTF-8');
//xhr.setRequestHeader('Content-Length', file.size);
xhr.setRequestHeader('x-goog-project-id', 'XXXXXXXXXX');
xhr.setRequestHeader('Authorization', 'Bearer ' + token);
xhr.send(file);
xhr.onreadystatechange = function () {
if (xhr.readyState === 4) {
var response = JSON.parse(xhr.responseText);
if (xhr.status === 200) {
alert('codigo 200');
} else {
var message = 'Error: ' + response.error.message;
console.log(message);
alert(message);
}
}
};
}
我获得了一个serviceaccount信息(Google控制台)并为其生成令牌承载。我使用了一个读取“json帐户信息”的python文件并生成令牌。
我的要求是,用户无需为发送文件确认任何Google帐户信息,此义务来自我的申请。 (用户没有Google帐户),html页面直接将文件发送给GCS而不发送给GAE或GCE,因此,我需要使用HTML表单或Javascript。我更喜欢Javascript。 只有此应用程序的用户才能上传(该应用程序具有数据库认证),因此,匿名用户无法执行此操作。
我的问题是:
答案 0 :(得分:1)
向不受信任的最终用户发送刷新或访问令牌非常危险。访问令牌的承载者具有充当权限以充当关联帐户(在用于生成它的范围内),直到访问令牌在几分钟后到期。你不想这样做。
有一些很好的选择。最简单的方法是准确创建所需的上载请求,然后使用服务帐户的私钥对该请求的URL进行签名。该签名URL有效几分钟,然后可用于上传单个对象。在将其提供给客户之前,您需要在服务器端签署URL。以下是有关已签名网址的文档:https://cloud.google.com/storage/docs/access-control/signed-urls