[英]Uploading files to Google Cloud Storage using JSON API, Error 401 Unauthorized
我试图弄清楚如何在Android中使用JSON API
将图像上传到Google Cloud Storage
但这样做的文档似乎非常有限。
我相信的问题是获得正确的API密钥身份验证。 上传的图像是公开的图像,但只对我的应用程序的用户公开,因此阅读授权请求文档说我不需要为公共数据提供OAuth密钥,我只需发送一个API密钥
公共API访问:不提供OAuth 2.0令牌的请求必须发送API密钥。 密钥标识您的项目并提供API访问权限,配额和报告。
所以我去我的控制台从我的调试和生产密钥库的SHA1
创建了一个密钥(API Manager/Credentials/Create Credentials/API Key)
。
这些API密钥是正确的,因为它们与谷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");
但我得到Error 401 Unauthorized
所以我假设它是我发送的密钥的问题。
我还在Authorize Requests
文档的末尾看到它声明我可以将我的密钥作为请求URL的参数
拥有API密钥后,您的应用程序可以将查询参数key = yourAPIKey附加到所有请求URL。
所以我不知道我是否想要这样做或者在请求中设置了Authorization
属性,还是两者都设置了?
关键是我创建了错误类型的密钥,或者我在这里缺少什么?
在查看@jterrace建议的签名URL时,我发现由于我需要一个可恢复的URL,我可以在没有客户端身份验证的情况下使用它
如果您的用户仅将资源(写入)上传到访问控制的存储桶,则可以使用Google云端存储的可恢复上传功能,并避免签名网址或要求使用Google帐户。 在可恢复的上传方案中,您的(服务器端)代码会对Google Cloud Storage进行身份验证并启动上传,而无需实际上传任何数据。 启动请求返回会话URI,然后可以在客户端请求中使用该URI来上载数据。 客户端请求不需要签名,因为会话URI实际上充当身份验证令牌。
所以我做的是让我的App Engine
后端创建可恢复的URL,然后将其传递给我的客户端,我在后端获取auth令牌
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());
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.