【问题标题】:Google cloud storage: The caller does not have permission谷歌云存储:调用者没有权限
【发布时间】:2016-10-19 04:20:53
【问题描述】:

我正在尝试使用服务帐户和 API 轮换密钥以访问 GCS 存储桶。我已经为我的服务帐户启用了所有角色,但我仍然收到如下错误。

{
  "code" : 403,
  "errors" : [ {
    "domain" : "global",
    "message" : "The caller does not have permission",
    "reason" : "forbidden"
  } ],
  "message" : "The caller does not have permission",
  "status" : "PERMISSION_DENIED"
}

这是我的代码:

public static void main(String[] args) {

        HttpTransport transport;
        try {
            transport = GoogleNetHttpTransport.newTrustedTransport();

        JsonFactory jsonFactory = new JacksonFactory();

        Iam iam = new Iam(transport,jsonFactory,new HttpRequestInitializer() {
            public void initialize(HttpRequest httpRequest) {
                httpRequest.setConnectTimeout(0);
                httpRequest.setReadTimeout(0);
            }
        });

        CreateServiceAccountKeyRequest createServiceAccountKeyRequest = new CreateServiceAccountKeyRequest();

        Create create = iam.projects().serviceAccounts().keys().create("projects/mysampleproject/serviceAccounts/myserviceaccount@newsampleproject-123465.iam.gserviceaccount.com", createServiceAccountKeyRequest);
        create.setKey("AIzaSyC_YlBg_UXEFgdsspbGLvyb-THrTCbbZA");
        ServiceAccountKey serviceAccountKey =create.execute();
        System.out.println(serviceAccountKey.getPrivateKeyData());
        } catch (GeneralSecurityException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

我从同一个post 尝试过。请任何人都可以建议我哪里错了或如何以正确的方式实现它?

【问题讨论】:

  • 您使用哪个帐户来运行此代码,您自己的帐户还是服务帐户?该帐户是否有权创建服务帐户密钥?权限的名称是 iam.serviceAccountKeys.create。
  • 您使用的服务帐号密钥无效或可能来自其他项目。
  • 您在问题中得到的403,是响应您创建服务帐户的请求还是响应使用您的服务帐户的后续请求已经获得了上面的代码?如果是前者,用于请求新服务的帐户是否具有 Brandon 建议的iam.serviceAccountKeys.create 权限?最后,您之前的评论缺少一些上下文,似乎是一条错误消息。您在尝试创建或使用服务帐户时是否收到此消息?
  • 我认为无法从 main 方法运行代码。这里 HttpRequestInitializer 对象不会有授权数据。尝试像 Iam iam = new Iam(transport, jsonFactory, credential);其中 credential 是 OAuth 凭证。

标签: java rotation google-cloud-storage service-accounts


【解决方案1】:

“mysampleproject”需要匹配“newsampleproject-123465.iam.gserviceaccount.com”中的“newsampleproject-123465”

还值得尝试使用 Google 应用程序默认凭据

     HttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport();    
     JsonFactory jsonFactory = JacksonFactory.getDefaultInstance();

     // Authenticate using Google Application Default Credentials.
     GoogleCredential c= GoogleCredential.getApplicationDefault();

     Iam iam = new Iam(httpTransport, jsonFactory, credential);

【讨论】:

    猜你喜欢
    • 2023-03-08
    • 1970-01-01
    • 2018-12-09
    • 1970-01-01
    • 2018-08-17
    • 1970-01-01
    • 2020-12-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多