Google cloud dataflow 如何在数据流中创建引用服务帐户json文件的GoogleCredential对象?

Google cloud dataflow 如何在数据流中创建引用服务帐户json文件的GoogleCredential对象?,google-cloud-dataflow,google-admin-sdk,apache-beam,Google Cloud Dataflow,Google Admin Sdk,Apache Beam,我已经编写了一个管道,通过引用下面的代码读取client_secret.json文件来提取G套件活动日志 InputStream in = new FileInputStream("D://mypath/client_secret.json"); GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); 管道在本地(runner=DirectRun

我已经编写了一个管道,通过引用下面的代码读取client_secret.json文件来提取G套件活动日志

InputStream in = new FileInputStream("D://mypath/client_secret.json");
GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in));
管道在本地(runner=DirectRunner)中按预期运行,但在云(runner=DataflowRunner)上执行时,相同的代码会因java.io.FileNotFoundException预期而失败

我知道本地路径在云上执行时无效。有什么建议吗

更新:

我已经修改了下面的代码,并且能够读取client_secrets.json文件

    InputStream in =
    Activities.class.getResourceAsStream("client_secret.json");
实际问题在于创建凭证对象

private static   java.io.File DATA_STORE_DIR = new java.io.File(System.getProperty("user.home"),
         ".credentials/admin-reports_v1-java-quickstart");
private static final List<String> SCOPES = Arrays.asList(ReportsScopes.ADMIN_REPORTS_AUDIT_READONLY);

static {
    try {
        HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
        DATA_STORE_FACTORY = new FileDataStoreFactory(DATA_STORE_DIR);
    } catch (Throwable t) {
        t.printStackTrace();
        System.exit(1);
    }
}

public static Credential authorize() throws IOException {
    // Load client secrets.
    InputStream in =
    Activities.class.getResourceAsStream("client_secret.json");

    GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in));

    // Build flow and trigger user authorization request.
    GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(HTTP_TRANSPORT, JSON_FACTORY,
            clientSecrets, SCOPES).setDataStoreFactory(DATA_STORE_FACTORY).setAccessType("offline").build();
    Credential credential = new AuthorizationCodeInstalledApp(flow, new LocalServerReceiver()).authorize("user");
    System.out.println("Credentials saved to " + DATA_STORE_DIR.getAbsolutePath());
    return credential;
}
private static java.io.File DATA\u STORE\u DIR=new java.io.File(System.getProperty(“user.home”),
“.credentials/admin-reports_v1-java-quickstart”);
私有静态最终列表作用域=Arrays.asList(ReportsScopes.ADMIN\u REPORTS\u AUDIT\u READONLY);
静止的{
试一试{
HTTP_TRANSPORT=GoogleNetHttpTransport.newTrustedTransport();
DATA\u STORE\u FACTORY=新文件datastorefactory(DATA\u STORE\u DIR);
}捕获(可丢弃的t){
t、 printStackTrace();
系统出口(1);
}
}
公共静态凭据授权()引发IOException{
//加载客户端机密。
输入流输入=
Activities.class.getResourceAsStream(“client_secret.json”);
GoogleClientSecrets clientSecrets=GoogleClientSecrets.load(JSON_工厂,新的InputStreamReader(in));
//生成流并触发用户授权请求。
GoogleAuthorizationCodeFlow=新的GoogleAuthorizationCodeFlow.Builder(HTTP_传输,JSON_工厂,
setDataStoreFactory(DATA_STORE_FACTORY).setAccessType(“脱机”).build();
Credential Credential=new AuthorizationCodeInstalledApp(流,new LocalServerReceiver())。授权(“用户”);
System.out.println(“凭证保存到”+DATA\u STORE\u DIR.getAbsolutePath());
返回凭证;
}
观察结果:

本地执行:

  • 在初始执行时,程序尝试打开浏览器以授权请求,并将经过身份验证的对象存储在文件“StoredCredential”中
  • 在进一步执行时,存储的文件用于进行API调用 在云上运行(DataFlowRunner):

  • 当我检查日志时,数据流尝试打开浏览器来验证请求,并在那里停止
  • 我需要什么?


    如何修改GoogleAuthorizationCodeFlow.Builder,以便在作为数据流管道运行时可以创建凭据对象?

    是否可以尝试在本地多次运行该程序。我想知道的是,如果“StoredCredential”文件可用,它会工作吗?还是会再次尝试加载浏览器


    如果是这样,您能否确定存储该文件的正确位置,并将其从GCS下载到Dataflow worker上?应该有API来下载与dataflow SDK jar捆绑在一起的GCS文件。因此,您应该能够使用这些来下载凭证文件。

    您可以尝试在本地多次运行该程序吗。我想知道的是,如果“StoredCredential”文件可用,它会工作吗?还是会再次尝试加载浏览器


    如果是这样,您能否确定存储该文件的正确位置,并将其从GCS下载到Dataflow worker上?应该有API来下载与dataflow SDK jar捆绑在一起的GCS文件。因此,您应该能够使用这些来下载凭据文件。

    我找到了一个解决方案,可以使用服务帐户创建GoogleCredential对象。下面是它的代码

        public static Credential authorize() throws IOException, GeneralSecurityException {
    
            String emailAddress = "service_account.iam.gserviceaccount.com";
            GoogleCredential credential = new GoogleCredential.Builder()
                    .setTransport(HTTP_TRANSPORT)
                    .setJsonFactory(JSON_FACTORY)
                    .setServiceAccountId(emailAddress)
                    .setServiceAccountPrivateKeyFromP12File(Activities.class.getResourceAsStream("MYFILE.p12"))
                    .setServiceAccountScopes(Collections.singleton(ReportsScopes.ADMIN_REPORTS_AUDIT_READONLY))
                    .setServiceAccountUser("USER_NAME")
                    .build();
    
            return credential;
        }
    

    我找到了一个使用服务帐户创建GoogleCredential对象的解决方案。下面是它的代码

        public static Credential authorize() throws IOException, GeneralSecurityException {
    
            String emailAddress = "service_account.iam.gserviceaccount.com";
            GoogleCredential credential = new GoogleCredential.Builder()
                    .setTransport(HTTP_TRANSPORT)
                    .setJsonFactory(JSON_FACTORY)
                    .setServiceAccountId(emailAddress)
                    .setServiceAccountPrivateKeyFromP12File(Activities.class.getResourceAsStream("MYFILE.p12"))
                    .setServiceAccountScopes(Collections.singleton(ReportsScopes.ADMIN_REPORTS_AUDIT_READONLY))
                    .setServiceAccountUser("USER_NAME")
                    .build();
    
            return credential;
        }
    

    “你期望的结果是什么?”noogui更新了我的帖子。请看一看。你期望的结果是什么?@noogui更新了我的帖子。请看一看。试图找到一个正确的位置存放“StoredCredential”文件,但失败。最后,找到了一种使用服务帐户创建凭证对象的方法,该方法现在可以使用了。将解决方案作为答案发布。试图找到一个合适的位置来存放“StoredCredential”文件,但失败。最后,找到了一种使用服务帐户创建凭证对象的方法,该方法现在可以使用了。将解决方案作为答案发布。