我正在尝试通过在网络浏览器中运行的Javascript访问Google云端存储桶中的内容。到目前为止,我已使用服务帐户凭据在服务器上创建了签名URL,并在REST调用期间将它们传递给客户端。我这样做的唯一原因是因为我之前试图解决这个问题,然后放弃并选择了签名的网址。现在我需要让它工作。
到目前为止,我已尝试使用服务帐户凭据在服务器上创建访问令牌,如下所示:
credential = GoogleCredential.fromStream(this.getClass().getResourceAsStream("/serviceaccount.json"));
LinkedList<String> list = new LinkedList<String>();
list.add("https://www.googleapis.com/auth/devstorage.read_only");
credential = credential.createScoped(list);
credential.refreshToken();
然后我将“access_token”返回表单credential.getAccessToken()传递给客户端,并在XmlHttpRequest中使用它,如下所示:
var xhr = new XMLHttpRequest();
xhr.open('GET', "https://storage.googleapis.com/....." true);
xhr.responseType = 'arraybuffer';
xhr.setRequestHeader('Authorization', 'Bearer ' + access_token);
这会导致chrome产生以下错误。
“对预检请求的响应未通过访问控制检查:请求的资源上没有'Access-Control-Allow-Origin'标头。”
斗上的人物是
[{“maxAgeSeconds”:3600,“method”:[“GET”,“HEAD”,“DELETE”],“origin”:[“http://www.voxxlr.com”],“responseHeader”:[“O rigin“,”Content-Type“,”Content-Length“]},{”maxAgeSeconds“:3600,”method“:[”GET“,”HEAD“,”DELETE“],”origin“:[”http ://voxxlr.com“],”responseHeader“:[”Origin“,”Content-Type“,”Content-Length“]}]
接下来,我尝试使用API密钥,如下所示:
var xhr = new XMLHttpRequest();
xhr.open('GET', "https://storage.googleapis.com/....?KEY=...." true);
xhr.responseType = 'arraybuffer';
这产生了以下错误:
存取遭拒 匿名用户没有对voxxlr / 1511465797269 / n.bin的storage.objects.get访问权限。
API密钥不应该像这样提供访问权限吗?我并不是真的在寻找包含google / javascript客户端的解决方案,因为所需的唯一操作也是读取存储桶内容。不需要管理员或删除功能。我基本上只是在寻找一个解决方案,其中来自我的域的所有html / javascript都可以读取存储桶。
任何帮助都会受到赞赏......这已经耗费了大量时间,但似乎应该有一个简单的解决方案。