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

Posted

技术标签:

【中文标题】客户端无权发出此请求 - 在尝试通过 java 获取 google cloud sql 实例时【英文标题】:The client is not authorized to make this request -- while trying to get google cloud sql instance by java 【发布时间】:2014-07-21 10:35:24 【问题描述】:

我想通过使用谷歌云服务帐户获取谷歌云 Sql 实例的详细信息。我创建了一个启用计费的服务帐户。通过使用 Java 代码中的这个服务帐户,我已经成功地完成了谷歌云存储功能,如桶创建、桶删除等。但是,当我尝试获取 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代码sn-p:

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;

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

注意:我已将该服务帐户添加为权限选项卡中的成员,并将此帐户授予 CAN EDIT 权限

【问题讨论】:

【参考方案1】:

通过替换 instance id 值解决了这个问题。

从 GCS 控制台我得到了实例 ID 作为 project-id:instance-name。 我将 project-id:instance-name 的整个部分作为实例 id,这就是我收到上述错误的原因

经过一些试验,我发现我需要在此处将 instance-name 作为 instanceId

get get = cloudSql.instances().get(projectId, instanceId);

这解决了我的问题。

【讨论】:

以上是关于客户端无权发出此请求 - 在尝试通过 java 获取 google cloud sql 实例时的主要内容,如果未能解决你的问题,请参考以下文章

MailChimp API 3.0:尝试创建列表时状态 403“用户无权访问请求的操作”

获取向 Rails 服务器发出请求的 API

如何使用 SOCKS 代理通过 aiohttp 发出请求?

客户端无权作为此发件人发送(office 365,grails)

Python - 使用 Python 3 urllib 发出 POST 请求

AWS 用户无权通过显式拒绝访问此资源