【问题标题】:Uploading files to Google Cloud Storage using JSON API, Error 401 Unauthorized使用 JSON API 将文件上传到 Google Cloud Storage,错误 401 Unauthorized
【发布时间】:2016-02-24 20:39:05
【问题描述】:

我正在尝试弄清楚如何在 Android 中使用 JSON API 将图像上传到 Google Cloud Storage,但这样做的文档似乎非常有限。

我认为我遇到的问题是获得正确的 API 密钥身份验证。上传的图像被认为是公开的,但只对我的应用程序的用户公开,所以阅读Authorize Requests 文档说我不需要为公共数据提供 OAuth 密钥,我可以发送一个 API 密钥

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

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

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

当我尝试提出开始可恢复上传的请求时,我会这样做

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");

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

我还在Authorize Requests 文档的末尾看到它声明我可以将我的密钥作为请求 url 的参数

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

所以我不知道我是否应该这样做或在请求中设置Authorization 属性或两者兼而有之?

那么是我创建的密钥类型错误还是我在这里遗漏了什么?

【问题讨论】:

  • 您可以使用 API 密钥下载公共对象。但除非您的存储桶启用了公共写入(您可能不想这样做),否则您仍然需要使用 OAuth 上传到存储桶。
  • 我的应用程序应该允许用户无需登录即可公开查看/存储图像。他们根据我的应用程序生成的密钥(该密钥)对某些图像的访问权限有限然后与其他用户共享),任何拥有该密钥的人都可以查看与该密钥关联的图像。 @jterrace 所以你是说用户在没有登录的情况下就没有对存储桶的读/写权限?
  • 你可能想使用Signed URLs
  • 当然。我会将其添加为其他人查看的答案。

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


【解决方案1】:

您可以使用 API 密钥下载公共对象。

但除非您的存储桶启用了公开写入功能(您通常不希望这样做),否则您仍然需要使用身份验证来上传到存储桶。

就你而言,我想你可能想使用Signed URLs

【讨论】:

  • 我最终做的是让 App Engine 后端创建一个可恢复的 url,因为这是我需要的,然后将该 url 传递给客户端。该网址充当身份验证令牌
【解决方案2】:

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

如果您的用户只是将资源(写入)上传到 访问控制存储桶,您可以使用可恢复上传 Google Cloud Storage 的功能,并避免签署 URL 或 需要 Google 帐户。在可恢复上传场景中,您的 (服务器端)代码进行身份验证并开始上传到 Google 云存储,无需实际上传任何数据。启蒙 请求返回一个会话 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());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-13
    • 1970-01-01
    • 2016-01-08
    • 2018-10-31
    • 1970-01-01
    • 2014-11-20
    • 2018-12-23
    • 1970-01-01
    相关资源
    最近更新 更多