我在Android应用中使用Google云端存储,如下所示:
private static Storage buildService() throws IOException, GeneralSecurityException {
HttpTransport transport = new com.google.api.client.http.javanet.NetHttpTransport();
JsonFactory jsonFactory = new JacksonFactory();
GoogleCredential credential = new GoogleCredential().setAccessToken("***");
if (credential.createScopedRequired()) {
Collection<String> scopes = StorageScopes.all();
credential = credential.createScoped(scopes);
}
return new Storage.Builder(transport, jsonFactory, credential)
.setApplicationName("Sup GCS")
.build();
}
我收到以下错误:
06-02 18:17:51.891 26468-26570/com.sup.sup W/System.err: com.google.api.client.googleapis.json.GoogleJsonResponseException: 401 Unauthorized
06-02 18:17:51.891 26468-26570/com.sup.sup W/System.err: {
06-02 18:17:51.891 26468-26570/com.sup.sup W/System.err: "code" : 401,
06-02 18:17:51.891 26468-26570/com.sup.sup W/System.err: "errors" : [ {
06-02 18:17:51.891 26468-26570/com.sup.sup W/System.err: "domain" : "global",
06-02 18:17:51.891 26468-26570/com.sup.sup W/System.err: "location" : "Authorization",
06-02 18:17:51.891 26468-26570/com.sup.sup W/System.err: "locationType" : "header",
06-02 18:17:51.891 26468-26570/com.sup.sup W/System.err: "message" : "Invalid Credentials",
06-02 18:17:51.891 26468-26570/com.sup.sup W/System.err: "reason" : "authError"
06-02 18:17:51.891 26468-26570/com.sup.sup W/System.err: } ],
06-02 18:17:51.891 26468-26570/com.sup.sup W/System.err: "message" : "Invalid Credentials"
06-02 18:17:51.891 26468-26570/com.sup.sup W/System.err: }
我不知道在哪里可以找到accessToken和Google云端存储客户端API的文档几乎没有任何帮助。目前我传递给setAccessToken
方法的是 Android密钥(由我在开发者控制台上找到的Google服务 API密钥自动创建。
我一直都知道这不是正确的,但这是我唯一的凭证。
我作为accessToken
发送什么内容?
修改 仅仅为了记录,我按照步骤创建了服务帐户密钥,因为该网站说明了我对GCS的需求。然后我下载了生成的JSON文件。但我不知道如何使用它来验证我的Android应用程序。我不使用任何用户数据,但需要将GCS用于我应用的自有数据,这意味着我需要服务帐户。
答案 0 :(得分:0)
好的,我找不到我的accessToken
,但我发现了一种解决方法,无需使用accessToken
进行身份验证。我创建了一个服务帐户密钥(如问题的第一次编辑中所述),并将JSON文件下载到我的计算机上。当然,我不能直接使用这个文件,因为它必须也在我的Android手机的文件系统上。所以这是我对该文件进行身份验证的方式:
首先我拿了那个JSON文件并将内容复制到String
:(我已经审查过了我认为必要的信息)
private static String credential_json = "{\n" +
" \"type\": \"service_account\",\n" +
" \"project_id\": \"***\",\n" +
" \"private_key_id\": \"***\",\n" +
" \"private_key\": \"***\",\n" +
" \"client_email\": \"***@***.iam.gserviceaccount.com\",\n" +
" \"client_id\": \"***\",\n" +
" \"auth_uri\": \"https://accounts.google.com/o/oauth2/auth\",\n" +
" \"token_uri\": \"https://accounts.google.com/o/oauth2/token\",\n" +
" \"auth_provider_x509_cert_url\": \"https://www.googleapis.com/oauth2/v1/certs\",\n" +
" \"client_x509_cert_url\": \"https://www.googleapis.com/robot/v1/metadata/x509/***%40***.iam.gserviceaccount.com\"\n" +
"}";
接下来,我将此credential_json
字符串转换为流,并从此流中创建了GoogleCredential
。对Google而言,这与从文件中读取一样好:
GoogleCredential credential = GoogleCredential.fromStream(new ByteArrayInputStream(credential_json.getBytes("UTF_8")));