使用JSON API将文件上传到Google Cloud Storage,错误401未经授权

tyc*_*czj 5 android google-cloud-storage google-cloud-platform

我试图弄清楚如何使用JSON APIAndroid中的上载图像,Google Cloud Storage但是这样做的文档似乎非常有限。

我相信我遇到的问题是获得正确的API密钥身份验证。上传的图像是被视为公开但仅对我的应用程序用户公开的图像,因此阅读“ 授权请求”文档说,我不需要为公开数据提供OAuth密钥,而只需发送API密钥即可

公用API访问:不提供OAuth 2.0令牌的请求必须发送API密钥。该密钥标识您的项目,并提供API访问,配额和报告。

所以我进入控制台,(API Manager/Credentials/Create Credentials/API Key)从我SHA1的调试和生产密钥库中创建了一个密钥。

这些API密钥是正确的,因为它们可以与其他Google服务(例如)一起使用,google sign-in并且可以正常工作。

当我尝试请求开始可恢复上传时,这就是我要做的

String sUrl = "https://www.googleapis.com/upload/storage/v1/b/myBucket/o?uploadType=resumable&name="+mImgName;
URL url = new URL(sUrl);
HttpURLConnection urlConnection = (HttpURLConnection)url.openConnection();
urlConnection.setRequestProperty("Authorization","AIzaSyDT....");
urlConnection.setRequestProperty("X-Upload-Content-Type","image/png");
urlConnection.setRequestProperty("X-Upload-Content-Length",String.valueOf(fileSize));
urlConnection.setRequestMethod("POST");
Run Code Online (Sandbox Code Playgroud)

但是我回来了,Error 401 Unauthorized所以我假设我发送的密钥有问题。

我还在Authorize Requests文档末尾看到它指出可以将我的密钥作为请求URL的参数。

拥有API密钥后,您的应用程序可以将查询参数key = yourAPIKey附加到所有请求URL。

所以我不知道我是否应该这样做或Authorization在请求中设置属性还是同时在两者中设置?

那么我创建的密钥类型错误吗?或者我在这里缺少什么?

tyc*_*czj 0

当查找 @jterrace 建议的签名 URL 时,我发现由于我需要一个可恢复的 url,所以我可以在没有客户端身份验证的情况下使用它

如果您的用户仅将资源上传(写入)到访问控制的存储桶,您可以使用 Google Cloud Storage 的可断点上传功能,并避免签署 URL 或需要 Google 帐户。在可恢复上传场景中,您的(服务器端)代码会进行身份验证并启动到 Google Cloud Storage 的上传,而无需实际上传任何数据。发起请求返回一个会话 URI,然后可以在客户端请求中使用该 URI 来上传数据。客户端请求不需要签名,因为会话 URI 实际上充当身份验证令牌。

所以我所做的就是让我的App Engine后端创建可恢复的 url,然后将其传递给我的客户端,然后我用这个在后端获取身份验证令牌

List<String> scopes = new ArrayList<>();
scopes.add("https://www.googleapis.com/auth/devstorage.full_control");
AppIdentityService appIdentity = AppIdentityServiceFactory.getAppIdentityService();
AppIdentityService.GetAccessTokenResult accessToken = appIdentity.getAccessToken(scopes); 
urlConnection.setRequestProperty("Authorization","Bearer "+accessToken.getAccessToken());
Run Code Online (Sandbox Code Playgroud)