客户端无权提出此请求 - 同时尝试通过java获取google cloud sql实例

时间:2014-07-21 10:35:24

标签: google-cloud-sql

我想通过使用Google云服务帐户获取Google Cloud Sql实例的详细信息。我创建了一个支持计费的服务帐户。通过使用java代码中的此服务帐户,我已成功完成了Google云端存储功能,例如存储桶创建,存储桶删除等。但是当我试图获得GCS Sql功能时,我收到以下错误:

{
   "code" : 403,
   "errors" : [ {
        "domain" : "global",
        "message" : "The client is not authorized to make this request.",
        "reason" : "notAuthorized"
   } ],
   "message" : "The client is not authorized to make this request."
}

以下是我的java代码片段:

private SQLAdmin authorizeSqlAdmin() throws Exception {

    if (cloudSqlAdmin == null) {

        HttpTransport httpTransport = new NetHttpTransport();
        JsonFactory jsonFactory = new JacksonFactory();

        List<String> scopes = new ArrayList<String>();
        scopes.add(SQLAdminScopes.CLOUD_PLATFORM);
        scopes.add(SQLAdminScopes.SQLSERVICE_ADMIN);
        String propertiesFileName = "/cloudstorage.properties";
        Properties cloudStorageProperties = null;
        try {
            cloudStorageProperties = Utilities.getProperties(propertiesFileName);
        } catch (Exception e) {
            logger.error(e.getMessage(), e);
            return null;
        }

        Credential credential = new GoogleCredential.Builder()
                .setTransport(httpTransport)
                .setJsonFactory(jsonFactory)
                .setServiceAccountId(
                        cloudStorageProperties.getProperty(ACCOUNT_ID_PROPERTY)
                )
                .setServiceAccountPrivateKeyFromP12File(
                        new File(cloudStorageProperties.getProperty(PRIVATE_KEY_PATH_PROPERTY))
                )
                .setServiceAccountScopes(scopes).build();

        cloudSqlAdmin = new SQLAdmin.Builder(httpTransport, jsonFactory, credential)
                .setApplicationName(
                        cloudStorageProperties.getProperty(APPLICATION_NAME_PROPERTY)
                )
                .build();
    }

    return cloudSqlAdmin;
}

public DatabaseInstance getInstanceByInstanceId(String projectId, String instanceId) throws Exception {
    SQLAdmin cloudSql = authorizeSqlAdmin();
    Get get = cloudSql.instances().get(projectId, instanceId);
    DatabaseInstance dbInstance = get.execute();
    return dbInstance;
}

我在这里缺少什么? 有人请帮助我。

N.B:我已将该服务帐户添加为权限标签中的成员,并将此帐户设为 CAN EDIT 权限

1 个答案:

答案 0 :(得分:1)

通过替换实例ID 值解决了此问题。

在GCS控制台中,我将实例ID作为 project-id:instance-name 。 我把 project-id:instance-name 的全部内容作为实例ID,这也就是我遇到上述错误的原因

经过一些试验后,我发现我需要在此处 instanceId instanceId

  

获取get = cloudSql.instances()。get(projectId,instanceId);

这解决了我的问题。