无需用户确认即可将文件发送到GCS的最佳方式

时间:2017-11-21 00:41:42

标签: google-cloud-platform google-cloud-storage

我正在开发一个需要将文件发送到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。 只有此应用程序的用户才能上传(该应用程序具有数据库认证),因此,匿名用户无法执行此操作。

我的问题是:

  • 此令牌将过期?我使用serviceaccount生成此令牌。
  • 有一个更好的api javascript来做它?
  • 这种安全解决方案更好,或者我应该采用不同的方法?

1 个答案:

答案 0 :(得分:1)

向不受信任的最终用户发送刷新或访问令牌非常危险。访问令牌的承载者具有充当权限以充当关联帐户(在用于生成它的范围内),直到访问令牌在几分钟后到期。你不想这样做。

有一些很好的选择。最简单的方法是准确创建所需的上载请求,然后使用服务帐户的私钥对该请求的URL进行签名。该签名URL有效几分钟,然后可用于上传单个对象。在将其提供给客户之前,您需要在服务器端签署URL。以下是有关已签名网址的文档:https://cloud.google.com/storage/docs/access-control/signed-urls

相关问题